2010-09-03 34 views
10

Câu hỏi này không phải là nginx vs apache. Tôi quan tâm nhiều hơn đến lợi thế kiến ​​trúc của NGinx trên Apache. Như tôi đã có thể hiểu -máy chủ web nginx và apache

  • nginx là một máy chủ web theo hướng sự kiện, không đồng bộ, hoạt động tốt hơn Apache.

Tại sao điều này? Apache rơi ở đâu?

+0

Bạn chắc chắn Nginx hoàn toàn không đồng bộ? –

Trả lời

13

Không có lý do nào tại sao nginx nghiêm chỉnh "hoạt động tốt hơn" Apache. Đối với nhiều mẫu tải, bạn có thể cấu hình Apache để nó xử lý tải này. Đối với một số (rất bận rộn) các mẫu tải nginx trong cấu hình mặc định có thể biểu hiện sự suy giảm hiệu năng, và có thể yêu cầu tinh chỉnh để hoạt động đúng.

Tuy nhiên, đó là trải nghiệm của nhiều người, nginx thực sự hoạt động "tốt hơn" ra khỏi hộp hoặc điều chỉnh đơn giản. Hiệu suất của nhiều hệ thống được cải thiện rõ rệt khi nginx được cài đặt như một giao diện người dùng, với Apache được chuyển về phía sau.

Lý do chính là nginx hướng sự kiện và chứa máy trạng thái xử lý vòng đời của các kết nối. Bằng cách đó, bạn có thể có rất ít "công nhân" quy trình, mỗi xử lý nhiều hàng trăm hoặc thậm chí hàng ngàn kết nối cùng một lúc. Đối với Apache, bạn sẽ phải chạy cùng một số tiến trình con (hoặc chủ đề) như số lượng kết nối.

Rõ ràng là ba quy trình chống lại một nghìn quy trình phải là một chiến thắng lớn, ít nhất là.

Đặc biệt, nginx dễ dàng cho phép giảm đáng kể tải các tệp tĩnh phân phối (hình ảnh, Javascript, CSS). Xử lý mỗi kết nối bổ sung trong nginx là rất rẻ, vì vậy các tệp tĩnh thường chiếm đa số về số lượng yêu cầu, bạn sẽ có được xử lý hiệu quả.

Ngoài ra, hiệu suất nginx tốt hơn cho "khách hàng chậm". Khi bạn có Apache nhìn thẳng vào Internet, và khách hàng gửi yêu cầu trên (tắc nghẽn) dòng, máy chủ (nhanh) của bạn sẽ phải kiên nhẫn ăn (chậm) khách hàng, chờ đợi cho đến khi nó tiêu thụ toàn bộ phản ứng. Vì vậy, Apache con (hoặc thread) không thể làm bất cứ điều gì hữu ích. Nginx công nhân, mặt khác, chỉ cần giữ kết nối chậm này trong bộ mô tả epoll, tất cả trong khi xử lý các kết nối khác.

Từ quan điểm khái niệm, bạn nên luôn tách riêng "lớp" yêu cầu, với hồ sơ hiệu suất và nhu cầu riêng của chúng. Ví dụ: phục vụ các tệp tĩnh nhỏ là một trong các lớp như vậy; phục vụ các trang động là một lớp khác; phục vụ các tệp tĩnh lớn là một tệp khác. Giới thiệu nginx cho hệ thống của bạn ngầm xử lý sự tách biệt này.

+0

Trích dẫn: * Đối với Apache, bạn sẽ phải chạy cùng một số quá trình con (hoặc chủ đề) như số lượng kết nối. * Tôi tin rằng điều này không áp dụng nếu bạn sử dụng 'mpm_event'? –

+0

Không, nó cũng áp dụng cho 'mpm_event' (từ đọc http://httpd.apache.org/docs/2.4/mod/event.html,' mpm_event' chỉ là 'worker' với một twist). Apache không có mô-đun FSM thích hợp. – squadette

+0

@squadette Từ ít đọc mã 'mpm_event' của tôi, tôi không đồng ý: với' mpm_event' công nhân chỉ được sử dụng để thực hiện I/O khi ổ cắm sẵn sàng cho nó và chạy các bộ xử lý và bộ lọc, ví dụ: trong cùng một cách các công nhân được sử dụng trong libevent (libevhtp), Cherokee, vv Dưới 'mpm_event' bạn có thể có hàng ngàn kết nối với chỉ một vài công nhân. – ArtemGr

Các vấn đề liên quan