Uhamaji kutoka kwa Nginx hadi kwa Wakala wa Mjumbe

Habari, Habr! Ninakuletea tafsiri ya chapisho: Uhamaji kutoka kwa Nginx hadi kwa Wakala wa Mjumbe.

Mjumbe ni seva ya proksi iliyosambazwa yenye utendaji wa juu (iliyoandikwa katika C++) iliyoundwa kwa ajili ya huduma na programu za mtu binafsi, pia ni basi ya mawasiliano na "ndege ya data ya ulimwengu wote" iliyoundwa kwa ajili ya usanifu mkubwa wa huduma ndogo ndogo za "mesh ya huduma". Wakati wa kuunda, suluhisho la shida zilizotokea wakati wa ukuzaji wa seva kama vile NGINX, HAProxy, mizani ya upakiaji wa vifaa na mizani ya wingu ilizingatiwa. Mjumbe hufanya kazi pamoja na kila programu na huchota mtandao ili kutoa utendakazi wa kawaida bila kujali jukwaa. Wakati trafiki yote ya huduma katika miundombinu inapita kupitia Wavu wa Wajumbe, inakuwa rahisi kuibua maeneo yenye matatizo yenye uangalizi thabiti, kurekebisha utendakazi wa jumla, na kuongeza utendaji wa msingi katika eneo mahususi.

Uwezo

  • Usanifu ambao haujakamilika: mjumbe ni seva inayojitosheleza, yenye utendaji wa juu ambayo inachukua kiasi kidogo cha RAM. Inafanya kazi kwa kushirikiana na lugha yoyote ya programu au mfumo.
  • http/2 na usaidizi wa grpc: mjumbe ana usaidizi wa daraja la kwanza wa http/2 na grpc kwa miunganisho inayoingia na inayotoka. Hii ni proksi ya uwazi kutoka kwa http/1.1 hadi http/2.
  • Usawazishaji wa Hali ya Juu wa Mzigo: mjumbe hutumia vipengele vya kina vya kusawazisha mizigo ikijumuisha majaribio ya kiotomatiki, kuvunja mnyororo, kupunguza viwango vya kimataifa, kuweka kivuli kwenye ombi, kusawazisha upakiaji wa eneo la karibu, n.k.
  • API ya Usimamizi wa Usanidi: mjumbe hutoa API thabiti ya kudhibiti usanidi wako kwa njia thabiti.
  • Kuzingatiwa: Uangalizi wa kina wa trafiki ya L7, usaidizi asilia wa ufuatiliaji uliosambazwa na uangalizi wa mongodb, dynamodb na programu zingine nyingi.

Hatua ya 1 - Mfano wa Usanidi wa NGINX

Hati hii hutumia faili iliyoundwa mahususi nginx.conf, kulingana na mfano kamili kutoka Wiki ya NGINX. Unaweza kuona usanidi katika kihariri kwa kufungua nginx.conf

usanidi wa chanzo cha 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;
    }
  }
}

Usanidi wa NGINX kawaida huwa na vitu vitatu muhimu:

  1. Inasanidi seva ya NGINX, muundo wa kumbukumbu na utendaji wa Gzip. Hii inafafanuliwa kimataifa katika visa vyote.
  2. Inasanidi NGINX ili kukubali maombi kwa mwenyeji one.example.com kwenye bandari 8080.
  3. Kuweka eneo lengwa, jinsi ya kushughulikia trafiki kwa sehemu tofauti za URL.

Sio usanidi wote utatumika kwa Wakala wa Mjumbe, na huhitaji kusanidi baadhi ya mipangilio. Wakala wa Mjumbe ana aina nne muhimu, ambayo inasaidia miundombinu ya msingi inayotolewa na NGINX. Msingi ni:

  • Wasikilizaji: Huamua jinsi Wakala wa Mjumbe hukubali maombi yanayoingia. Wakala wa Mjumbe kwa sasa anaauni wasikilizaji kulingana na TCP pekee. Mara tu muunganisho umeanzishwa, hupitishwa kwa seti ya vichungi kwa usindikaji.
  • Vichujio: Wao ni sehemu ya usanifu wa bomba ambao unaweza kuchakata data zinazoingia na zinazotoka. Utendaji huu unajumuisha vichujio kama vile Gzip, ambayo hubana data kabla ya kuituma kwa mteja.
  • Vipanga njia: Wanasambaza trafiki hadi mahali panapohitajika, inayofafanuliwa kama nguzo.
  • Vikundi: Wanafafanua mwisho wa trafiki na vigezo vya usanidi.

