Apache vs Nginx


29

Tôi đã nghiên cứu sự khác biệt giữa Apache và Nginx gần đây và bối rối về việc tôi nên chọn cái nào.

Tôi đã thực hiện một số tìm kiếm nhưng không có so sánh rõ ràng giữa hai người và tôi đã tự hỏi liệu ai đó ở đây có thể đưa ra quan điểm của họ về sự khác biệt giữa hai người.

Kiến thức hiện tại của tôi cho phép tôi hiểu rằng mod_php nhanh hơn và an toàn hơn fastcgi tuy nhiên Apache còn tệ hơn nhiều khi kết nối đồng thời và tiêu thụ bộ nhớ.

Trang web của tôi đang sử dụng nhiều cuộc bỏ phiếu dài nhưng có cơ sở web không phải là AJAX (tức là Apache với việc bỏ phiếu dài trên đầu trang).

Giải pháp ban đầu của tôi đối với các vấn đề về bộ nhớ Apaches là gửi cuộc thăm dò dài qua node.js và sau đó lấy node.js để truy cập Apache cứ sau 2 giây, trong trường hợp đó Apache sẽ không có kết nối mở mà thay vào đó là node.js. Tôi đã nhận ra rằng điều này có thể không đủ tốt và đang xem xét các giải pháp khác nhau. Tôi vẫn quan tâm liệu ý tưởng ban đầu của tôi có hiệu quả không.

Vì vậy, cái nào tốt hơn cho web hiện đại? Apache hay Nginx?

Cập nhật: Tất cả các đề xuất được đưa ra là tốt và hợp lệ. Tôi đã đi với ý tưởng thứ hai ban đầu là sử dụng máy chủ Nginx đầy đủ. Tôi hài lòng rằng là một máy chủ chuyên dụng, tôi không thể gặp vấn đề bảo mật từ fastcgi và vì các tập lệnh bỏ phiếu dài của tôi cần phải được viết bằng PHP, tôi yêu cầu một máy chủ có thể xử lý các kết nối đồng thời tải cao và Apache không thể làm được điều đó cho dù có bao nhiêu Tôi thay đổi cấu trúc nó vẫn sẽ là bộ nhớ đói.

Tôi đã đánh dấu câu trả lời của Martin F vì anh ấy đã trả lời rõ ràng và đầy đủ cho những câu hỏi của tôi đến mức tôi cảm thấy anh ấy xứng đáng với điểm đó, tuy nhiên, cả ba câu trả lời đều tốt và hợp lệ và chắc chắn sẽ xem xét sử dụng proxy ngược cho một trang web khác mà tôi sở hữu vì tôi vừa tìm thấy thứ gì đó rất rất rất kool mà Nginx có thể làm trong việc ủy ​​quyền.

Cảm ơn,

Câu trả lời:


28

Bạn dường như có một vài quan niệm sai lầm mà tôi cảm thấy cần phải giải quyết.

Trước hết, mod_php chỉ nhanh hơn một chút, tất cả các thử nghiệm của tôi đã chỉ ra rằng sự khác biệt rất nhỏ đến mức không đáng để bao thanh toán. Tôi cũng nghi ngờ rằng khía cạnh bảo mật có liên quan đến bạn khi bạn dường như đang nhìn vào một máy chủ chuyên dụng và mod_php thực sự chỉ có lợi thế trong môi trường dùng chung - thực tế, trong môi trường dành riêng, php-fpm sẽ có lợi thế vì PHP và máy chủ web của bạn hiện chạy như các quy trình khác nhau và thậm chí còn không bao gồm các tùy chọn ghi nhật ký tuyệt vời trong php- fpm như đăng nhập chậm.

Nếu thế giới là đen và trắng, tôi sẽ nói hãy cài đặt nginx thuần túy và biên dịch php với php-fpm. Thực tế hơn nếu bạn đã có Apache hoạt động thì hãy biến nginx thành một proxy ngược lại cho apache và bạn có thể tiết kiệm một vài giờ thời gian thiết lập và sự khác biệt về hiệu suất sẽ rất nhỏ.

Nhưng hãy giả sử thế giới là đen và trắng trong một giây, bởi vì điều này làm cho các thiết lập tuyệt vời hơn nhiều. Bạn làm nginx + php-fpm cho máy chủ web của bạn. Để giải quyết các video tải lên, bạn sử dụng mô-đun tải lên và mô-đun tiến trình tải lên cho nginx. Điều này có nghĩa là máy chủ web của bạn chấp nhận tải lên và chuyển đường dẫn tệp vào PHP khi hoàn thành, do đó tệp không cần phải được truyền giữa nginx và PHP thông qua giao thức fastcgi. (Tôi có cái này trong một thiết lập trực tiếp và nó hoạt động rất tốt, btw!)

