Nginxтен Элчи проксиге көчүү

Салам, Хабр! Посттун котормосун назарыңыздарга сунуштайм: Nginxтен Элчи проксиге көчүү.

Элчи – бул жеке кызматтар жана тиркемелер үчүн иштелип чыккан жогорку өндүрүмдүүлүктөгү бөлүштүрүлгөн прокси сервер (C++ тилинде жазылган), ал ошондой эле чоң микросервис “кызмат торунун” архитектуралары үчүн иштелип чыккан байланыш автобусу жана “универсалдуу маалымат учагы”. Аны түзүүдө NGINX, HAProxy, аппараттык жүктү тең салмактоочулар жана булут жүктөмдөрүн баланстоочулар сыяктуу серверлерди иштеп чыгууда пайда болгон көйгөйлөрдү чечүү жолдору эске алынган. Элчи ар бир тиркеме менен бирге иштейт жана платформага карабастан жалпы функцияларды камсыз кылуу үчүн тармакты абстракциялайт. Инфраструктурадагы бардык тейлөө трафиги Envoy тор аркылуу агып өткөндө, ырааттуу байкоо мүмкүнчүлүгү менен көйгөйлүү аймактарды визуализациялоо, жалпы аткарууну тууралоо жана белгилүү бир жерде негизги функцияларды кошуу оңой болот.

мүмкүнчүлүктөр

  • Процесстен тышкаркы архитектура: элчи – бул өзүн-өзү камтыган, RAMдын бир аз көлөмүн ээлеген жогорку өндүрүмдүү сервер. Ал ар кандай тиркеме тили же алкагы менен бирге иштейт.
  • http/2 жана grpc колдоосу: элчи биринчи класстагы http/2 жана grpc кирүүчү жана чыгуучу байланыштарды колдойт. Бул http/1.1ден http/2ге чейин ачык прокси.
  • Өркүндөтүлгөн жүк балансы: элчи автоматтык түрдө кайра аракет кылуу, чынжырды үзүү, глобалдык ылдамдыкты чектөө, суроо-талаптарды көмүскө кылуу, жергиликтүү зонанын жүгүн тең салмактоо ж.
  • Конфигурацияны башкаруу API: элчи конфигурацияңызды динамикалык башкаруу үчүн күчтүү API менен камсыз кылат.
  • Байкоо мүмкүнчүлүгү: L7 трафигинин терең байкалышы, бөлүштүрүлгөн байкоо үчүн жергиликтүү колдоо жана mongodb, dynamodb жана башка көптөгөн тиркемелерди байкоо.

1-кадам — Мисал NGINX Config

Бул скрипт атайын жасалган файлды колдонот nginx.confтолук мисалдын негизинде NGINX Wiki. Сиз ачуу менен редактордо конфигурацияны көрө аласыз nginx.conf

nginx булагы конфигурациясы

user  www www;
pid /var/run/nginx.pid;
worker_processes  2;

events {
  worker_connections   2000;
}

http {
  gzip on;
  gzip_min_length  1100;
  gzip_buffers     4 8k;
  gzip_types       text/plain;

  log_format main      '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';

  log_format download  '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

  server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

    access_log   /var/log/nginx.access_log  main;
    error_log  /var/log/nginx.error_log  info;

    location / {
      proxy_pass         http://targetCluster/;
      proxy_redirect     off;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
    }
  }
}

NGINX конфигурацияларында адатта үч негизги элемент бар:

  1. NGINX серверин конфигурациялоо, журналдын структурасы жана Gzip функционалдуулугу. Бул бардык учурларда дүйнөлүк аныкталат.
  2. Хостко суроо-талаптарды кабыл алуу үчүн NGINX конфигурацияланууда one.example.com 8080 портунда.
  3. Максаттуу жерди орнотуу, URL'дин ар кандай бөлүктөрү үчүн трафикти кантип башкаруу.

Бардык конфигурациялар Envoy проксиге колдонулбайт жана кээ бир орнотууларды конфигурациялоонун кереги жок. Элчи прокси бар төрт негизги түрүNGINX сунуштаган негизги инфраструктураны колдогон. негизги болуп саналат:

  • Угармандар: Алар Envoy Proxy келген суроо-талаптарды кантип кабыл алаарын аныкташат. Envoy Proxy учурда TCP негизиндеги угуучуларды гана колдойт. Байланыш орнотулгандан кийин, ал иштетүү үчүн чыпкалардын жыйындысына өткөрүлөт.
  • Чыпкалар: Алар кирүүчү жана чыгуучу маалыматтарды иштеп чыга турган түтүк архитектурасынын бир бөлүгү. Бул функция Gzip сыяктуу чыпкаларды камтыйт, алар кардарга жөнөтүүдөн мурун маалыматтарды кысып турат.
  • Маршрутизаторлор: Алар трафикти кластер катары аныкталган талап кылынган жерге жөнөтүшөт.
  • Кластерлер: Алар трафик жана конфигурация параметрлери үчүн акыркы чекитти аныктайт.

