Penghijrahan dari Nginx ke Proksi Utusan

Hello, Habr! Saya membawa kepada perhatian anda terjemahan siaran itu: Penghijrahan dari Nginx ke Proksi Utusan.

Envoy ialah pelayan proksi teragih berprestasi tinggi (ditulis dalam C++) yang direka untuk perkhidmatan dan aplikasi individu, ia juga merupakan bas komunikasi dan "pesawat data sejagat" yang direka untuk seni bina "mesh perkhidmatan" perkhidmatan mikro yang besar. Semasa menciptanya, penyelesaian kepada masalah yang timbul semasa pembangunan pelayan seperti NGINX, HAProxy, pengimbang beban perkakasan dan pengimbang beban awan telah diambil kira. Envoy bekerja bersama setiap aplikasi dan mengabstrak rangkaian untuk menyediakan fungsi biasa tanpa mengira platform. Apabila semua trafik perkhidmatan dalam infrastruktur mengalir melalui jaringan Utusan, menjadi mudah untuk memvisualisasikan kawasan masalah dengan pemerhatian yang konsisten, menala prestasi keseluruhan dan menambah fungsi teras di lokasi tertentu.

peluang

  • Seni bina di luar proses: utusan ialah pelayan berprestasi tinggi serba lengkap yang menggunakan sedikit RAM. Ia berfungsi bersama-sama dengan mana-mana bahasa aplikasi atau rangka kerja.
  • Sokongan http/2 dan grpc: utusan mempunyai http/2 dan sokongan grpc kelas pertama untuk sambungan masuk dan keluar. Ini adalah proksi telus dari http/1.1 hingga http/2.
  • Pengimbangan Beban Lanjutan: utusan menyokong ciri pengimbangan beban lanjutan termasuk percubaan semula automatik, pemutus rantai, pengehadan kadar global, pembayang permintaan, pengimbangan beban zon tempatan, dsb.
  • API Pengurusan Konfigurasi: utusan menyediakan API yang mantap untuk mengurus konfigurasi anda secara dinamik.
  • Kebolehlihatan: Kebolehmerhatian mendalam trafik L7, sokongan asli untuk pengesanan teragih dan kebolehcerapan mongodb, dynamodb dan banyak aplikasi lain.

Langkah 1 β€” Contoh Konfigurasi NGINX

Skrip ini menggunakan fail yang direka khas nginx.conf, berdasarkan contoh penuh daripada Wiki NGINX. Anda boleh melihat konfigurasi dalam editor dengan membuka nginx.conf

konfigurasi sumber 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;
    }
  }
}

Konfigurasi NGINX biasanya mempunyai tiga elemen utama:

  1. Mengkonfigurasi pelayan NGINX, struktur log dan fungsi Gzip. Ini ditakrifkan secara global dalam semua kes.
  2. Mengkonfigurasi NGINX untuk menerima permintaan kepada hos one.example.com pada port 8080.
  3. Menyediakan lokasi sasaran, cara mengendalikan trafik untuk bahagian URL yang berlainan.

Tidak semua konfigurasi akan digunakan untuk Envoy Proxy, dan anda tidak perlu mengkonfigurasi beberapa tetapan. Proksi Utusan telah empat jenis utama, yang menyokong infrastruktur teras yang ditawarkan oleh NGINX. Intinya ialah:

  • Pendengar: Mereka menentukan cara Proksi Utusan menerima permintaan masuk. Envoy Proxy pada masa ini hanya menyokong pendengar berasaskan TCP. Setelah sambungan diwujudkan, ia dihantar ke set penapis untuk diproses.
  • Penapis: Ia adalah sebahagian daripada seni bina saluran paip yang boleh memproses data masuk dan keluar. Fungsi ini termasuk penapis seperti Gzip, yang memampatkan data sebelum menghantarnya kepada pelanggan.
  • Penghala: Mereka memajukan trafik ke destinasi yang diperlukan, ditakrifkan sebagai kelompok.
  • Kelompok: Mereka menentukan titik akhir untuk trafik dan parameter konfigurasi.

