Bermigrasi dari Nginx ke Utusan Proksi

Halo, Habr! Saya membawa perhatian Anda pada terjemahan pos: Migrasi dari Nginx ke Utusan Utusan .


Utusan adalah server proxy terdistribusi kinerja tinggi (ditulis dalam C ++) yang dirancang untuk layanan dan aplikasi individual, juga merupakan bus komunikasi dan "pesawat data universal" yang dirancang untuk arsitektur "service mesh" layanan mikro yang besar. Saat membuat itu, solusi untuk masalah yang muncul selama pengembangan server seperti NGINX, HAProxy, penyeimbang beban perangkat keras, dan penyeimbang beban awan turut diperhitungkan. Utusan bekerja dengan setiap aplikasi dan abstrak jaringan, menyediakan fungsi-fungsi umum tanpa memandang platform. Ketika semua lalu lintas kantor dalam infrastruktur melewati grid Utusan, menjadi mudah untuk memvisualisasikan area bermasalah dengan kemampuan pengamatan yang konsisten, penyempurnaan kinerja keseluruhan, dan menambahkan fungsi dasar di lokasi tertentu.


Kemungkinan


  • Arsitektur di luar proses: utusan adalah server mandiri berperforma tinggi yang mengkonsumsi sejumlah kecil RAM. Ia bekerja bersama dengan bahasa aplikasi atau kerangka kerja apa pun.
  • Dukungan untuk http / 2 dan grpc: utusan memiliki dukungan kelas satu untuk http / 2 dan grpc untuk koneksi masuk dan keluar. Ini adalah proxy transparan dari http / 1.1 ke http / 2.
  • Penyeimbangan beban yang ditingkatkan: utusan mendukung fitur-fitur penyeimbangan beban tingkat lanjut, termasuk percobaan ulang otomatis, sirkuit terbuka, batasan kecepatan global, permintaan bayangan, keseimbangan beban zona lokal, dll.
  • API Manajemen Konfigurasi: utusan menyediakan API yang kuat untuk mengelola konfigurasinya secara dinamis.
  • Pengamatan: pengamatan lalu lintas L7 yang dalam, dukungan bawaan untuk penelusuran terdistribusi dan pengamatan mongodb, dynamodb, dan banyak aplikasi lainnya.

Langkah 1 - Contoh NGINX Config


Script ini menggunakan file nginx.conf yang dibuat khusus, berdasarkan contoh lengkap dari Wiki NGINX . Anda dapat melihat konfigurasi di editor dengan membuka nginx.conf


Sumber nginx config


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 memiliki tiga elemen kunci:


  1. Mengkonfigurasi server NGINX, struktur log, dan fungsionalitas Gzip. Ini ditentukan secara global dalam semua kasus.
  2. Mengkonfigurasi NGINX untuk menerima permintaan untuk satu host.example.com pada port 8080.
  3. Menetapkan lokasi tujuan Anda, cara menangani lalu lintas untuk berbagai bagian URL.

Tidak semua konfigurasi akan diterapkan ke Utusan Proksi, dan Anda tidak perlu mengkonfigurasi beberapa pengaturan. Utusan Proksi memiliki empat jenis utama yang mendukung infrastruktur dasar yang ditawarkan oleh NGINX. Intinya adalah:


  • Pendengar: Mereka menentukan bagaimana Utusan Utusan menerima permintaan yang masuk. Utusan Proksi saat ini hanya mendukung pendengar berbasis TCP. Setelah koneksi dibuat, itu ditransfer ke satu set filter untuk diproses.
  • Filter: Mereka adalah bagian dari arsitektur pipelined yang dapat memproses data yang masuk dan keluar. Fungsionalitas ini mencakup filter, seperti Gzip, yang memampatkan data sebelum mengirimnya ke klien.
  • Router: Mereka mengarahkan lalu lintas ke tujuan yang diinginkan, didefinisikan sebagai sebuah cluster.
  • Cluster: Mereka menentukan titik akhir untuk pengaturan lalu lintas dan konfigurasi.

Kami akan menggunakan keempat komponen ini untuk membuat konfigurasi Proxy Utusan agar sesuai dengan konfigurasi NGINX tertentu. Tujuan utusan itu bekerja dengan API dan konfigurasi dinamis. Dalam hal ini, konfigurasi dasar akan menggunakan parameter statis, kode-keras dari NGINX.


Langkah 2 - Konfigurasikan NGINX


Bagian pertama dari nginx.conf mendefinisikan beberapa komponen NGINX internal yang perlu dikonfigurasi.


Koneksi Pekerja


Konfigurasi di bawah ini menentukan jumlah proses kerja dan koneksi. Ini menunjukkan bagaimana NGINX akan berskala untuk memenuhi permintaan.


 worker_processes 2; events { worker_connections 2000; } 

Utusan Proxy mengelola alur kerja dan koneksi secara berbeda.


Utusan menciptakan alur kerja untuk setiap utas perangkat keras dalam sistem. Setiap thread pekerja menjalankan loop acara non-blocking yang bertanggung jawab untuk


  1. Mendengarkan setiap pendengar
  2. Terima koneksi baru
  3. Membuat set filter untuk koneksi
  4. Menangani semua operasi I / O selama masa koneksi.

