Tại sao tôi cần nginx khi tôi có uWSGI


62

Có nhiều hướng dẫn về cách cấu hình nginx để hợp tác với uWGSI khi tôi muốn triển khai ứng dụng Django.

Nhưng tại sao tôi cần nginx trong bộ này? Bản thân uWSGI có thể phục vụ các ứng dụng WSGI Python, nó có thể phục vụ các tệp tĩnh, nó cũng có thể làm SSL. Nginx có thể làm gì mà uWSGI không thể?


9
Tôi có thể thấy rằng câu hỏi này được đóng lại dựa trên ý kiến. Tôi hoàn toàn không đồng ý. Câu hỏi "nginx có thể làm gì mà uWSGI không thể?" là dựa trên thực tế.
user983447

1
Tôi thường không nói để mở lại, nhưng trong trường hợp này tôi đồng ý. Câu trả lời được chấp nhận và chấp nhận hiện tại là một câu trả lời hay, cho thấy câu hỏi, như được viết, thừa nhận các câu trả lời hợp lý và có liên quan; Tôi nghĩ rằng có lẽ làm cho nó một câu hỏi hay.
MadHatter

Câu trả lời:


55

Bạn không.

Dù sao đó cũng là câu trả lời đơn giản - bạn không cần nó. uWSGI tự nó là một máy chủ có khả năng.

Tuy nhiên, các máy chủ khác như nginx đã tồn tại lâu hơn và (có lẽ, dù sao) cũng an toàn hơn, cũng như có các tính năng bổ sung không được uWSGI hỗ trợ - ví dụ: cải thiện xử lý tài nguyên tĩnh (thông qua bất kỳ kết hợp Hết hạn hoặc Thẻ điện tử nào tiêu đề, nén gzip, gzip được nén trước, v.v.) có thể giảm đáng kể tải máy chủ và mạng; ngoài ra, một máy chủ như nginx trước ứng dụng Django của bạn cũng có thể triển khai bộ nhớ đệm cho nội dung động của bạn, giúp giảm tải máy chủ và thậm chí giúp tạo thuận lợi cho việc sử dụng CDN (thường không làm tốt với nội dung động ). Bạn thậm chí có thể đi xa hơn và có nginx trên một máy chủ hoàn toàn riêng biệt, đảo ngược các yêu cầu ủy quyền cho nội dung động sang một cụm máy chủ ứng dụng cân bằng tải trong khi xử lý chính nội dung tĩnh.

Ví dụ: blog của tôi (trong khi đó là WordPress, nó có nginx ở phía trước) được điều chỉnh để lưu các bài đăng trong bộ đệm trong 24 giờ và lưu vào các trang chỉ mục trong 5 phút; trong khi tôi không thấy đủ lưu lượng truy cập để điều đó thực sự quan trọng trong hầu hết thời gian, nó giúp VPS nhỏ bé của tôi vượt qua sự đột biến thường xuyên có thể đánh sập nó - chẳng hạn như lưu lượng truy cập lớn khi một trong những bài viết của tôi được chọn được đăng lên bởi một Twitterer với hàng ngàn người theo dõi, nhiều người trong số họ đã tweet lại cho hàng ngàn người theo dõi của họ.

Nếu tôi đang chạy một máy chủ uWSGI "trần" (và giả sử đó là một trang Django, chứ không phải WordPress), thì nó có thể đã đứng vững với nó - hoặc nó có thể bị sập và bị đốt cháy, khiến tôi mất khách truy cập . Có nginx trước nó để xử lý tải đó thực sự có thể giúp đỡ.

Tất cả những gì đang được nói, nếu bạn chỉ chạy một trang web nhỏ sẽ không thấy nhiều lưu lượng truy cập, thì không có nhu cầu thực sự cho nginx hoặc bất cứ điều gì khác - chỉ cần sử dụng uWSGI cho riêng mình nếu đó là điều bạn muốn làm. Mặt khác, nếu bạn sẽ thấy nhiều lưu lượng truy cập ... tốt, bạn vẫn có thể muốn uWSGI, nhưng ít nhất bạn nên xem xét một cái gì đó ở phía trước để giúp tải. Trên thực tế, bạn thực sự nên kiểm tra tải các cấu hình khác nhau với trang web đã hoàn thành của bạn để xác định những gì hoạt động tốt nhất cho bạn theo tải dự kiến ​​của bạn và sử dụng bất cứ thứ gì kết thúc.