Kami akan menggunakan empat komponen ini untuk membuat konfigurasi Proksi Envoy untuk memadankan konfigurasi NGINX tertentu. Matlamat utusan adalah untuk bekerja dengan API dan konfigurasi dinamik. Dalam kes ini, konfigurasi asas akan menggunakan tetapan statik, berkod keras daripada NGINX.

Langkah 2 - Konfigurasi NGINX

Bahagian pertama nginx.conf mentakrifkan beberapa dalaman NGINX yang perlu dikonfigurasikan.

Sambungan Pekerja

Konfigurasi di bawah menentukan bilangan proses dan sambungan pekerja. Ini menunjukkan cara NGINX akan berskala untuk memenuhi permintaan.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy menguruskan aliran kerja dan sambungan dengan cara yang berbeza.

Utusan mencipta benang pekerja untuk setiap benang perkakasan dalam sistem. Setiap urutan pekerja melaksanakan gelung peristiwa tidak menyekat yang bertanggungjawab

  1. Mendengar setiap pendengar
  2. Menerima sambungan baharu
  3. Mencipta satu set penapis untuk sambungan
  4. Proses semua operasi I/O sepanjang hayat sambungan.

Semua pemprosesan sambungan selanjutnya dikendalikan sepenuhnya dalam urutan pekerja, termasuk sebarang tingkah laku pemajuan.

Untuk setiap utas pekerja dalam Utusan, terdapat kumpulan sambungan. Jadi kumpulan sambungan HTTP/2 hanya mewujudkan satu sambungan bagi setiap hos luaran pada satu masa, jika terdapat empat utas pekerja, akan ada empat sambungan HTTP/2 bagi setiap hos luaran dalam keadaan stabil. Dengan menyimpan segala-galanya dalam satu utas pekerja, hampir semua kod boleh ditulis tanpa menyekat, seolah-olah ia adalah satu thread. Jika lebih banyak benang pekerja diperuntukkan daripada yang diperlukan, ini boleh membawa kepada pembaziran memori, mencipta sejumlah besar sambungan melahu dan mengurangkan bilangan sambungan yang dikembalikan ke kolam.

Untuk maklumat lebih lanjut, lawati Blog Proksi Utusan.

Konfigurasi HTTP

Blok konfigurasi NGINX berikut mentakrifkan tetapan HTTP seperti:

  • Jenis mime yang disokong
  • Tamat Masa Lalai
  • Konfigurasi Gzip

Anda boleh menyesuaikan aspek ini menggunakan penapis dalam Proksi Utusan, yang akan kita bincangkan kemudian.

Langkah 3 - Konfigurasi Pelayan

Dalam blok konfigurasi HTTP, konfigurasi NGINX menentukan untuk mendengar pada port 8080 dan membalas permintaan masuk untuk domain one.example.com ΠΈ www.one.example.com.

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

Di dalam Utusan, ia dikawal oleh Pendengar.

Pendengar utusan

Aspek yang paling penting untuk bermula dengan Envoy Proxy ialah menentukan pendengar anda. Anda perlu mencipta fail konfigurasi yang menerangkan cara anda mahu menjalankan contoh Envoy.

Coretan di bawah akan mencipta pendengar baharu dan mengikatnya pada port 8080. Konfigurasi memberitahu Envoy Proxy port mana yang harus diikat untuk permintaan masuk.

Proksi Envoy menggunakan tatatanda YAML untuk konfigurasinya. Untuk pengenalan kepada notasi ini, lihat di sini pautan.

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

Tidak perlu mentakrifkan nama pelayan, kerana penapis Proksi Envoy akan mengendalikan perkara ini.

Langkah 4 - Konfigurasi Lokasi