Để người dùng tải xuống, bạn sử dụng tính năng giống như x-send-file của nginxs được gọi là x-accel-redirect, về cơ bản bạn thực hiện xác thực của mình trong PHP và đặt tiêu đề mà nginx chọn và bắt đầu chuyển tệp đó. PHP kết thúc thực thi và máy chủ web của bạn đang xử lý việc chuyển tiền, thật tuyệt! (Một lần nữa, tôi có cái này trong một thiết lập trực tiếp và nó hoạt động rất tốt)

Để phân phối tệp trên các máy chủ hoặc các hoạt động chạy dài khác, chúng tôi nhận thấy rằng PHP không thực sự phù hợp nhất cho việc này, vì vậy chúng tôi cài đặt gearman, một máy chủ công việc có thể phân phối công việc giữa các công nhân trên các máy chủ khác nhau, những công nhân này có thể được viết bằng bất kỳ ngôn ngữ. Do đó, bạn có thể tạo một nhân viên phân phối và sinh ra 5 người trong số họ bằng tổng bộ nhớ 200 KB thay vì 100 MB PHP sẽ sử dụng. Ngọt. (Tôi cũng có chương trình này đang hoạt động, vì vậy tất cả đều thực sự có thể)

Trong trường hợp bạn chưa chọn nó, tôi nghĩ nhiều vấn đề của bạn không liên quan đến máy chủ web của bạn, bạn chỉ nghĩ như vậy bởi vì Apache buộc nó phải liên quan đến máy chủ web của bạn do cấu trúc của nó, thường có nhiều công cụ tốt hơn cho công việc so với PHP và PHP là ngôn ngữ biết điều này và cung cấp các tùy chọn tuyệt vời để giảm tải công việc mà không bao giờ rời khỏi PHP.

Tôi rất muốn giới thiệu nginx, nhưng tôi cũng nghĩ bạn nên xem xét các lựa chọn khác cho các vấn đề khác của mình, nếu bạn gặp vấn đề về tỷ lệ hoặc hiệu suất thì hãy viết thư cho tôi. Tôi không biết liệu bạn có thể gửi tin nhắn qua đây không nhưng hãy viết thư cho tôi tại martin@bbtn.us vì tôi không theo dõi lỗi máy chủ vì bất cứ điều gì không được gắn thẻ nginx. :)


1
Chết tiệt, điều đó thực sự đã làm sáng tỏ mọi thứ :) cảm ơn đó là lời giải thích mà tôi đang tìm kiếm. Tôi nghĩ bây giờ tôi khá bị bán khi học Nginx vì Apache sẽ bị nghẹt thở và chết khi sử dụng trang web của tôi. May mắn thay, nó trông thực sự khá dễ dàng để di chuyển nó qua. Ý tôi là mọi người trên node.js đã nói viết hầu hết mọi thứ trong đó và chỉ thăm dò lớp phiên php của bạn nếu bạn thực sự cần (điều này tôi làm trừ khi có cách phát hiện khi người dùng đóng cửa sổ của họ: P). Phải, tôi đang chạy trong một trang trại máy chủ lớn vì vậy biết rằng không có mối đe dọa an ninh nào giúp ích cho hàng tấn, cảm ơn vì lời giải thích tuyệt vời :)
Sammaye

Tôi đã nhìn vào này: joeandmotorboat.com/2008/02/28/... và điều này: blog.webfaction.com/a-little-holiday-present và nó đã thực sự đã cho tôi kiddying khi nghĩ đến việc có thể để lâu thăm dò ý kiến ​​trái tim tôi thực sự. Không phải là một vấn đề bộ nhớ duy nhất không giống như Apache :)
Sammaye

Đợi bạn nói rằng tôi có thể làm cho một nhân viên đa luồng trong java và php có thể làm việc xung quanh nó một cách hoàn hảo không? Ý tôi là vấn đề lớn nhất mà tôi thấy là máy chủ vì tôi gặp vấn đề về bộ nhớ lớn với Apache khi sử dụng bỏ phiếu dài, điều này rất phổ biến ... đã được sửa bởi Nginx.
Sammaye

1
Về cơ bản là có, tôi có các nhân viên phân phối tệp được viết bằng C, sử dụng phần mở rộng gearman cho PHP Tôi gửi một công việc phân phối đến máy chủ công việc gearman và nó gửi nó cho một worker, có thể được viết bằng bất kỳ ngôn ngữ nào; PHP, Java, C, v.v. Công nhân này sau đó thực hiện công việc của mình và báo cáo lại trạng thái cho gearman, báo cáo lại cho PHP. (trừ khi một công việc nền được chọn, trong trường hợp PHP kết thúc mà không cần chờ đợi)
Martin Fjordvald

