Koçberî ji Nginx ber bi Envoy Proxy

Silav Habr! Ez wergereke nivîsê radigihînim we: Koçberî ji Nginx ber bi Envoy Proxy.

Envoy serverek proxy-ya belavkirî ya bi performansa bilind e (bi C++ hatî nivîsandin) ku ji bo karûbar û serîlêdanên kesane hatîye sêwirandin, ew di heman demê de otobusek ragihandinê û "balafira daneya gerdûnî" ye ku ji bo mîmarên mîkro-xizmeta mezin "mesh-karûbar" hatî çêkirin. Dema afirandina wê, çareseriyên pirsgirêkên ku di dema pêşkeftina serverên wekî NGINX, HAProxy, hevsengên barkirina hardware û hevsengên barkirina ewr de derketine holê hatin girtin. Envoy li kêleka her serîlêdanê dixebite û torê vedigire da ku bêyî platformê fonksiyona hevpar peyda bike. Gava ku hemî seyrûsefera karûbarê di binesaziyek de di nav tevna Envoy re diherike, dîtina deverên pirsgirêkê bi çavdêriya domdar re hêsan dibe, performansa giştî xweş bike, û fonksiyona bingehîn li cîhek taybetî lê zêde bike.

Taybetmendiyên

  • Mîmariya derveyî pêvajoyê: envoy serverek xweser, bi performansa bilind e ku mîqdarek piçûk RAM digire. Ew bi her zimanek an çarçoveyek serîlêdanê re dixebite.
  • Piştgiriya http/2 û grpc: şandî ji bo girêdanên ketin û derketinê piştgiriya pola yekem http/2 û grpc heye. Ev ji http/1.1 heta http/2 proxyek zelal e.
  • Balansa Barkirinê ya Pêşketî: nûner piştgirî dide taybetmendiyên pêşkeftî yên hevsengiya barkirinê, di nav de dubarekirina otomatîkî, şikandina zincîrê, sînorkirina rêjeya gerdûnî, siya daxwazê, hevsengkirina barkirina devera herêmî, hwd.
  • API-ya Rêvebiriya Vesazkirinê: envoy ji bo birêvebirina dînamîkî ya veavakirina we API-yek bihêz peyda dike.
  • Çavdêrî: Çavdêriya kûr a seyrûsefera L7, piştgiriya xwecî ji bo şopandina belavbûyî û çavdêriya mongodb, dynamodb û gelek serîlêdanên din.

Gav 1 - Mînak NGINX Config

Ev skrîpt pelek bi taybetî hatî çêkirin bikar tîne nginx.conf, li ser bingeha nimûneya tevahî ji NGINX Wiki. Hûn dikarin bi vekirina veavakirinê di edîtorê de bibînin nginx.conf

konfigurasyona çavkaniya 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;
    }
  }
}

Veavakirinên NGINX bi gelemperî sê hêmanên sereke hene:

  1. Veavakirina servera NGINX, avahiya têketinê û fonksiyona Gzip. Ev di hemî rewşan de li seranserê cîhanê tête diyar kirin.
  2. Veavakirina NGINX ji bo pejirandina daxwazên mêvandar one.example.com li ser porta 8080.
  3. Sazkirina cîhê armancê, meriv çawa seyrûseferê ji bo beşên cûda yên URL-ê birêve dibe.

Hemî veavakirin dê ji bo Envoy Proxy derbas nebe, û hûn ne hewce ne ku hûn hin mîhengan mîheng bikin. Envoy Proxy heye çar cureyên sereke, ku binesaziya bingehîn a ku ji hêla NGINX ve hatî pêşkêş kirin piştgirî dike. Ya bingehîn ev e:

  • Guhdar: Ew diyar dikin ka Envoy Proxy çawa daxwazên gihîştî qebûl dike. Envoy Proxy niha tenê guhdarên TCP-based piştgirî dike. Dema ku têkiliyek hate saz kirin, ew ji bo pêvajoyek berbi komek parzûnan tê derbas kirin.
  • Parzûn: Ew beşek ji mîmariya boriyê ne ku dikarin daneyên hatin û derketinê pêvajoyê bikin. Vê fonksiyonê fîlterên wekî Gzip-ê vedihewîne, ku berî şandina wê ji xerîdar re daneyan berhev dike.
  • Routers: Ew seyrûseferê berbi cîhê pêdivî, ku wekî komek hatî destnîşan kirin, dişînin.
  • Komel: Ew ji bo parametreyên trafîkê û vesazkirinê xala dawiyê diyar dikin.