Tutatumia vipengele hivi vinne ili kuunda usanidi wa Wakala wa Mjumbe ili kuendana na usanidi maalum wa NGINX. Lengo la Mjumbe ni kufanya kazi na API na usanidi unaobadilika. Katika kesi hii, usanidi wa msingi utatumia tuli, mipangilio ya ngumu kutoka kwa NGINX.

Hatua ya 2 - Usanidi wa NGINX

sehemu ya kwanza nginx.conf inafafanua baadhi ya mambo ya ndani ya NGINX ambayo yanahitaji kusanidiwa.

Viunganisho vya Wafanyakazi

Usanidi ulio hapa chini huamua idadi ya michakato na viunganisho vya wafanyikazi. Hii inaonyesha jinsi NGINX itakavyoongezeka ili kukidhi mahitaji.

worker_processes  2;

events {
  worker_connections   2000;
}

Wakala wa Mjumbe hudhibiti mtiririko wa kazi na miunganisho kwa njia tofauti.

Mjumbe huunda uzi wa mfanyakazi kwa kila uzi wa maunzi kwenye mfumo. Kila uzi wa mfanyakazi hutekeleza kitanzi cha tukio kisichozuia ambacho kinawajibika

  1. Kusikiliza kila msikilizaji
  2. Kukubali miunganisho mipya
  3. Kuunda seti ya vichungi kwa muunganisho
  4. Chakata shughuli zote za I/O wakati muunganisho unaendelea.

Uchakataji zaidi wa muunganisho unashughulikiwa kabisa katika uzi wa mfanyakazi, ikijumuisha tabia yoyote ya usambazaji.

Kwa kila uzi wa mfanyakazi katika Mjumbe, kuna bwawa la uunganisho. Kwa hivyo mabwawa ya muunganisho wa HTTP/2 huanzisha muunganisho mmoja tu kwa kila seva pangishi ya nje kwa wakati mmoja, ikiwa kuna nyuzi nne za wafanyikazi kutakuwa na miunganisho minne ya HTTP/2 kwa kila seva pangishi ya nje katika hali thabiti. Kwa kuweka kila kitu katika uzi mmoja wa mfanyakazi, karibu msimbo wote unaweza kuandikwa bila kuzuia, kana kwamba ni thread moja. Ikiwa nyuzi nyingi za wafanyikazi zimetengwa kuliko inavyohitajika, hii inaweza kusababisha kumbukumbu kupotea, kuunda idadi kubwa ya miunganisho isiyo na kazi, na kupunguza idadi ya mara miunganisho inarudishwa kwenye bwawa.

Kwa habari zaidi tembelea Blogu ya Wakala wa Mjumbe.

Usanidi wa HTTP

Kizuizi kifuatacho cha usanidi wa NGINX kinafafanua mipangilio ya HTTP kama vile:

  • Ni aina gani za mime zinazoungwa mkono
  • Muda Chaguomsingi
  • Usanidi wa Gzip

Unaweza kubinafsisha vipengele hivi kwa kutumia vichujio katika Wakala wa Mjumbe, ambavyo tutavijadili baadaye.

Hatua ya 3 - Usanidi wa Seva

Katika kizuizi cha usanidi wa HTTP, usanidi wa NGINX unabainisha kusikiliza kwenye bandari 8080 na kujibu maombi yanayoingia ya vikoa. one.example.com ΠΈ www.one.example.com.

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

Ndani ya Mjumbe, inadhibitiwa na Wasikilizaji.

Wasikilizaji wa wajumbe

Kipengele muhimu zaidi cha kuanza kutumia Wakala wa Mjumbe ni kufafanua wasikilizaji wako. Unahitaji kuunda faili ya usanidi inayoelezea jinsi unavyotaka kutekeleza mfano wa Mjumbe.

Kijisehemu kilicho hapa chini kitaunda kisikilizaji kipya na kukifunga kwa port 8080. Mipangilio inaiambia Wakala wa Mjumbe ni milango gani inapaswa kuifunga kwa maombi yanayoingia.

Wakala wa Mjumbe hutumia nukuu ya YAML kwa usanidi wake. Kwa utangulizi wa nukuu hii, tazama hapa kiungo.

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

Hakuna haja ya kufafanua server_name, kwa kuwa vichungi vya Wakala wa Mjumbe vitashughulikia hili.

Hatua ya 4 - Usanidi wa Mahali

