Khi nào tôi nên chuyển sang NGinx?


11

Tôi có một máy chủ với một số tên miền và ứng dụng đang chạy, tất cả đều thông qua Apache. Hiện tại mọi thứ đều ổn nhưng tôi có kế hoạch phát triển một số ứng dụng web rất hiệu năng (sử dụng C ++ với CPPCMS), bắt đầu với máy chủ của tôi để thử nghiệm, có thể chỉ nhận một máy chủ riêng cho ứng dụng này khi nó sẵn sàng.

Dù sao đi nữa, tôi đã nghe rất nhiều về NGinx, điều đó dường như hiệu quả hơn Apache, vì vậy tôi đã tự hỏi liệu nó có đáng để làm việc với nó cho dự án mới đó không. Điều đó không rõ ràng trong đầu tôi vì tôi không biết loại tắc nghẽn hiệu suất NGinx nào khắc phục chính xác.

Tôi không phải là người sử dụng năng lượng của Apache, tôi là một quản trị viên linux kém và tôi không phát triển ứng dụng web nhiều (nhưng tôi có khái niệm). Tôi chủ yếu chuyên viết phần mềm nên phần máy chủ web đôi khi rất khó hiểu với tôi. Mỗi lần tôi phải cấu hình một trang web thông qua apach, tôi cần rất nhiều thời gian duyệt trong tài liệu để đảm bảo tôi không phá vỡ mọi thứ.

Điều đó đang được nói, tôi nghĩ rằng tôi đang trở nên tốt hơn rất nhiều ở bên này nhưng vẫn cần lời khuyên. Tôi đã tìm thấy một số tệp cấu hình nginx xung quanh và điều đó có vẻ dễ hiểu hơn các tệp Apache, nhưng có lẽ tôi đã nhầm?

Từ những thông tin tôi thu thập được, NGinx sẽ là lựa chọn tốt nhất khi bạn muốn cân bằng tải, vì vậy nếu ứng dụng của bạn trải đều trên một số máy, phải không? Khi tôi nghĩ ứng dụng của mình để nói xấu (và hiệu suất), có vẻ như đó là thứ tôi cần, nhưng có lẽ tôi cần biết thêm nhiều điều về việc khi chuyển từ Apache sang NGinx thật thú vị. Có đáng để chuyển sang NGinx cho tất cả các ứng dụng hiện tại của tôi không? Nó có giá bao nhiêu? (Ý tôi là, việc chuyển đổi từ cái này sang cái kia có tốn kém không?) Tôi có thể sử dụng cả Apache và NGinx trên cùng một máy mà không gặp vấn đề gì không?

Lưu ý bên lề : Xin đừng thúc giục tôi sử dụng các ngôn ngữ được dịch thay vì C ++, nó không liên quan đến câu hỏi. Xem trang hợp lý CPPCSM để xem loại ứng dụng nào có thể hưởng lợi từ nó. Tôi hoàn toàn hiểu những nhược điểm (so với các ứng dụng trong Ruby và Python, mà tôi đã sử dụng cho các ứng dụng web ít ngốn điện hơn) và tôi thấy ổn với nó.

Câu trả lời:


10

Một số điểm:

Sự khác biệt chính giữa Apache và Nginx hoặc Lighttpd (mà cá nhân tôi rất thích) là kiến ​​trúc:

  1. Apache xử lý một kết nối cho mỗi quá trình hoặc mỗi luồng (tùy thuộc vào mod-XYZ)
  2. Nginx và Lighttpd là các luồng đơn xử lý nhiều kết nối trong vòng lặp sự kiện.

Kết quả là:

  1. Nginx và Lighttpd có quy mô tốt hơn nhiều với số lượng kết nối đồng thời cao, giả sử với 1000 kết nối, Apache sẽ gần như chết vì nó sẽ yêu cầu 1000 quy trình trong mod-prefork hoặc 1000 luồng trong mod-worker.

    Nếu bạn dự định sử dụng các công nghệ Comet trong đó mỗi kết nối yêu cầu kết nối HTTP bỏ phiếu dài thì Apache sẽ không được chấp nhận vì nó không có quy mô tốt.

  2. Nginx và Lighttpd tiêu thụ ít bộ nhớ hơn vì mỗi kết nối yêu cầu + - hai ổ cắm (HTTP và FastCGI), bộ nhớ trung gian và một số trạng thái, trong khi Apache sẽ cần toàn bộ luồng bao gồm cả ngăn xếp và những thứ khác.

Từ kinh nghiệm cá nhân của tôi về điểm chuẩn, tôi đã làm Lighttpd (và tôi giả sử Nginx cũng vậy) nhanh hơn một chút với phụ trợ FastCGI sau đó là Apache nhưng đây là số lượng kết nối thấp.

Bây giờ một điểm khác là khi bạn muốn thực hiện một số cân bằng tải bằng các kết nối FastCGI.

Trong kiến ​​trúc truyền thống có

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Bởi vì Apache xử lý các nhóm quy trình mà mỗi tiến trình đang chạy mod-PHP (hoặc các chế độ khác)