Биз бул төрт компонентти белгилүү NGINX конфигурациясына дал келүүчү Envoy Proxy конфигурациясын түзүү үчүн колдонобуз. Элчинин максаты - API жана динамикалык конфигурация менен иштөө. Бул учурда, базалык конфигурация NGINX статикалык, катуу коддолгон орнотууларды колдонот.

2-кадам - ​​NGINX конфигурациясы

биринчи бөлүгү nginx.conf конфигурацияланышы керек болгон кээ бир NGINX ички түзүлүштөрүн аныктайт.

Жумушчу байланыштары

Төмөнкү конфигурация жумушчу процесстеринин жана байланыштарынын санын аныктайт. Бул NGINX суроо-талапты канааттандыруу үчүн кандай масштабда болорун көрсөтөт.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy ар кандай жолдор менен иштөө процесстерин жана байланыштарды башкарат.

Элчи системадагы ар бир аппараттык жип үчүн жумушчу жипти түзөт. Ар бир жумушчу жип жооптуу болгон бөгөттөлбөгөн окуя циклин аткарат

  1. Ар бир угуучуну угуу
  2. Жаңы байланыштарды кабыл алуу
  3. Туташуу үчүн чыпкалардын топтомун түзүү
  4. Байланыштын иштөө мөөнөтүнүн ичинде бардык киргизүү/чыгаруу операцияларын иштетиңиз.

Бардык мындан аркы туташууну иштетүү толугу менен жумушчу жипте, анын ичинде ар кандай багыттоо жүрүм-турумунда каралат.

Элчидеги ар бир жумушчу жип үчүн байланыш бассейни бар. Ошентип, HTTP/2 туташуу бассейндери бир эле учурда тышкы хостко бир гана туташууну орнотот, эгерде төрт жумушчу жип бар болсо, туруктуу абалда тышкы хост үчүн төрт HTTP/2 туташуусу болот. Баарын бир жумушчу жипте сактоо менен, дээрлик бардык кодду блокировкасыз жазууга болот, ал бир жип сыяктуу. Зарылдан көбүрөөк жумушчу жиптери бөлүнсө, бул эстутумдун ысырап болушуна, көп сандагы бош туташуулардын пайда болушуна жана байланыштардын бассейнге кайра кайтарылышынын санын кыскартууга алып келиши мүмкүн.

Кошумча маалымат алуу үчүн Элчи прокси блогу.

HTTP конфигурациясы

Төмөнкү NGINX конфигурация блогу HTTP орнотууларын аныктайт, мисалы:

  • Кандай MIME түрлөрү колдоого алынат
  • Демейки таймауттар
  • Gzip конфигурациясы

Бул аспектилерди кийинчерээк талкуулай турган Envoy Proxy'деги чыпкаларды колдонуп ыңгайлаштыра аласыз.

3-кадам - ​​Server Configuration

HTTP конфигурация блогунда NGINX конфигурациясы 8080 портун угууну жана домендерге келген суроо-талаптарга жооп берүүнү белгилейт. one.example.com и www.one.example.com.

 server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

Inside Envoy, аны угуучулар башкарат.

Элчи угуучулар

Envoy Proxy менен баштоонун эң маанилүү аспектиси - бул угуучуларыңызды аныктоо. Сиз Envoy инстанциясын кантип иштеткиңиз келгенин сүрөттөгөн конфигурация файлын түзүшүңүз керек.

Төмөнкү үзүндү жаңы угуучуну түзүп, аны 8080 портуна байланыштырат. Конфигурация Envoy Proxyге келген суроо-талаптар үчүн кайсы портторго байланышы керек экенин айтат.

Envoy Proxy конфигурациялоо үчүн YAML нотасын колдонот. Бул белгиге киришүү үчүн бул жерден караңыз байланыш.

Copy to Editorstatic_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }

Аныктоонун кереги жок сервердин аты, анткени Envoy Proxy чыпкалары муну чечет.

4-кадам - ​​Жайгашкан жерди конфигурациялоо

Сурам NGINXке түшкөндө, жайгашуу блогу трафикти кантип иштетүүнү жана кайда багыттоо керектигин аныктайт. Төмөнкү фрагментте сайтка келген бардык трафик аталган кластерге которулат (котормочунун эскертүүсү: upstream, адатта, колдонмо сервери) аталган кластерге. targetCluster. Агымдагы кластер суроо-талапты иштете турган түйүндөрдү аныктайт. Муну кийинки кадамда талкуулайбыз.