Em ê van çar hêmanan bikar bînin da ku mîhengek Envoy Proxy biafirînin da ku bi vehengek taybetî ya NGINX-ê re hevber bikin. Armanca Envoy ew e ku bi API û veavakirina dînamîkî re bixebite. Di vê rewşê de, veavakirina bingehîn dê mîhengên statîk, hişk-kodkirî yên ji NGINX bikar bîne.

Gav 2 - Veavakirina NGINX

Beşek yekem nginx.conf hin hundurên NGINX-ê yên ku divê bêne mîheng kirin diyar dike.

Têkiliyên Karker

Veavakirina jêrîn hejmara pêvajoyên karker û girêdan diyar dike. Ev destnîşan dike ka NGINX dê çawa pîvanê bide da ku daxwazê ​​bicîh bîne.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy karûbar û girêdan bi awayên cihêreng îdare dike.

Envoy ji bo her teşeya hardware ya li ser pergalê xêzek karker diafirîne. Her Mijara xebatkar pêlek bûyerek ne-astengker ku berpirsiyar e dimeşîne

  1. Guhdarîkirina her guhdarekî
  2. Qebûlkirina girêdanên nû
  3. Afirandina komek fîlteran ji bo girêdanê
  4. Hemî operasyonên I/O di heyama pêwendiyê de pêvajoyê bikin.

Hemî pêvajoyek pêwendiya pêvek bi tevahî di xêza xebatkar de, tevî her tevgerek şandinê, tê rêve kirin.

Ji bo her xêza karkerê li Envoy, hewzek pêwendiyê heye. Ji ber vê yekê hewzên pêwendiya HTTP/2 tenê yek pêwendiyek ji her mêvandarê biyanî re yek carî saz dikin, heke çar mijarên xebatkar hebin dê di rewşek aram de çar girêdanên HTTP/2 ji her mêvandarê derveyî re hebin. Bi girtina her tiştî di yek mijara xebatkar de, hema hema hemî kod dikare bêyî astengkirinê were nivîsandin, mîna ku ew yek xêz be. Ger ji hewcedariyê bêtir mijarên xebatkar werin veqetandin, ev dikare bibe sedema windabûna bîranînê, afirandina hejmareke mezin ji girêdanên bêkar, û kêmkirina hejmara carên ku girêdan vedigerin hewzê.

Ji bo bêtir agahdarî biçin Envoy Proxy blog.

Veavakirina HTTP

Bloka veavakirina NGINX ya jêrîn mîhengên HTTP-ê wekî:

  • Çi cureyên mimê têne piştgirî kirin
  • Demjimêriyên Bingehîn
  • Veavakirina Gzip

Hûn dikarin van hêmanan bi karanîna fîlterên di Envoy Proxy de, ya ku em ê paşê nîqaş bikin, xweş bikin.

Gav 3 - Veavakirina Server

Di bloka veavakirina HTTP de, veavakirina NGINX diyar dike ku li porta 8080 guhdarî bike û bersivê bide daxwazên hatina domanan. one.example.com и www.one.example.com.

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

Di hundurê Envoy de, ew ji hêla Guhdaran ve tê kontrol kirin.

Guhdarên şandî

Aliyê herî girîng ê destpêkirina bi Envoy Proxy re destnîşankirina guhdarên we ye. Pêdivî ye ku hûn pelek vesazkirinê biafirînin ku diyar dike ka hûn çawa dixwazin mînaka Envoy bimeşînin.

Parçeya jêrîn dê guhdarek nû biafirîne û wê bi porta 8080-ê ve girêbide. Veavakirin ji Envoy Proxy re vedibêje ku divê ew ji bo daxwazên hatinê bi kîjan portan ve girêde.

Envoy Proxy ji bo veavakirina xwe nîşana YAML bikar tîne. Ji bo danasîna vê nîşankirinê, li vir binêre girêdanê.

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

Ne hewce ye ku diyar bike server_name, ji ber ku fîlterên Envoy Proxy dê vê yekê birêve bibin.

Gav 4 - Veavakirina Cihê

Dema ku daxwazek tê nav NGINX, bloka cîhê diyar dike ka meriv çawa pêvajoy dike û li ku derê rêwîtiyê rêve dike. Di beşê jêrîn de, hemî seyrûsefera malperê ji komeke jorîn (têbînîya wergêr: jor bi gelemperî serverek serîlêdanê ye) tê veguheztin. targetCluster. Grûba jorîn girêkên ku divê daxwazê ​​bişopînin diyar dike. Em ê di gava pêş de vê yekê nîqaş bikin.

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

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