Khi bạn sử dụng CppCMS tự xử lý các nhóm, bạn có thể làm điều gì đó khác biệt:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Vì vậy, về cơ bản, bạn không cần một mức độ gián tiếp khác vì CppCMS xử lý tiến trình, luồng và nhóm kết nối cho bạn. Trong khi PHP / Ruby / Perl cần một số mod-XYZ của Apache hoặc xử lý trình kết nối FastCGI của riêng nó.


+1 Giải thích đầy đủ về tác giả của CppCMS;) Ok bây giờ tôi thấy rõ hơn vấn đề tổng thể. Vì vậy, trường hợp bạn chỉ có một máy chủ (để bắt đầu) là HTTP-> Balancer-> FCGI-> CPPCMS, nếu tôi hiểu chính xác? Bạn nghĩ gì về lời khuyên từ nhận xét của Jesper Mortensen, nói rằng FastCGI không nhanh?
Klaim

@Klaim: Nhìn vào các bản vẽ tuyệt vời ở trên - trong kiến ​​trúc này, FastCGI được sử dụng làm kết nối giữa nhiều máy chủ, mỗi máy chủ chạy một thể hiện CppCMS đa luồng. Tốc độ tương đối của FastCGI ít quan trọng hơn trong trường hợp này; lựa chọn thay thế của bạn sẽ là HTTP, AJP và các giao thức có thể kết nối mạng khác mà không phải là 'nhanh'. Câu trả lời này có lẽ nên được đánh dấu là đã được chấp nhận và câu hỏi của bạn đã được chỉnh sửa, bởi vì đây không thực sự là khi nginx có giá trị.
Jesper M

@Jesper Mortensen> Tôi đồng ý, nhưng bạn có đề xuất chính xác về câu hỏi nào không?
Klaim

6

Nginx, nói chung ( rất ) nói chung, có thể thu được thông lượng cao hơn nhiều so với Apache nhờ vào cách tiếp cận kiến ​​trúc khác nhau đối với vấn đề phục vụ các trang trên web. Nginx cũng được xây dựng chủ yếu như một proxy ngược và nó hoàn thành vai trò đó một cách đặc biệt (đây là bit cân bằng tải mà bạn đã ám chỉ); Apache, mặt khác, được xây dựng để phục vụ các trang web và sau đó có được khả năng proxy.

Điều đó nói rằng, gần như chắc chắn các khu vực Apache sẽ luôn vượt trội so với Nginx, trong khi có những khu vực khác mà Nginx sẽ luôn vượt trội so với Apache.

Câu trả lời ngắn gọn là nếu Apache đang làm việc cho bạn, thì không cần phải chuyển đổi. (Và tôi đang nói điều này với tư cách là một người dùng Apache trước đây đã trở thành môn đệ Nginx được chuyển đổi hoàn toàn.) Chỉ khi lưu lượng truy cập đến máy chủ của bạn bắt đầu đạt đến mức mà Apache đang trở thành nút cổ chai của bạn (đây là thứ tự của hàng ngàn kết nối đồng thời, nhưng sẽ thay đổi mạnh mẽ dựa trên thông số kỹ thuật máy chủ của bạn và tải máy chủ khác) hoặc nếu bạn đang cố gắng chạy Apache trong môi trường nghèo tài nguyên, nơi nó hầu như không thể phù hợp, việc chuyển sang Nginx mang lại cho bạn lợi ích vững chắc.

Điều đó nói rằng, nếu bạn muốn chuyển sang Nginx (mà tôi khuyến khích!), Thì hãy đi cho nó. Bạn sẽ thấy bất kỳ lợi ích? 9 lần trong số 10: Không, bạn sẽ không. Nhưng bạn đã đề cập rằng bạn thích ngôn ngữ tệp cấu hình của Nginx hơn, vì vậy nếu nó giúp bạn cảm thấy thoải mái hơn khi định cấu hình Nginx so với Apache, thì đó một lợi ích cho bạn! (Cá nhân, tôi thấy các cấu hình Apache nói chung dễ đọc hơn, nhưng điều đó có thể là do tôi đã dành nhiều, nhiều năm để đọc chúng và chỉ một vài tháng ngắn ngủi đã dành cho Nginx!)

Một lưu ý phụ: Bạn đã đề cập đến mong muốn xây dựng một ứng dụng web trong C ++. Vì lợi ích của bạn, tôi khuyên bạn nên sử dụng một ngôn ngữ cấp cao hơn như PHP, Python hoặc thậm chí Java. Sau đó, lập hồ sơ mã của bạn và xem xét việc tạo các mô-đun dựa trên C ++ để giải quyết các tắc nghẽn cụ thể (cả Python và PHP đều cho phép điều này khá dễ dàng; không biết về Java). Nếu bạn lo lắng về hiệu suất tổng thể, hãy xem xét điều này: EVE Online, MMORPG đơn lẻ lớn nhất trên thế giới, được xây dựng trên một biến thể của Python (Stackless Python), chỉ có các thành phần chính (ví dụ: thư viện đồ họa) được viết bằng C ++. Nếu Python có thể xử lý điều đó, chắc chắn nó có thể xử lý ứng dụng web của bạn?