Ombi linapokuja katika NGINX, kizuizi cha eneo huamua jinsi ya kuchakata na wapi kuelekeza trafiki. Katika kipande kifuatacho, trafiki yote kwenye tovuti huhamishiwa kwenye mkondo wa juu (maelezo ya mtafsiri: sehemu ya juu kwa kawaida ni seva ya programu) iliyopewa jina. LengoCluster. Nguzo ya juu ya mkondo inafafanua nodi ambazo zinapaswa kushughulikia ombi. Tutajadili hili katika hatua inayofuata.

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

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

Kwa Mjumbe, Vichungi hufanya hivi.

Vichujio vya Wajumbe

Kwa usanidi tuli, vichujio huamua jinsi ya kushughulikia maombi yanayoingia. Katika kesi hii tunaweka vichungi vinavyofanana majina_ya_seva katika hatua ya awali. Maombi yanayoingia yanapolingana na vikoa na njia fulani, trafiki huelekezwa kwenye kundi. Hii ni sawa na usanidi wa NGINX chini-juu.

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

jina mjumbe.http_connection_manager ni kichujio kilichojengewa ndani katika Wakala wa Mjumbe. Vichungi vingine ni pamoja na Rejea, Mongo, TCP. Unaweza kupata orodha kamili kwenye nyaraka.

Kwa maelezo zaidi kuhusu sera zingine za kusawazisha mzigo, tembelea Nyaraka za Mjumbe.

Hatua ya 5 - Usanidi wa Wakala na Mkondo wa Juu

Katika NGINX, usanidi wa mkondo wa juu unafafanua seti ya seva zinazolengwa ambazo zitachakata trafiki. Katika kesi hii, vikundi viwili viliwekwa.

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

Katika Mjumbe, hii inasimamiwa na vikundi.

Makundi ya Wajumbe

Sawa ya mkondo wa juu inafafanuliwa kama nguzo. Katika kesi hii, majeshi ambayo yatatumikia trafiki yametambuliwa. Njia za kufikiwa na seva pangishi, kama vile kuisha kwa muda, hufafanuliwa kama usanidi wa nguzo. Hii inaruhusu udhibiti zaidi wa punjepunje juu ya vipengele kama vile muda wa kusubiri na kusawazisha mzigo.

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

Wakati wa kutumia ugunduzi wa huduma STRICT_DNS Mjumbe atatatua kila mara na bila usawaziko shabaha zilizobainishwa za DNS. Kila anwani ya IP iliyorejeshwa kutoka kwa matokeo ya DNS itazingatiwa kama seva pangishi katika nguzo ya juu ya mkondo. Hii ina maana kwamba ikiwa ombi litarejesha anwani mbili za IP, Mjumbe atafikiri kuwa kuna wapangishi wawili kwenye nguzo, na zote mbili lazima zisawazishwe. Ikiwa seva pangishi itaondolewa kwenye matokeo, Mjumbe atachukulia kuwa haipo tena na atavuta trafiki kutoka kwa miunganisho yoyote iliyopo.

Kwa habari zaidi angalia Hati za wakala wa mjumbe.

Hatua ya 6 - Ufikiaji wa Kumbukumbu na Makosa

Mpangilio wa mwisho ni usajili. Badala ya kusukuma kumbukumbu za makosa kwenye diski, Wakala wa Mjumbe huchukua mbinu inayotegemea wingu. Kumbukumbu zote za programu hutolewa kwa stdout ΠΈ stderr.

Watumiaji wanapotuma ombi, kumbukumbu za ufikiaji ni za hiari na kuzimwa kwa chaguomsingi. Ili kuwezesha kumbukumbu za ufikiaji kwa maombi ya HTTP, washa usanidi logi_ya_kufikia kwa kidhibiti cha unganisho cha HTTP. Njia inaweza kuwa kifaa kama vile stdout, au faili kwenye diski, kulingana na mahitaji yako.

Mipangilio ifuatayo itaelekeza upya kumbukumbu zote za ufikiaji kwa stdout (maelezo ya mtafsiri - stdout inahitajika kutumia mjumbe ndani ya docker. Ikiwa inatumiwa bila docker, basi badilisha /dev/stdout na njia ya faili ya kumbukumbu ya kawaida). Nakili kijisehemu kwa sehemu ya usanidi kwa kidhibiti cha unganisho:

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

Matokeo yanapaswa kuonekana kama hii:

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

Kwa chaguo-msingi, Mjumbe ana mfuatano wa umbizo unaojumuisha maelezo ya ombi la 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

Matokeo ya safu hii ya muundo ni:

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

Maudhui ya towe yanaweza kubinafsishwa kwa kuweka uga wa umbizo. Kwa mfano:

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"

Mstari wa kumbukumbu pia unaweza kutolewa katika umbizo la JSON kwa kuweka uga json_format. Kwa mfano:

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