Semua pemrosesan koneksi lebih lanjut sepenuhnya diproses dalam alur kerja, termasuk perilaku penerusan apa pun.


Untuk setiap alur kerja di Utusan, ada koneksi di kolam. Dengan demikian, kumpulan koneksi HTTP / 2 hanya membangun satu koneksi untuk setiap host eksternal sekaligus, jika ada empat utas pekerja, akan ada empat koneksi HTTP / 2 untuk setiap host eksternal dalam kondisi stabil. Dengan menyimpan semuanya dalam satu alur kerja, hampir semua kode dapat ditulis tanpa mengunci, seolah-olah itu adalah single-threaded. Jika lebih dari alur kerja yang diperlukan dialokasikan, ini dapat mengarah pada penggunaan memori yang tidak rasional, penciptaan sejumlah besar koneksi idle dan penurunan jumlah koneksi yang dikembalikan ke pool.


Untuk informasi lebih lanjut, kunjungi blog Utusan Proksi .


Konfigurasi HTTP


Blok konfigurasi NGINX berikut mendefinisikan pengaturan HTTP, seperti:


  • Jenis mime apa yang didukung
  • Batas waktu default
  • Konfigurasi gzip

Anda dapat mengkonfigurasi aspek-aspek ini menggunakan filter di Utusan Proksi, yang akan kita bahas nanti.


Langkah 3 - Konfigurasi Server


Di blok konfigurasi HTTP, konfigurasi NGINX memerintahkan Anda untuk mendengarkan pada port 8080 dan menanggapi permintaan masuk untuk domain one.example.com dan www.one.example.com .


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

Di dalam Utusan, para Pendengar mengendalikannya.


Utusan pendengar


Aspek paling penting untuk memulai dengan Utusan Utusan adalah mengidentifikasi pendengar. Anda perlu membuat file konfigurasi yang menjelaskan bagaimana Anda ingin menjalankan instance Utusan.


Cuplikan di bawah ini akan membuat pendengar baru dan mengaitkannya dengan port 8080. Konfigurasi tersebut memberi tahu Envoy Proxy port mana yang harus terikat untuk permintaan yang masuk.


Utusan Proksi menggunakan notasi YAML untuk konfigurasinya. Untuk membiasakan diri dengan notasi ini, lihat tautan di sini.


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

Tidak perlu mendefinisikan server_name , karena filter Proxy Utusan dapat menangani ini.


Langkah 4 - Konfigurasi Lokasi