location / {
    proxy_pass         http://targetCluster/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
}

Элчиде, Чыпкалар муну жасайт.

Элчи чыпкалары

Статикалык конфигурация үчүн чыпкалар келип түшкөн суроо-талаптарды кантип иштетүүнү аныктайт. Бул учурда биз дал келген чыпкаларды орнотобуз server_names мурунку кадамда. Белгилүү домендерге жана маршруттарга дал келген суроо-талаптар келгенде, трафик кластерге багытталат. Бул NGINX ылдыйдан өйдө конфигурациясынын эквиваленти.

Copy to Editor    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router

ысым envoy.http_connection_manager Envoy Proxy ичинде орнотулган чыпка болуп саналат. Башка чыпкалар кирет Redis, Соо, TCP. Толук тизмени бул жерден таба аласыз документтер.

Башка жүктөрдү теңдөө саясаттары жөнүндө көбүрөөк маалымат алуу үчүн, баш багыңыз Элчи документация.

5-кадам - ​​Прокси жана Upstream конфигурациясы

NGINXте, агымдагы конфигурация трафикти иштете турган максаттуу серверлердин топтомун аныктайт. Бул учурда, эки кластер дайындалган.

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

Элчиде бул кластерлер тарабынан башкарылат.

Элчилер кластерлери

Жогорку агымдын эквиваленти кластерлер катары аныкталат. Бул учурда трафикти тейлей турган хосттор аныкталды. Хосттарга жетүү жолу, тайм-ауттар сыяктуу, кластер конфигурациясы катары аныкталат. Бул кечигүү жана жүктөөнү тең салмактоо сыяктуу аспектилерди көбүрөөк көзөмөлдөөгө мүмкүндүк берет.

Copy to Editor  clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

Кызматтын ачылышын колдонууда STRICT_DNS Элчи көрсөтүлгөн DNS максаттарын үзгүлтүксүз жана асинхрондуу чечет. DNS натыйжасынан кайтарылган ар бир IP дарек жогорку агымдагы кластерде ачык хост катары каралат. Бул, эгерде сурам эки IP даректи кайтарса, Элчи кластерде эки хост бар деп эсептейт жана экөө тең жүктөө тең салмактуу болушу керек дегенди билдирет. Эгер хост натыйжадан алынып салынса, Элчи ал мындан ары жок деп эсептейт жана учурдагы байланыш бассейндеринен трафикти тартат.

Көбүрөөк маалымат алуу үчүн караңыз Элчи прокси документтери.

6-кадам — Кирүү жана каталар журналы

Акыркы конфигурация каттоо болуп саналат. Ката журналдарын дискке түртүүнүн ордуна, Envoy Proxy булутка негизделген ыкманы колдонот. Бардык тиркеме журналдары чыгарылат stdout и stderr.

Колдонуучулар сурам жасаганда, кирүү журналдары милдеттүү эмес жана демейки боюнча өчүрүлөт. HTTP сурамдары үчүн кирүү журналдарын иштетүү үчүн, конфигурацияны иштетиңиз access_log HTTP байланыш менеджери үчүн. жол сыяктуу түзмөктөр да болушу мүмкүн stdout, же дисктеги файл, талаптарыңызга жараша.

Төмөнкү конфигурация бардык кирүү журналдарын кайра багыттайт stdout (котормочунун эскертүүсү - докердин ичинде элчи колдонуу үчүн stdout талап кылынат. Эгер докерсиз колдонулса, анда /dev/stdout файлын кадимки журнал файлынын жолу менен алмаштырыңыз). Туташуу башкаргычынын конфигурация бөлүмүнө үзүндүнү көчүрүңүз:

Copy to Clipboardaccess_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"

Натыйжалар мындай болушу керек:

      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:

Демейки боюнча, Элчиде HTTP сурамынын чоо-жайын камтыган формат саптары бар:

[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n

Бул формат саптын натыйжасы болуп саналат:

[2018-11-23T04:51:00.281Z] "GET / HTTP/1.1" 200 - 0 58 4 1 "-" "curl/7.47.0" "f21ebd42-6770-4aa5-88d4-e56118165a7d" "one.example.com" "172.18.0.4:80"

Чыгуу мазмунун формат талаасын орнотуу менен ыңгайлаштырса болот. Мисалы:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    format: "[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n"

Журнал сызыгы талааны орнотуу менен JSON форматында да чыгарылышы мүмкүн json_format. Мисалы:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}

Элчилерди каттоо методологиясы жөнүндө көбүрөөк маалымат алуу үчүн, кириңиз

https://www.envoyproxy.io/docs/envoy/latest/configuration/access_log#config-access-log-format-dictionaries