Kwa habari zaidi juu ya Mbinu ya Usajili ya Mjumbe, tembelea

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

Kuingia sio njia pekee ya kupata maarifa ya kufanya kazi na Wakala wa Mjumbe. Ina ufuatiliaji wa hali ya juu na uwezo wa vipimo uliojengwa ndani yake. Unaweza kujua zaidi kwa kufuatilia nyaraka au kupitia Hati shirikishi ya ufuatiliaji.

Hatua ya 7 - Uzinduzi

Sasa umehamisha usanidi wako kutoka NGINX hadi Wakala wa Mjumbe. Hatua ya mwisho ni kuzindua mfano wa Wakala wa Mjumbe ili kuijaribu.

Endesha kama mtumiaji

Juu ya mstari wa usanidi wa NGINX mtumiaji www; inabainisha kuendesha NGINX kama mtumiaji asiye na uwezo wa chini ili kuboresha usalama.

Wakala wa Mjumbe huchukua mbinu ya msingi ya wingu kudhibiti ni nani anayemiliki mchakato. Tunapoendesha Wakala wa Mjumbe kupitia kontena, tunaweza kubainisha mtumiaji asiye na bahati.

Inazindua Wakala wa Mjumbe

Amri iliyo hapa chini itaendesha Wakala wa Mjumbe kupitia kontena ya Docker kwenye seva pangishi. Amri hii humpa Mjumbe uwezo wa kusikiliza maombi yanayoingia kwenye port 80. Hata hivyo, kama ilivyobainishwa katika usanidi wa msikilizaji, Wakala wa Mjumbe husikiliza trafiki inayoingia kwenye port 8080. Hii inaruhusu mchakato kufanya kazi kama mtumiaji asiye na uwezo wa chini.

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

Upimaji

Kwa kutumia seva mbadala, majaribio sasa yanaweza kufanywa na kuchakatwa. Amri ifuatayo ya cURL inatoa ombi na kichwa cha seva pangishi kilichofafanuliwa katika usanidi wa seva mbadala.

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

Ombi la HTTP litasababisha hitilafu 503. Hii ni kwa sababu miunganisho ya mkondo wa juu haifanyi kazi na haipatikani. Kwa hivyo, Wakala wa Mjumbe hana maeneo yanayopatikana kwa ombi. Amri ifuatayo itaanza mfululizo wa huduma za HTTP zinazolingana na usanidi uliofafanuliwa kwa Mjumbe.

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

Kwa huduma zinazopatikana, Mjumbe anaweza kutoa seva mbadala kwa ufanisi kwenye lengwa lake.

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

Unapaswa kuona jibu linaloonyesha ni kontena gani ya Docker iliyoshughulikia ombi. Kwenye kumbukumbu za Wakala wa Mjumbe unapaswa pia kuona pato la kamba ya ufikiaji.

Vichwa vya ziada vya Majibu ya HTTP

Utaona vichwa vya ziada vya HTTP katika vichwa vya majibu ya ombi halisi. Kijajuu kinaonyesha muda ambao mpangishi wa juu alitumia kuchakata ombi. Imeonyeshwa kwa milisekunde. Hii ni muhimu ikiwa mteja anataka kubainisha muda wa huduma ikilinganishwa na muda wa kusubiri wa mtandao.

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

Mpangilio wa mwisho

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 }

Maelezo ya ziada kutoka kwa mfasiri

Maagizo ya kusakinisha Wakala wa Mjumbe yanaweza kupatikana kwenye tovuti https://www.getenvoy.io/

Kwa chaguo-msingi, rpm haina usanidi wa huduma ya mfumo.

Ongeza usanidi wa huduma ya mfumo /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

Unahitaji kuunda saraka /etc/envoy/ na kuweka usanidi wa config.yaml hapo.

Kuna gumzo la telegraph kwa kutumia proksi ya mjumbe: https://t.me/envoyproxy_ru

Wakala wa Mjumbe hauauni kutoa maudhui tuli. Kwa hivyo, ni nani anayeweza kupigia kura kipengele hiki: https://github.com/envoyproxy/envoy/issues/378

Watumiaji waliojiandikisha pekee ndio wanaweza kushiriki katika utafiti. Weka sahihitafadhali.

Je, chapisho hili lilikuhimiza kusakinisha na kujaribu seva mbadala ya mjumbe?

  • ndiyo

  • hakuna

Watumiaji 75 walipiga kura. Watumiaji 18 walijizuia.

Chanzo: mapenzi.com

Kuongeza maoni