Li Envoy, Parzûnan vê yekê dike.

Parzûnên Envoy

Ji bo veavakirinek statîk, fîlter diyar dikin ka meriv çawa daxwazên hatîn pêvajoyê dike. Di vê rewşê de, me fîlterên ku li hev dikin destnîşan dikin server_names di gava berê de. Dema ku daxwazên hatinê digihîjin ku hin doman û rêgezan li hev dikin, seyrûsefer ber bi komê ve tê rêve kirin. Ev hevwateya veavakirina NGINX-a jêr-jor e.

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

nav şandî.http_connection_manager Parzûnek çêkirî ya di Envoy Proxy de ye. Parzûnên din jî hene Redis, mongo, TCP. Hûn dikarin navnîşa tevahî li vir bibînin belgekirin.

Ji bo bêtir agahdarî li ser polîtîkayên din ên hevsengiya barkirinê, biçin Belgekirina nûnerê.

Gav 5 - Veavakirina Proxy û Upstream

Di NGINX de, veavakirina jorîn komek pêşkêşkerên armancê ku dê seyrûseferê pêvajoyê bike diyar dike. Di vê rewşê de, du kom hatin destnîşankirin.

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

Di Envoy de, ev ji hêla koman ve tê rêvebirin.

Komên şandî

Wekheviya jorîn wekî koman tê pênase kirin. Di vê rewşê de, mazûvanên ku dê xizmeta trafîkê bikin hatine destnîşankirin. Awayê gihîştina mazûvanan, mîna dema derbasbûnê, wekî veavakirina komê tê pênase kirin. Ev rê dide kontrolkirina hûrgelê ya li ser aliyên wekî derengbûn û hevsengkirina barkirinê.

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 }}
    ]

Dema ku vedîtina karûbarê bikar tîne STRICT_DNS Envoy dê bi domdarî û asynkronî armancên DNS yên diyarkirî çareser bike. Her navnîşana IP-ya ku ji encama DNS hatî vegerandin dê di koma jorîn de wekî mêvandarek eşkere were hesibandin. Ev tê vê wateyê ku ger daxwazek du navnîşanên IP-ê vegerîne, Envoy dê bihesibîne ku di komê de du mêvandar hene, û divê her du jî hevseng bin. Ger mêvandarek ji encamê were derxistin, Envoy dê bihesibîne ku ew êdî tune ye û dê seyrûseferê ji hewzên pêwendiya heyî bikişîne.

Ji bo bêtir agahdarî binêrin Belgekirina nûnerê nûnerê.

Gav 6 - Têketin û Xeletî

Veavakirina dawîn qeydkirinê ye. Li şûna ku têketinên xeletiyê li dîskê bikişîne, Envoy Proxy nêzîkatiyek li ser ewr digire. Hemî têketinên serîlêdanê têne derxistin stdout и stderr.

Dema ku bikarhêner daxwazek dikin, têketinên gihîştinê vebijarkî ne û ji hêla xwerû ve neçalak in. Ji bo çalakkirina têketinên gihîştinê ji bo daxwazên HTTP, veavakirinê çalak bikin access_log ji bo rêveberê girêdana HTTP. Rê dikare bibe amûrek wekî stdout, an pelek li ser dîskê, li gorî hewcedariyên we ve girêdayî ye.

Veavakirina jêrîn dê hemî têketinên gihîştinê beralî bike stdout (Têbînîya wergêr - stdout ji bo bikaranîna envoy di hundurê dokerê de pêdivî ye. Ger bêyî docker were bikar anîn, wê hingê /dev/stdout bi riya pelê têketinek birêkûpêk veguherîne). Ji bo gerînendeyê pêwendiyê perçeyê li beşa veavakirinê kopî bikin:

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

Divê encam bi vî rengî xuya bikin:

      - 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:

Bi xwerû, Envoy xwedan rêzek formatek e ku hûrguliyên daxwaza HTTP-ê vedihewîne:

[%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

Encama vê rêzika formatê ev e:

[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"

Naveroka encam dikare bi danîna qada formatê ve were xweş kirin. Bo nimûne:

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"

Rêza têketinê jî bi danîna zeviyê dikare di formata JSON de were derxistin json_format. Bo nimûne:

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

Ji bo bêtir agahdarî li ser Rêbaza Qeydkirina Envoyî, biçin

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

Têketin ne awayê yekane ye ku meriv têgihîştina bi Envoy Proxy re bixebite. Ew kapasîteyên şopandin û metrîkên pêşkeftî di nav xwe de çêkiriye. Hûn dikarin li ser bêtir fêr bibin belgeyên şopandinê an jî bi rê ve Nivîsara şopandina înteraktîf.

Gav 7 - Destpêkirin

We niha veavakirina xwe ji NGINX koçî Envoy Proxy kiriye. Gava paşîn ev e ku meriv mînakek Envoy Proxy bide destpêkirin da ku wê ceribandine.

Wekî bikarhêner bixebite

Li serê xeta veavakirina NGINX bikarhêner www www; diyar dike ku NGINX wekî bikarhênerek kêm-îmtiyaz bimeşîne da ku ewlehiyê baştir bike.

Envoy Proxy ji bo birêvebirina ku xwediyê pêvajoyek e, rêgezek ewr-based digire. Dema ku em Envoy Proxy-ê di nav konteynerê de dimeşînin, em dikarin bikarhênerek kêm-îmtiyaz destnîşan bikin.

Destpêkirina Envoy Proxy

Fermana jêrîn dê Envoy Proxy bi navgîniyek Docker-ê ya li ser mêvandar bimeşîne. Ev ferman îmkanê dide Envoy ku li ser porta 80-ê li daxwazên hatinê guhdarî bike. Lêbelê, wekî ku di veavakirina guhdaran de hatî destnîşan kirin, Envoy Proxy li seyrûsefera hatina porta 8080-ê guhdarî dike. Ev dihêle ku pêvajo wekî bikarhênerek kêm-îmtiyaz bimeşîne.

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

Îmtîhanê

Bi xebitandina proxy re, niha ceribandin dikarin bêne çêkirin û pêvajo kirin. Fermana cURL ya jêrîn bi sernavê mêvandar a ku di veavakirina proxy de hatî destnîşan kirin daxwazek derdixe.

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

Daxwaza HTTP dê bibe sedema xeletiyek 503. Ev ji ber ku girêdanên jorîn naxebitin û ne berdest in. Ji ber vê yekê, Envoy Proxy ji bo daxwazê ​​cîhên berdest tune. Fermana jêrîn dê rêzek karûbarên HTTP-ê dest pê bike ku bi veavakirina ku ji bo Envoy hatî destnîşankirin li hev dikin.

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

Bi karûbarên berdest, Envoy dikare bi serfirazî seyrûsefera berbi cîhê xwe veguhezîne.

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

Pêdivî ye ku hûn bersivek bibînin ku destnîşan dike ka kîjan konteynera Docker daxwazê ​​pêvajo kiriye. Di têketinên Envoy Proxy de divê hûn di heman demê de encamek rêzika gihîştinê jî bibînin.

Sernavên Bersiva HTTP-ê yên Zêde

Hûn ê di sernavên bersivê yên daxwaza rastîn de sernavên HTTP-ê yên din bibînin. Sernav dema ku mêvandarê jorîn ji bo pêkanîna daxwazê ​​derbas kiriye nîşan dide. Di millisecon de tê îfade kirin. Heke xerîdar bixwaze dema karûbarê li gorî derengiya torê diyar bike ev bikêr e.

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

Veavakirina dawî

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 }

Agahiyên zêde ji wergêr

Talîmatên ji bo sazkirina Envoy Proxy li ser malperê têne dîtin https://www.getenvoy.io/

Ji hêla xwerû ve, rpm xwedan mîhengek karûbarê pergalê nîne.

Veavakirina karûbarê systemd /etc/systemd/system/envoy.service zêde bike:

[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

Pêdivî ye ku hûn pelrêçek /etc/envoy/ biafirînin û konfigurasyona config.yaml têxin wir.

Danûstandinek telegramê bi karanîna nûnerê nûner heye: https://t.me/envoyproxy_ru

Envoy Proxy pêşkêşkirina naveroka statîk piştgirî nake. Ji ber vê yekê, kî dikare ji bo taybetmendiyê deng bide: https://github.com/envoyproxy/envoy/issues/378

Tenê bikarhênerên qeydkirî dikarin beşdarî anketê bibin. Têketinji kerema xwe.

Ma vê postê we teşwîq kir ku hûn nûnerê nûnerê saz bikin û ceribandin?

  • erê

  • na

75 bikarhêneran deng dan. 18 bikarhêner jî betal bûn.

Source: www.habr.com

Add a comment