Apabila permintaan masuk ke NGINX, blok lokasi menentukan cara memproses dan tempat untuk menghalakan trafik. Dalam serpihan berikut, semua trafik ke tapak dipindahkan ke huluan (nota penterjemah: huluan biasanya pelayan aplikasi) yang dinamakan targetCluster. Kelompok huluan mentakrifkan nod yang harus memproses permintaan. Kami akan membincangkan perkara ini dalam langkah seterusnya.

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

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

Di Envoy, Filters melakukan ini.

Penapis Utusan

Untuk konfigurasi statik, penapis menentukan cara memproses permintaan masuk. Dalam kes ini, kami menetapkan penapis yang sepadan nama_pelayan dalam langkah sebelumnya. Apabila permintaan masuk tiba yang sepadan dengan domain dan laluan tertentu, trafik dihalakan ke gugusan. Ini adalah bersamaan dengan konfigurasi bawah ke atas 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

nama utusan.http_connection_manager ialah penapis terbina dalam dalam Proksi Utusan. Penapis lain termasuk Redis, Mongo, TCP. Anda boleh mendapatkan senarai lengkap di dokumentasi.

Untuk mendapatkan maklumat lanjut tentang dasar pengimbangan beban lain, lawati Dokumentasi Utusan.

Langkah 5 - Konfigurasi Proksi dan Huluan

Dalam NGINX, konfigurasi huluan mentakrifkan satu set pelayan sasaran yang akan memproses trafik. Dalam kes ini, dua kluster telah ditetapkan.

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

Dalam Utusan, ini diuruskan oleh kelompok.

Kelompok Utusan

Setara huluan ditakrifkan sebagai kelompok. Dalam kes ini, hos yang akan melayani trafik telah dikenal pasti. Cara hos diakses, seperti tamat masa, ditakrifkan sebagai konfigurasi kelompok. Ini membolehkan kawalan yang lebih terperinci ke atas aspek seperti kependaman dan pengimbangan beban.

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

Apabila menggunakan penemuan perkhidmatan STRICT_DNS Utusan akan secara berterusan dan tidak segerak menyelesaikan sasaran DNS yang ditentukan. Setiap alamat IP yang dikembalikan daripada hasil DNS akan dianggap sebagai hos eksplisit dalam kelompok huluan. Ini bermakna jika permintaan mengembalikan dua alamat IP, Envoy akan menganggap bahawa terdapat dua hos dalam kluster, dan kedua-duanya mesti seimbang beban. Jika hos dialih keluar daripada hasil carian, Envoy akan menganggap ia tidak lagi wujud dan akan menarik trafik daripada mana-mana kumpulan sambungan sedia ada.

Untuk maklumat lebih lanjut, lihat Dokumentasi proksi utusan.

Langkah 6 β€” Akses Log dan Ralat

Konfigurasi terakhir ialah pendaftaran. Daripada menolak log ralat ke cakera, Envoy Proxy mengambil pendekatan berasaskan awan. Semua log aplikasi adalah output kepada stdout ΠΈ stderr.

Apabila pengguna membuat permintaan, log akses adalah pilihan dan dilumpuhkan secara lalai. Untuk mendayakan log akses untuk permintaan HTTP, dayakan konfigurasi log_akses untuk pengurus sambungan HTTP. Laluan boleh sama ada peranti seperti stdout, atau fail pada cakera, bergantung pada keperluan anda.

Konfigurasi berikut akan mengubah hala semua log akses ke stdout (nota penterjemah - stdout diperlukan untuk menggunakan envoy inside docker. Jika digunakan tanpa docker, kemudian gantikan /dev/stdout dengan laluan ke fail log biasa). Salin coretan ke bahagian konfigurasi untuk pengurus sambungan:

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

Hasilnya sepatutnya kelihatan seperti ini:

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

Secara lalai, Envoy mempunyai rentetan format yang merangkumi butiran permintaan 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

Hasil rentetan format ini ialah:

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

Kandungan output boleh disesuaikan dengan menetapkan medan format. Sebagai contoh:

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"

Baris log juga boleh dikeluarkan dalam format JSON dengan menetapkan medan json_format. Sebagai contoh:

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

