Mengapa mengatur Nginx sebagai proxy terbalik adalah ide yang bagus?

41

Saya memiliki situs Django yang berjalan di Gunicorn dengan proxy terbalik melalui Nginx. Bukankah Nginx hanya overhead tambahan yang tidak perlu? Bagaimana menambahkannya di atas bantuan Gunicorn?

Yang satu
sumber

Jawaban:

53

Saya akan fokus pada perilaku klien yang lambat, dan bagaimana konfigurasi Anda menanganinya, tetapi jangan tergoda untuk percaya bahwa itulah satu-satunya manfaat. Metode yang sama yang menguntungkan klien lambat juga memiliki manfaat untuk klien cepat, penanganan SSL, berurusan dengan lonjakan lalu lintas, dan aspek lain dari melayani HTTP di Internet.

Gunicorn adalah perangkat lunak pre-forking. Untuk komunikasi latensi rendah, seperti load balancer ke server aplikasi atau komunikasi antar layanan, sistem pre-fork bisa sangat sukses. Tidak ada biaya dalam memintal proses untuk menangani permintaan, dan satu proses tunggal dapat didedikasikan untuk menangani satu permintaan; penghapusan hal-hal ini dapat menyebabkan keseluruhan sistem lebih cepat, lebih efisien hingga jumlah koneksi simultan melebihi jumlah proses yang tersedia untuk menanganinya.

Dalam situasi Anda, Anda berhadapan dengan klien latensi tinggi melalui internet. Klien yang lambat ini dapat mengikat proses yang sama. Ketika QPS penting, kode aplikasi perlu menerima, menangani, dan menyelesaikan permintaan secepat mungkin sehingga dapat beralih ke permintaan lain. Ketika klien lambat berkomunikasi secara langsung dengan sistem Anda, mereka mengikat proses itu dan memperlambatnya. Alih-alih menangani dan membuang permintaan secepat mungkin, proses itu sekarang juga harus menunggu klien yang lambat. QPS yang efektif turun.

Menangani banyak koneksi dengan cpu yang sangat sedikit dan biaya memori adalah kemampuan server asinkron seperti Nginx. Mereka tidak terpengaruh dengan cara negatif yang sama oleh klien lambat karena mereka mahir menangani sejumlah besar klien secara bersamaan. Dalam kasus Nginx, menjalankan perangkat keras modern dapat menangani puluhan ribu koneksi sekaligus.

Nginx di depan server pre-forking adalah kombinasi yang hebat. Nginx menangani komunikasi dengan klien, dan tidak mengalami penalti untuk menangani klien yang lambat. Ini mengirimkan permintaan ke backend secepat backend dapat menangani permintaan tersebut, memungkinkan backend menjadi seefisien sumber daya server mungkin. Backend mengembalikan hasilnya segera setelah menghitungnya, dan Nginx memberikan respons untuk memberi makannya agar memperlambat klien dengan kecepatan mereka sendiri. Sementara itu, backend dapat beralih ke menangani permintaan lain meskipun klien lambat masih menerima hasilnya.

blueben
sumber
3
nitpicking: gunicorn adalah server berbasis acara preforking. setiap proses menangani beberapa koneksi secara tidak sinkron. Itu tidak mengubah fakta bahwa nginx memiliki biaya yang jauh lebih rendah per koneksi, membuat sisa penjelasan Anda valid.
Javier
4
Dan sebagai bonus, Nginx menghentikan "Slow HTTP DoS Attacks" dengan sangat efektif. Satu hal yang akan saya tambahkan adalah bahwa ketika menggunakan Nginx itu dapat mengacaukan hal-hal terkait IP apa pun yang mungkin Anda lakukan di Gunicorn, misalnya auth oleh ip, logging dll. Kecuali Gunicorn mendukung melihat header X-Forwarded-For. Saya tidak terbiasa dengan Gunicorn jadi saya tidak bisa mengatakan seberapa besar masalah ini bagi Anda.
Niall Donegan
Terima kasih atas informasinya Javier, saya tidak lebih dari akrab dengan gunicorn.
blueben
Jawaban Anda harus sesuai untuk pertanyaan ini: stackoverflow.com/q/13182892/719276
arthur.sw
Apakah ini ada hubungannya dengan opsi * _busy_buffer_size?
CMCDragonkai
2

@ Benlueben benar. Contoh spesifik dan umum tentang apa yang bisa terjadi ketika proxy terbalik tidak digunakan adalah bahwa database backend dapat kehabisan koneksi database menangani di mana tidak ada proxy dan ada lonjakan lalu lintas. Ini disebabkan koneksi yang lambat untuk dirilis seperti yang dijelaskan oleh @blueben.

Naluri pertama untuk melihat gagang basis data kehabisan mungkin untuk mendukung lebih banyak koneksi basis data. Tetapi dengan menambahkan proksi terbalik di depan aplikasi, Anda akan melihat jumlah koneksi basis data yang diperlukan untuk beban tinggi turun secara signifikan dan stabil - tingkat koneksi basis data tidak akan melonjak hampir sebanyak ketika ada lonjakan lalu lintas.

Nginx juga hebat dalam melayani konten statis, caching dan berbagai tugas HTTP lainnya, membiarkan server aplikasi Anda fokus menjadi server aplikasi.

Mark Stosberg
sumber
0

@naill Donegan menyebutkan ini dalam komentar di atas, tetapi cukup penting untuk mendapatkan jawaban.

Nginx menghentikan serangan kukang yang tidak ditangani oleh gunicorn.

rox0r
sumber