3
Một điều mà tôi nghĩ là đáng chú ý ngoài những gì @Kromey nêu trong câu trả lời của họ là giao thức gốc cho uWSGI không phải là http mà là giao thức uwsgi. Giao thức uwsgi đơn giản và hiệu quả hơn để xử lý so với http và do đó gắn một máy chủ web đầy đủ tính năng hơn (nginx hoặc whatnot) trước ứng dụng uWSGI của bạn không thực sự nhân đôi nhiều quá trình xử lý và có thể mang lại lợi ích đáng kể tùy thuộc vào bạn nhu cầu.
Håkan Lindqvist

@ HåkanLindqvist hoàn toàn chính xác; chỉ cần làm rõ, uWSGI hoàn toàn có khả năng "nói" HTTP, do đó, có thể tự mình đứng vững, nhưng vâng, đáng chú ý là một máy chủ web phía trước sẽ sử dụng giao thức uwsgi, không phải HTTP, để nói chuyện với uWSGI, và do đó, có, rất ít sự trùng lặp của quá trình xử lý có liên quan.
Kromey

Đây là một câu trả lời hay, tuy nhiên, nó có thể được cải thiện với một liên kết đến tài liệu riêng của uWSGI về chủ đề này, điều này giải thích cụ thể hơn những gì bạn có thể làm với uWSGI: uwsgi-docs.readthedocs.io/en/latest/ của
Tobias McNulty

1

IMO, nếu bạn đặt trang web của mình lên Internet thay vì Lab, bạn có thể thấy sự khác biệt.

Hãy tưởng tượng một người dùng từ một quốc gia khác có trình duyệt web mở tốc độ mạng thấp để truy cập trang web của bạn. uWSGI sẽ xử lý kết nối http đó trong một luồng. Chuỗi đó có thể mất nhiều thời gian để chờ đợi một yêu cầu http hoàn chỉnh do tốc độ mạng thấp. Nếu kích thước nhóm luồng của bạn là 100, hãy tưởng tượng 100 người dùng chậm như vậy, điều gì sẽ xảy ra? Không có chủ đề nhàn rỗi để xử lý yêu cầu http khác.

Nhưng mọi thứ khá khác biệt đối với Nginx. Nginx được thiết kế theo 'Mẫu lò phản ứng'. Bạn có thể google 'Mẫu lò phản ứng' để xem nó hoạt động như thế nào. Nói tóm lại, kết nối tốc độ chậm không ảnh hưởng đến nó để xử lý các yêu cầu http khác.


1
Tôi nghi ngờ sử dụng Nginx sẽ thay đổi điều đó. Khi một ứng dụng Django được lưu trữ trên Apache bằng WSGI, chức năng xem sẽ được gọi trước khi bất kỳ dữ liệu POST nào được đọc từ một ổ cắm. Vì vậy, nếu máy khách chậm, nó sẽ chiếm một luồng từ yêu cầu đã được nhận cho đến khi dữ liệu POST được nhận. Tại sao thay thế Apache bằng Nginx lại thay đổi điều đó?
kasperd

1
Như những gì tôi biết, theo mặc định, Nginx sẽ không ủy quyền yêu cầu HTTP đến máy chủ ứng dụng phụ trợ cho đến khi nhận được yêu cầu HTTP hoàn chỉnh. Vì vậy, đối với máy chủ ứng dụng như Django, những gì họ nhận được luôn là kết nối và yêu cầu HTTP nhanh, không mất thời gian chờ đợi một yêu cầu http hoàn chỉnh, sau khi xử lý nhiệm vụ sớm, luồng chạy có thể không hoạt động cho yêu cầu http tiếp theo.
Jcyrss

1
Nó được gọi là bộ đệm yêu cầu, được bật theo mặc định trong Nginx (trong các phiên bản cũ hơn của Nginx, không thể tắt tính năng này): nginx.org/en/docs/http/iêu
Tobias
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.