Каттоо элчи прокси менен иштөө боюнча түшүнүк алуунун жалгыз жолу эмес. Анын өнүккөн байкоо жана метрикалык мүмкүнчүлүктөрү бар. Кененирээк бул жерден биле аласыз издөө документтери же аркылуу Интерактивдүү байкоо скрипти.

7-кадам - ​​Ишке киргизүү

Эми конфигурацияңызды NGINXтен Envoy Proxyге көчүрдүңүз. Акыркы кадам - ​​аны сыноо үчүн Envoy Proxy инстанциясын ишке киргизүү.

Колдонуучу катары иштетүү

NGINX конфигурация сызыгынын жогору жагында колдонуучу www www; коопсуздукту жакшыртуу үчүн NGINXти аз артыкчылыктуу колдонуучу катары иштетүүнү белгилейт.

Envoy Proxy процесси кимге таандык экенин башкаруу үчүн булутка негизделген ыкманы колдонот. Контейнер аркылуу Envoy Proxy иштеткенде, биз төмөнкү артыкчылыктуу колдонуучуну көрсөтө алабыз.

Envoy Proxy ишке киргизилүүдө

Төмөнкү буйрук хосттогу Docker контейнери аркылуу Envoy Proxy программасын иштетет. Бул буйрук Envoyго 80-портто кирүүчү суроо-талаптарды угуу мүмкүнчүлүгүн берет. Бирок, угуучу конфигурациясында көрсөтүлгөндөй, Envoy Proxy 8080 портунда кирүүчү трафикти угат. Бул процессти төмөнкү артыкчылыктуу колдонуучу катары иштетүүгө мүмкүндүк берет.

docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy

тестирлөө

Прокси иштеп турганда, сыноолорду эми жасап, иштетсе болот. Төмөнкү cURL буйругу прокси конфигурациясында аныкталган хосттун аталышы менен суроо-талапты чыгарат.

curl -H "Host: one.example.com" localhost -i

HTTP сурамы катага алып келет 503. Себеби жогорудагы байланыштар иштебейт жана жеткиликтүү эмес. Ошондуктан, Элчи Проксиде сурам үчүн жеткиликтүү багыттар жок. Төмөнкү буйрук Envoy үчүн аныкталган конфигурацияга дал келген HTTP кызматтарынын сериясын баштайт.

docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;

Жеткиликтүү кызматтар менен Элчи трафикти көздөгөн жерине ийгиликтүү прокси кыла алат.

curl -H "Host: one.example.com" localhost -i

Кайсы Docker контейнери өтүнүчтү иштеткенин көрсөткөн жоопту көрүшүңүз керек. Envoy Proxy журналдарында сиз кирүү сапынын чыгышын да көрүшүңүз керек.

Кошумча HTTP жооп баштары

Сиз чыныгы суроо-талаптын жооп баштарында кошумча HTTP баштарын көрөсүз. Баш маалымат жогорудагы хосттун суроо-талапты иштетүүгө сарптаган убактысын көрсөтөт. Миллисекунд менен туюнтулган. Бул кардар тармактын кечигүү убактысына салыштырмалуу тейлөө убактысын аныктоону кааласа пайдалуу.

x-envoy-upstream-service-time: 0
server: envoy

Акыркы конфигурация

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router
          clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9090 }

Котормочудан кошумча маалымат

Envoy Proxy орнотуу боюнча нускамаларды веб-сайттан тапса болот https://www.getenvoy.io/

Демейки боюнча, rpm системалык кызматтын конфигурациясына ээ эмес.

Systemd кызмат конфигурациясын кошуңуз /etc/systemd/system/envoy.service:

[Unit]
Description=Envoy Proxy
Documentation=https://www.envoyproxy.io/
After=network-online.target
Requires=envoy-auth-server.service
Wants=nginx.service

[Service]
User=root
Restart=on-failure
ExecStart=/usr/bin/envoy --config-path /etc/envoy/config.yaml
[Install]
WantedBy=multi-user.target

Сиз /etc/envoy/ каталогун түзүп, ошол жерге config.yaml конфигурациясын коюшуңуз керек.

Элчи прокси аркылуу телеграмма чаты бар: https://t.me/envoyproxy_ru

Envoy Proxy статикалык мазмунду тейлөөнү колдобойт. Демек, өзгөчөлүктү ким добуш бере алат: https://github.com/envoyproxy/envoy/issues/378

Сурамжылоого катталган колдонуучулар гана катыша алышат. Кирүү, өтүнөмүн.

Бул пост сизге элчи проксиди орнотууга жана сынап көрүүгө түрткү бердиби?

  • ооба

  • жок

75 колдонуучу добуш берди. 18 колдонуучу добуш берүүдөн баш тартты.

Source: www.habr.com

Комментарий кошуу