Saat permintaan tiba di NGINX, blok lokasi menentukan cara memproses dan ke mana mengarahkan lalu lintas. Dalam fragmen berikut, semua lalu lintas ke situs ditransmisikan ke cluster hulu (catatan penerjemah: hulu biasanya server aplikasi) bernama targetCluster . Cluster upstream mendefinisikan node yang harus memproses permintaan. Kami akan membahas ini di langkah berikutnya.


 location / { proxy_pass http://targetCluster/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } 

Di Utusan, Filter melakukan ini.


Filter utusan


Untuk konfigurasi statis, filter menentukan cara menangani permintaan yang masuk. Dalam hal ini, kami menetapkan filter yang cocok dengan nama server pada langkah sebelumnya. Ketika permintaan masuk tiba yang sesuai dengan domain dan rute tertentu, lalu lintas dialihkan ke kluster. Ini setara dengan konfigurasi hulu 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 envoy.http_connection_manager adalah filter bawaan di Envoy Proxy. Filter lain termasuk Redis , Mongo , TCP . Anda dapat menemukan daftar lengkap dalam dokumentasi .


Untuk informasi lebih lanjut tentang kebijakan penyeimbangan beban lainnya, kunjungi Dokumentasi Utusan .


Langkah 5 - Konfigurasi Proxy dan Hulu


Di NGINX, konfigurasi hulu menentukan kumpulan server target yang akan menangani lalu lintas. Dalam hal ini, dua kelompok ditugaskan.


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

Dalam Utusan, itu adalah cluster yang dikelola.


Cluster utusan


Setara dengan hulu didefinisikan sebagai cluster. Dalam hal ini, host yang akan melayani lalu lintas diidentifikasi. Metode mengakses host, seperti batas waktu, didefinisikan sebagai konfigurasi cluster. Ini memungkinkan Anda untuk mengontrol rincian aspek yang lebih akurat seperti latensi dan penyeimbangan muatan.


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

Saat menggunakan penemuan layanan STRICT_DNS, Utusan akan terus-menerus dan secara tidak sinkron menyelesaikan target DNS yang ditentukan. Setiap alamat IP yang dikembalikan sebagai hasil dari DNS akan dianggap sebagai host eksplisit di cluster hulu. Ini berarti bahwa jika permintaan mengembalikan dua alamat IP, Utusan akan menganggap bahwa ada dua host di cluster, dan keduanya harus memuat seimbang. Jika host dihapus dari hasilnya, Utusan mengasumsikan bahwa tidak ada lagi dan akan memilih lalu lintas dari kumpulan koneksi yang ada.


Untuk informasi lebih lanjut, lihat Utusan Proksi Utusan .


Langkah 6 - Akses Log dan Kesalahan


Konfigurasi terakhir adalah pendaftaran. Alih-alih mentransfer log kesalahan ke disk, Utusan Proksi menggunakan pendekatan berbasis cloud. Semua log aplikasi ditampilkan dalam stdout dan stderr .


Saat pengguna mengajukan permintaan, log akses bersifat opsional dan dinonaktifkan secara default. Untuk mengaktifkan log akses untuk permintaan HTTP, aktifkan konfigurasi access_log untuk Manajer Koneksi HTTP. Path dapat berupa perangkat, seperti stdout , atau file pada disk, tergantung pada kebutuhan Anda.


Konfigurasi berikut akan mengarahkan semua log akses ke stdout (catatan penerjemah - stdout diperlukan untuk menggunakan utusan di dalam buruh pelabuhan. Jika Anda menggunakan tanpa buruh pelabuhan, ganti / dev / stdout dengan path ke file log biasa). Salin cuplikan ke bagian konfigurasi untuk manajer koneksi:


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

Hasilnya akan terlihat 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 default, Utusan memiliki string format yang mencakup rincian 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 dari string format ini:


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

Isi output dapat disesuaikan dengan mengatur bidang 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" 

String log juga bisa menjadi output dalam format JSON dengan mengatur bidang 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 informasi lebih lanjut tentang teknik pendaftaran utusan, kunjungi


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


Logging bukan satu-satunya cara untuk mendapatkan ide bekerja dengan Utusan Utusan. Ini memiliki fitur canggih bawaan untuk penelusuran dan metrik. Anda dapat menemukan lebih banyak dalam dokumentasi penelusuran atau melalui Script Pelacakan Interaktif .


Langkah 7 - Luncurkan


Sekarang Anda telah mentransfer konfigurasi dari NGINX ke Utusan Proksi. Langkah terakhir adalah menjalankan instance Proxy Utusan untuk mengujinya.


Jalankan dari pengguna


Di bagian atas konfigurasi NGINX, pengguna garis www www; menunjukkan bahwa NGINX telah diluncurkan sebagai pengguna dengan hak istimewa rendah untuk meningkatkan keamanan.


Utusan Proksi mengambil pendekatan berbasis cloud untuk mengelola siapa yang memiliki proses. Saat kami menjalankan Utusan Proksi melalui wadah, kami dapat menentukan pengguna dengan tingkat privilege rendah.


Luncurkan Utusan Utusan


Perintah di bawah ini akan meluncurkan Proxy Utusan melalui wadah Docker di host. Perintah ini menyediakan Utusan dengan kemampuan untuk mendengarkan permintaan masuk melalui port 80. Namun, seperti yang ditunjukkan dalam konfigurasi pendengar, Utusan Proxy mendengarkan lalu lintas masuk melalui port 8080. Ini memungkinkan proses untuk dijalankan sebagai pengguna dengan hak istimewa rendah.


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

Pengujian


Dengan proksi berjalan, tes sekarang dapat dilakukan dan diproses. Perintah cURL berikut ini mengeluarkan permintaan dengan header host yang ditentukan dalam konfigurasi proxy.


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

Permintaan HTTP akan menghasilkan kesalahan 503 . Hal ini disebabkan oleh fakta bahwa koneksi hulu tidak berfungsi dan tidak tersedia. Dengan demikian, Utusan Utusan tidak memiliki tujuan target yang tersedia untuk permintaan tersebut. Perintah berikut akan meluncurkan serangkaian layanan HTTP yang cocok dengan konfigurasi yang ditentukan untuk Utusan.


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

Dengan layanan yang tersedia, Utusan dapat berhasil proxy lalu lintas ke tujuannya.


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

Anda akan melihat respons yang menunjukkan wadah Docker mana yang telah memproses permintaan tersebut. Dalam Utusan Proksi log, Anda juga harus melihat string akses yang ditampilkan.


Header Respon HTTP Tambahan


Anda akan melihat tajuk HTTP tambahan di tajuk respons permintaan sebenarnya. Header menampilkan waktu yang dihabiskan host hulu untuk memproses permintaan. Ini dinyatakan dalam milidetik. Ini berguna jika klien ingin menentukan waktu layanan dibandingkan dengan latensi jaringan.


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

Konfigurasi terakhir


 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 } 

Informasi tambahan dari penerjemah


Instruksi pemasangan Utusan Proksi dapat ditemukan di https://www.getenvoy.io/


Secara default dalam rpm tidak ada konfigurasi layanan systemd.


Tambahkan config layanan 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 membuat direktori / etc / utusan / dan meletakkan config.yaml config di sana.


Dengan proxy utusan ada obrolan telegram: https://t.me/envoyproxy_ru


Utusan Proksi tidak mendukung distribusi konten statis. Jadi siapa yang dapat memilih fitur: https://github.com/envoyproxy/envoy/issues/378

Source: https://habr.com/ru/post/id469455/


All Articles