Untuk maklumat lanjut mengenai Metodologi Pendaftaran Utusan, lawati

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

Pengelogan bukan satu-satunya cara untuk mendapatkan cerapan tentang bekerja dengan Proksi Utusan. Ia mempunyai keupayaan pengesanan dan metrik lanjutan terbina di dalamnya. Anda boleh mengetahui lebih lanjut di mengesan dokumentasi atau melalui Skrip pengesanan interaktif.

Langkah 7 - Lancarkan

Anda kini telah memindahkan konfigurasi anda daripada NGINX kepada Envoy Proxy. Langkah terakhir ialah melancarkan contoh Proksi Utusan untuk mengujinya.

Jalankan sebagai pengguna

Di bahagian atas baris konfigurasi NGINX pengguna www www; menentukan untuk menjalankan NGINX sebagai pengguna berkepribadian rendah untuk meningkatkan keselamatan.

Envoy Proxy mengambil pendekatan berasaskan awan untuk mengurus siapa yang memiliki proses. Apabila kami menjalankan Envoy Proxy melalui bekas, kami boleh menentukan pengguna yang mempunyai keistimewaan rendah.

Melancarkan Proksi Utusan

Perintah di bawah akan menjalankan Envoy Proxy melalui bekas Docker pada hos. Perintah ini memberikan Envoy keupayaan untuk mendengar permintaan masuk pada port 80. Walau bagaimanapun, seperti yang dinyatakan dalam konfigurasi pendengar, Envoy Proxy mendengar trafik masuk pada port 8080. Ini membolehkan proses berjalan sebagai pengguna yang mempunyai keistimewaan rendah.

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

Ujian

Dengan proksi berjalan, ujian kini boleh dibuat dan diproses. Perintah cURL berikut mengeluarkan permintaan dengan pengepala hos yang ditakrifkan dalam konfigurasi proksi.

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

Permintaan HTTP akan mengakibatkan ralat 503. Ini kerana sambungan huluan tidak berfungsi dan tidak tersedia. Oleh itu, Proksi Utusan tidak mempunyai destinasi yang tersedia untuk permintaan tersebut. Perintah berikut akan memulakan satu siri perkhidmatan HTTP yang sepadan dengan konfigurasi yang ditakrifkan untuk Utusan.

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

Dengan perkhidmatan yang tersedia, Utusan berjaya memproksi trafik ke destinasinya.

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

Anda seharusnya melihat respons yang menunjukkan bekas Docker yang memproses permintaan tersebut. Dalam log Proksi Utusan anda juga harus melihat output rentetan akses.

Pengepala Respons HTTP Tambahan

Anda akan melihat pengepala HTTP tambahan dalam pengepala respons permintaan sebenar. Pengepala memaparkan masa yang dihabiskan oleh hos huluan untuk memproses permintaan. Dinyatakan dalam milisaat. Ini berguna jika pelanggan ingin menentukan masa perkhidmatan berbanding kependaman rangkaian.

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

Konfigurasi akhir

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 }

Maklumat tambahan daripada penterjemah

Arahan untuk memasang Envoy Proxy boleh didapati di laman web https://www.getenvoy.io/

Secara lalai, rpm tidak mempunyai konfigurasi perkhidmatan systemd.

Tambah konfigurasi perkhidmatan 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

Anda perlu mencipta direktori /etc/envoy/ dan letakkan konfigurasi config.yaml di sana.

Terdapat sembang telegram menggunakan proksi utusan: https://t.me/envoyproxy_ru

Envoy Proxy tidak menyokong penyajian kandungan statik. Oleh itu, siapa yang boleh mengundi untuk ciri tersebut: https://github.com/envoyproxy/envoy/issues/378

Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Log masuk, Sama-sama.

Adakah siaran ini menggalakkan anda memasang dan menguji proksi utusan?

  • ya

  • tiada

75 pengguna mengundi. 18 pengguna berpantang.

Sumber: www.habr.com

Tambah komen