2
Tôi biết đây là một bài viết cũ nhưng tôi phải nói rằng, đây là một trong những bài viết nhiều thông tin nhất mà tôi đã tìm thấy về chủ đề nginx vs apache. Thans Martin, +1.
Akoi Meexx

5

Tôi sẽ đề nghị chạy nginx như một proxy ngược. Nó sẽ xử lý tất cả các tệp tĩnh và được lưu trong bộ nhớ cache của bạn (trong đó nhanh hơn đáng kể so với Apache / ít chi phí bộ nhớ) và sau đó chuyển tiếp tất cả các yêu cầu về nội dung động tới Apache.


Vâng, đây là điều mà hầu hết mọi người dường như đang làm, tôi chắc chắn sẽ phải xem xét điều này :)
Sammaye

1
Hãy nhớ cài đặt mod_rpaf cho Apache để bạn có thể chuyển qua địa chỉ IP của máy khách cho mục đích ghi nhật ký (nếu không nhật ký Apache sẽ hiển thị tất cả các yêu cầu từ 127.0.0.1), hãy thêm thông tin sau vào nginx config: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
Greg Annandale

Tôi tự hỏi một điều trước khi tôi thử tối nay. Nếu tôi định tuyến qua Nginx tới Apache phục vụ PHP của tôi thì điều đó có nghĩa là việc bỏ phiếu dài vẫn có vấn đề tương tự như Apache hoặc việc gọi nó theo proxy ngược lại khiến Apache hành động theo cách khác?
Sammaye

1

Tôi không chắc chắn rằng mod_php nhanh hơn các lựa chọn thay thế, bạn đã đọc nó ở đâu? Tôi đã thực hiện một số thử nghiệm trong phòng thí nghiệm với nginx + php-fpm và từ những gì tôi đã đo được, nó sẽ vượt qua mọi thiết lập khác.

Hãy xem thiết lập này: http://interfacelab.com/nginx-php-fpm-apc-awclaw/

Tôi đã thiết lập nó gần giống nhau, ngoại trừ việc tôi sử dụng các gói PHP từ http://www.dotdeb.org/ - wich bao gồm gói php-fpm và tập lệnh init đã sẵn sàng để sử dụng. Tôi không sử dụng memecache hoặc syck.


stackoverflow.com/questions/78108/ đá đã nhận nó từ đây và tôi đã kiểm tra hướng dẫn sử dụng php và nó nói rằng php_mod cung cấp lợi thế đáng kể so với các phiên bản cgi. Thiết lập của bạn có vẻ tốt. Có vẻ rất dễ dàng. Tôi sẽ xem xét nó :)
Sammaye

2
Nó tuyên bố rằng CGI chậm hơn nhiều so với mô-đun dựng sẵn - không phải FastCGI :)
pauseka

1
Chà - nếu bạn lo lắng về việc xử lý PHP sắp chết (hoặc hết thời gian) thì FastCGI (hoặc PHP-FPM) là cách tốt nhất. Nó có thể giết chết quá trình trẻ em chết mà không làm gián đoạn các hoạt động khác.
pauseka

1
Vâng. Hoặc, tốt, nó phụ thuộc. Có bao nhiêu (tối đa) số lượng yêu cầu chậm bạn sẽ xử lý cùng một lúc? Đặt các luồng PHPM tối đa cho điều đó, cộng với số lượng cgi "nhanh" mà bạn muốn có. Tôi đã nghe nói về những người chạy 200 đứa trẻ PHP-FPM trên một máy chủ có RAM 4GB, vì vậy tôi sẽ không lo lắng quá nhiều về điều này nếu tôi là bạn. Phiên bản tiếp theo của PHP (5.3.3) sẽ bao gồm PHP-FPM theo tiêu chuẩn, trong đó cũng có một công cụ quảng cáo đi kèm - nó sẽ mở rộng theo số lượng yêu cầu bạn đang chờ xử lý.
pauseka

1
Tôi có thể dễ dàng chạy trên nhiều máy chủ (có thể lên tới 10) nhưng nếu tôi có thể phù hợp với 200 yêu cầu có thể được thăm dò lâu trên máy chủ 4GB thì điều này sẽ gần bằng một nửa so với 20 máy chủ tôi sẽ cần chạy Apache. hmmmm ... tôi sẽ cần kiểm tra điều này tối nay
Sammaye
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.