Pertanyaan Mengapa saya perlu Nginx dan sesuatu seperti Gunicorn?


Saya mencari jawaban yang terlalu sederhana untuk pertanyaan berikut. Saya mencoba membangun pemahaman mendasar tentang bagaimana Nginx bekerja bersama sesuatu seperti Gunicorn.

Apakah saya perlu Nginx dan sesuatu seperti Gunicorn untuk menyebarkan aplikasi Django di Nginx?

Jika demikian, apa yang sebenarnya menangani permintaan HTTP?

Ps. Saya tidak ingin menggunakan Apache dan mod_wsgi!


182
2017-11-15 21:16




Apache dan mod_wsgi adalah cara paling sederhana untuk menerapkan jembatan antara aplikasi Django dan permintaan http yang juga sangat mampu dalam lingkungan produksi. Bagi banyak pengembang, ini berarti 'Apache lebih baik daripada nginx' jika mereka tahu tetapi tahu 'betamax lebih baik daripada VHS', sayangnya, aturan Dogma - MagicLAMP


Jawaban:


Terlalu disederhanakan: Anda memerlukan sesuatu yang mengeksekusi Python tetapi Python bukan yang terbaik dalam menangani semua jenis permintaan.

[disclaimer: Saya seorang pengembang Gunicorn]

Kurang disederhanakan: Terlepas dari apa server aplikasi yang Anda gunakan (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy), segala jenis penerapan non-sepele akan memiliki sesuatu di hulu yang akan menangani permintaan yang seharusnya tidak ditangani oleh aplikasi Django Anda. Contoh-contoh sepele dari permintaan semacam itu melayani aset statis (images / css / js).

Ini menghasilkan dua tingkatan pertama dari "arsitektur tiga tingkat" klasik. Yaitu, webserver (Nginx dalam kasus Anda) akan menangani banyak permintaan untuk gambar dan sumber daya statis. Permintaan yang perlu dibuat secara dinamis kemudian akan diteruskan ke server aplikasi (Gunicorn dalam contoh Anda). (Sebagai samping, ketiga dari tiga tingkatan adalah basis data)

Secara historis, masing-masing tingkatan ini akan di-host pada mesin yang terpisah (dan kemungkinan besar akan ada beberapa mesin dalam dua tingkatan pertama, yaitu: 5 server web mengirim permintaan ke dua server aplikasi yang pada gilirannya meminta satu database).

Di era modern sekarang kita memiliki aplikasi semua bentuk dan ukuran. Tidak setiap proyek akhir pekan atau situs bisnis kecil benar-benar membutuhkan horsepower dari beberapa mesin dan akan berjalan cukup bahagia pada satu kotak. Ini telah melahirkan entri baru ke dalam berbagai solusi hosting. Beberapa solusi akan mengawinkan server aplikasi ke server web (Apache httpd + mod_wsgi, Nginx + mod_uwsgi, dll). Dan itu tidak jarang untuk menjadi tuan rumah database pada mesin yang sama sebagai salah satu kombinasi server web / aplikasi ini.

Sekarang dalam kasus Gunicorn, kami membuat keputusan khusus (menyalin dari Ruby Unicorn) untuk menjaga hal-hal yang terpisah dari Nginx sambil mengandalkan perilaku proksi Nginx. Khususnya, jika kita dapat berasumsi bahwa Gunicorn tidak akan pernah membaca koneksi langsung dari internet, maka kita tidak perlu khawatir tentang klien yang lambat. Ini berarti bahwa model pemrosesan untuk Gunicorn sangatlah sederhana.

Pemisahan juga memungkinkan Gunicorn ditulis dengan Python murni yang meminimalkan biaya pengembangan sementara tidak berdampak signifikan terhadap kinerja. Ini juga memungkinkan pengguna kemampuan untuk menggunakan proxy lain (dengan asumsi mereka buffer dengan benar).

Untuk pertanyaan kedua tentang apa yang sebenarnya menangani permintaan HTTP, jawaban sederhananya adalah Gunicorn. Jawaban lengkapnya adalah Nginx dan Gunicorn yang menangani permintaan tersebut. Pada dasarnya, Nginx akan menerima permintaan dan jika itu permintaan yang dinamis (umumnya berdasarkan pola URL) maka itu akan memberikan permintaan itu kepada Gunicorn, yang akan memprosesnya, dan kemudian mengembalikan respon ke Nginx yang kemudian meneruskan tanggapan kembali ke aslinya klien.

Jadi sebagai penutup, ya. Anda membutuhkan Nginx dan Gunicorn (atau yang serupa) untuk penyebaran Django yang tepat. Jika Anda secara khusus ingin menjadi tuan rumah Django dengan Nginx, maka saya akan menyelidiki Gunicorn, mod_uwsgi, dan mungkin CherryPy sebagai kandidat untuk sisi Django.


267
2017-11-15 21:49



Terima kasih telah meluangkan waktu untuk menulis jawaban yang begitu mendetail! Bacaan yang direkomendasikan pada "arsitektur tingkat 3" ini? - a.m.
Jawaban bagus, namun saya tidak mengerti masalah ini dengan klien yang lambat. - Mads Skjern
@MadsSkjern Saya menduga di sini, tetapi jika Anda menganggap semua klien cepat, maka Anda dapat menggunakan kumpulan proses pekerja tetap, dan tidak perlu kode untuk kasus di mana banyak atau semuanya diblokir menunggu klien. - Jonathan Hartley
@saya. en.wikipedia.org/wiki/Multitier_architecture - Jonathan Hartley
aplikasi Django saya hanya melayani json tidak ada konten statis yang bisa saya gunakan dengan gunicorn dan no nginx - Sar009


Saya suka penjelasan ini dalam kesederhanaannya:

Nginx akan menghadapi dunia luar. Ini akan melayani file media (gambar,   CSS, dll) langsung dari sistem file. Namun, itu tidak bisa bicara   langsung ke aplikasi Django; perlu sesuatu yang akan menjalankan   aplikasi, umpan permintaan dari web, dan kembali tanggapan.

Itu pekerjaan Gunicorn. Gunicorn akan membuat soket Unix, dan melayani   tanggapan terhadap nginx melalui protokol wsgi - soket melewatkan data   kedua arah:

The outside world <-> Nginx <-> The socket <-> Gunicorn

https://gist.github.com/Atem18/4696071


20
2017-12-13 07:52



Tidak harus ada soket, untuk berjaga-jaga jika ada yang bertanya-tanya. - akshay


Saya mencari jawaban yang terlalu disederhanakan ...

Apakah saya perlu Nginx dan sesuatu seperti Gunicorn untuk menyebarkan aplikasi Django di Nginx?

Jika demikian, apa yang sebenarnya menangani permintaan HTTP?

Jawaban yang terlalu disederhanakan:

IYA NIH.

Baik Nginx dan Gunicorn.

Karena Anda menerapkan pada Nginx, tentu Anda membutuhkan Nginx.

Karena Anda menyebarkan Django, yang merupakan kerangka kerja web, Anda memerlukan sesuatu yang menjembatani pembicaraan antara server web (Nginx) dan kerangka web (Django). Di dunia Python, hal seperti itu disebut server WSGI (tetapi anggaplah itu seperti perangkat tengah), contohnya termasuk Gunicorn dan uWSGI. Saat menangani permintaan, Nginx mem-proxy permintaan ke Gunicorn atau uWSGI, yang pada gilirannya memanggil kode Django dan mengembalikan respons.

Dokumen ini dan jawaban Paulus akan membantu Anda mempelajarinya lebih baik.


0
2017-10-26 21:42