+1 Cảm ơn. Về C ++, hãy xem nhận xét của tôi về câu trả lời của Jesper Mortensen. Ngoài ra, ngay cả khi Python được sử dụng ở phía máy chủ của Eve Online (tôi biết về điều này, rất nhiều) AFAIK, nó chỉ quản lý mã trò chơi (rất lớn) và một số phần khác trên thực tế là trong C ++. Mã đồ họa nằm ở phía máy khách, vì vậy C ++ là bắt buộc đối với các loại hiệu suất đồ họa như vậy. Như tôi đã nói, hãy xem trang Cơ sở lý luận CPPCMS về lý do tại sao tôi chọn nó. Nếu tôi làm theo lời khuyên của bạn, tôi sẽ phải viết đơn đăng ký của mình hai lần, trong khi tôi đã biết nó rất ngốn điện. Ngoài ra, tôi hiểu những nhược điểm và tôi ổn với nó.
Klaim

3

Không ai có thể thực sự trả lời phần "khi nào tôi nên chuyển đổi" - nó sẽ phụ thuộc vào tải của bạn, hiệu suất của mã ứng dụng của riêng bạn, v.v.

NGinx, điều đó dường như hiệu quả hơn Apache

nginx sử dụng một quy trình duy nhất (hoặc một số lượng rất nhỏ các quy trình worker) để xử lý tất cả các kết nối máy khách bằng cách sử dụng I / O có sự kiện. Apache có sẵn một số "Mô-đun đa xử lý" , nhưng tất cả chúng đều nghiêng về nhiều quy trình / nhiều luồng. Kết quả là, Apache thường sẽ tiêu thụ nhiều RAM và CPU hơn nginx để xử lý kết nối HTTP cơ bản. Bạn có thể biết tổng quan về các phương pháp xử lý kết nối khác nhau trên trang C10K của Kegel .

ứng dụng web rất hiệu năng (sử dụng C ++ với CPPCMS)

Tôi đặc biệt khuyên bạn nên xem xét thực hiện ứng dụng web cơ bản bằng ngôn ngữ cấp cao hơn (Python hoặc có thể là Ruby, Scala) và sử dụng hàng đợi lộn xộn để gửi vé công việc đến các máy công nhân xử lý các tác vụ "chuyên sâu về hiệu năng" một cách không đồng bộ.

NGinx sẽ là lựa chọn tốt nhất khi bạn muốn cân bằng tải,

nginx là một bộ cân bằng tải tốt; nhưng có nhiều lựa chọn trong không gian đó .

Tôi có thể sử dụng cả Apache và NGinx trên cùng một máy mà không gặp vấn đề gì không?

Đúng. Chỉ cần chạy chúng trên các số cổng IP và / hoặc địa chỉ IP khác nhau.


"Tôi thực sự khuyên bạn nên xem xét việc thực hiện ứng dụng web cơ bản bằng ngôn ngữ cấp cao hơn"> Tôi không nói đó là một ứng dụng web cơ bản - nó thậm chí không tầm thường. Nếu bạn thấy cơ sở lý luận cho việc sử dụng CPPCMS, tác giả sẽ chỉ ra một vài trường hợp có thể hữu ích và tôi sẽ ở trong những trường hợp đó. Tôi đã xem xét các lựa chọn thay thế khác nhưng thấy chúng đắt hơn so với sử dụng C ++, ít nhất là trong loại ứng dụng web tôi đang viết. Vì vậy, nó không phải là một phần của câu hỏi. Nhưng tôi hiểu lời khuyên của bạn và đưa ra điều tương tự cho những người hỏi tôi có nên sử dụng C ++ cho các ứng dụng web hay không. Tôi cũng có kế hoạch sử dụng Python cho một ứng dụng đơn giản khác.
Klaim

Dù sao, +1 để biết chi tiết.
Klaim

@Klaim: Nếu bạn muốn nhận ra sự cải thiện hiệu suất "thứ tự cường độ" được yêu cầu đối với việc triển khai C # / Java được điều chỉnh tốt, hãy xem liệu bạn có thể chạy CppCMS & mã ứng dụng đang xử lý với máy chủ web của mình hay không nginx / Apache. Các trang CppCMS dường như hiển thị FastCGI dưới dạng kết nối giữa máy chủ web và CppCMS; và thực tế FastCGI không ... nhanh.
Jesper M

> Ý tưởng thú vị. Hầu hết các lời khuyên xung quanh là bạn nên sử dụng fastcgi vì nó nhanh hơn các lựa chọn thay thế. Tôi sẽ kiểm tra xem tôi có thể làm điều này không, có thể xem với tác giả CPPCMS tại sao anh ta nghĩ nó nhanh nhất.
Klaim
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.