Đặt hàng: 1. nginx 2. véc ni 3. haproxy 4. máy chủ web?


50

Tôi đã thấy mọi người khuyên nên kết hợp tất cả những thứ này trong một luồng, nhưng chúng dường như có nhiều tính năng chồng chéo, vì vậy tôi muốn tìm hiểu lý do tại sao bạn có thể muốn vượt qua 3 chương trình khác nhau trước khi truy cập máy chủ web thực tế của mình.

nginx:

  • ssl: có
  • nén: có
  • bộ nhớ cache: có
  • hồ bơi phụ trợ: có

Sơn dầu:

  • ssl: không (stunnel?)
  • nén :?
  • bộ đệm: có (tính năng chính)
  • hồ bơi phụ trợ: có

haproxy:

  • ssl: không (stunnel)
  • nén :?
  • bộ nhớ cache: không
  • hồ bơi phụ trợ: có (tính năng chính)

Có phải mục đích của việc kết nối tất cả những thứ này trước các máy chủ web chính của bạn chỉ để đạt được một số lợi ích tính năng chính của chúng không?

Có vẻ như khá mong manh khi có rất nhiều daemon cùng nhau làm những việc tương tự.

Sở thích triển khai và đặt hàng của bạn là gì và tại sao?


1
Varnish hiện nay có hỗ trợ SSL: xem blog.exceliance.fr/2012/09/10/...
MiniQuark

4
Bạn muốn nói HAProxy?
Luis Lobo Borobia

Nginx dường như có tất cả mọi thứ, vì vậy tôi muốn nói chỉ cần sử dụng nginx.
Seun Osewa

Câu trả lời:


60

Chỉ cần đặt..

HaProxy là công cụ tải cân bằng mã nguồn mở tốt nhất trên thị trường.
Varnish là tập tin tĩnh mã nguồn mở tốt nhất trên thị trường.
Nginx là máy chủ web mã nguồn mở tốt nhất trên thị trường.

(tất nhiên đây là ý kiến ​​của tôi và nhiều người khác)

Nhưng nhìn chung, không phải tất cả các truy vấn đều đi qua toàn bộ ngăn xếp.

Mọi thứ đều đi qua haproxy và nginx / nhiều nginx's.
Sự khác biệt duy nhất là bạn "bắt vít" trên véc ni cho các yêu cầu tĩnh.

  • bất kỳ yêu cầu nào đều được cân bằng để dự phòng và thông lượng (tốt, đó là dự phòng có thể mở rộng)
  • bất kỳ yêu cầu nào đối với các tệp tĩnh trước tiên là nhấn vào bộ đệm véc ni (tốt, nhanh thôi)
  • bất kỳ yêu cầu động nào đều được gửi trực tiếp đến phần phụ trợ (tuyệt vời, véc ni không được sử dụng)

Nhìn chung, mô hình này phù hợp với kiến ​​trúc có thể mở rộng và phát triển (hãy loại bỏ haproxy nếu bạn không có nhiều máy chủ)

Hy vọng điều này sẽ giúp: D

Lưu ý: Thực tế tôi cũng sẽ giới thiệu Pound cho các truy vấn SSL: D
Bạn có thể có một máy chủ chuyên giải mã các yêu cầu SSL và gửi các yêu cầu tiêu chuẩn đến ngăn xếp phụ trợ: D (Nó làm cho toàn bộ ngăn xếp chạy nhanh hơn và đơn giản hơn)


1
Rất thú vị, đặc biệt là phần về máy chủ giải mã. +1
Gerry

Câu trả lời tuyệt vời. Tôi đang tự hỏi những gì ngồi trước mọi thứ? Đó là HAProxy hay Nginx?
Giăng

2
@ John: [Khách hàng -> HAProxy -> Varnish -> Nginx -> Static Content] hoặc [Khách hàng -> HAProxy -> Nginx (không bắt buộc) -> Application Server (nội dung động)]
MiniQuark

2
Tại sao bạn sẽ lưu trữ tĩnh và phục vụ động? Nginx nhanh như chớp để phục vụ các tệp tĩnh. Tôi thích sử dụng một ngăn xếp như [ HAProxy-> Nginx] cho tĩnh và [ HAProxy-> Nginx-> Varnish-> Apache] để triển khai bộ đệm trên động. Chấm dứt SSL tại bộ cân bằng tải như bạn đã nêu với các nút kết thúc chuyên dụng.
Steve Buzonas

33

Lời tựa

Cập nhật vào năm 2016. Mọi thứ đang phát triển, tất cả các máy chủ đang trở nên tốt hơn, tất cả đều hỗ trợ SSL và web tuyệt vời hơn bao giờ hết.

Trừ khi được nêu, những điều sau đây được nhắm đến các chuyên gia trong kinh doanh và khởi nghiệp, hỗ trợ hàng ngàn đến hàng triệu người dùng.

Những công cụ và kiến ​​trúc này đòi hỏi rất nhiều người dùng / phần cứng / tiền. Bạn có thể thử điều này tại phòng thí nghiệm tại nhà hoặc để chạy blog nhưng điều đó không có ý nghĩa nhiều.

Theo nguyên tắc chung, hãy nhớ rằng bạn muốn giữ cho nó đơn giản . Mỗi phần mềm trung gian được thêm vào là một phần quan trọng khác của phần mềm trung gian để duy trì. Sự hoàn hảo không đạt được khi không còn gì để thêm nhưng khi không còn gì để xóa.

Một số triển khai phổ biến và thú vị

HAProxy (cân bằng) + nginx (ứng dụng php + bộ nhớ đệm)

Máy chủ web là nginx chạy php. Khi nginx đã ở đó, nó cũng có thể xử lý bộ nhớ đệm và chuyển hướng.

HAProxy ---> nginx-php
A       ---> nginx-php
P       ---> nginx-php
r       ---> nginx-php
o       ---> nginx-php
x       ---> nginx-php
y       ---> nginx-php

HAProxy (cân bằng) + Varnish (bộ nhớ đệm) + Tomcat (ứng dụng Java)

HAProxy có thể chuyển hướng đến Varnish dựa trên URI yêu cầu (* .jpg * .css * .js).

HAProxy ---> tomcat
A       ---> tomcat
        ---> tomcat
P       ---> tomcat <----+
r       ---> tomcat <---+|
o                       ||
x       ---> varnish <--+|
y       ---> varnish <---+

HAProxy (cân bằng) + nginx (SSL đến máy chủ và lưu trữ) + Máy chủ web (ứng dụng)

Các máy chủ web không nói SSL mặc dù MỌI NGƯỜI PHẢI NÓI SSL ( đặc biệt là liên kết HAProxy-WebServer này với thông tin người dùng cá nhân đi qua EC2 ). Thêm một nginx cục bộ cho phép đưa SSL lên máy chủ. Khi nginx ở đó, nó cũng có thể thực hiện một số bộ nhớ đệm và ghi lại URL.

Lưu ý : Chuyển hướng cổng 443: 8080 đang diễn ra nhưng không phải là một phần của tính năng. Không có điểm nào trong việc chuyển hướng cổng. Bộ cân bằng tải có thể nói chuyện trực tiếp với máy chủ web: 8080.

          (nginx + webserver on same host)
HAProxy ---> nginx:443 -> webserver:8080
A       ---> nginx:443 -> webserver:8080
P       ---> nginx:443 -> webserver:8080
r       ---> nginx:443 -> webserver:8080
o       ---> nginx:443 -> webserver:8080
x       ---> nginx:443 -> webserver:8080
y       ---> nginx:443 -> webserver:8080

Middleware

HAProxy: Cân bằng tải

Các tính năng chính :

  • Cân bằng tải (TCP, HTTP, HTTPS)
  • Nhiều thuật toán (vòng tròn, ip nguồn, tiêu đề)
  • Kiên trì phiên
  • Chấm dứt SSL

Các lựa chọn thay thế tương tự : nginx (máy chủ web đa năng có thể định cấu hình như một bộ cân bằng tải)
Các lựa chọn khác nhau : Cloud (Amazon ELB, Google load balancer), Phần cứng (F5, fortinet, citrix Netscaler), Other & Worldwide (DNS, anycast, CloudFlare)

HAProxy làm gì và khi nào bạn phải sử dụng nó?
Bất cứ khi nào bạn cần cân bằng tải. HAProxy là giải pháp.

Ngoại trừ khi bạn muốn rất rẻ HOẶC nhanh & bẩn HOẶC bạn không có sẵn các kỹ năng, thì bạn có thể sử dụng ELB: D

Ngoại trừ khi bạn ở ngân hàng / chính phủ / tương tự yêu cầu sử dụng trung tâm dữ liệu của riêng bạn với các yêu cầu khó khăn (cơ sở hạ tầng chuyên dụng, chuyển đổi dự phòng đáng tin cậy, 2 lớp tường lửa, công cụ kiểm toán, SLA để trả x% mỗi phút thời gian chết, tất cả trong một) bạn có thể đặt 2 F5 lên trên giá chứa 30 máy chủ ứng dụng của bạn.

Ngoại trừ khi bạn muốn vượt qua 100 nghìn HTTP (S) [và nhiều trang web], thì bạn PHẢI có nhiều HAProxy với một lớp cân bằng tải [toàn cầu] ở phía trước chúng (cloudflare, DNS, anycast). Về mặt lý thuyết, bộ cân bằng toàn cầu có thể nói chuyện trực tiếp với các máy chủ web cho phép bỏ HAProxy. Tuy nhiên, thông thường, bạn NÊN giữ HAProxy (s) làm điểm vào công khai cho trung tâm dữ liệu của mình và điều chỉnh các tùy chọn nâng cao để cân bằng công bằng giữa các máy chủ và giảm thiểu phương sai.

Ý kiến ​​cá nhân : Một dự án nhỏ, chứa, nguồn mở, hoàn toàn dành riêng cho MỘT MỤC ĐÍCH THỰC SỰ. Trong số các cấu hình dễ nhất (MỘT tệp), phần mềm nguồn mở hữu ích và đáng tin cậy nhất mà tôi đã gặp trong đời.

Nginx: Apache không hút

Các tính năng chính :

  • Máy chủ web HTTP hoặc HTTPS
  • Chạy các ứng dụng trong CGI / PHP / một số khác
  • Chuyển hướng / viết lại URL
  • Kiểm soát truy cập
  • Thao tác tiêu đề HTTP
  • Bộ nhớ đệm
  • Proxy ngược

Các lựa chọn thay thế tương tự : Apache, Lighttpd, Tomcat, Gunicorn ...

Apache là máy chủ web thực tế, còn được gọi là một cụm khổng lồ gồm hàng chục mô-đun và hàng ngàn dòng httpd.conftrên cấu trúc xử lý yêu cầu bị hỏng. nginx làm lại tất cả điều đó, với ít mô-đun, cấu hình đơn giản hơn (một chút) và kiến ​​trúc lõi tốt hơn.

Nginx làm gì và khi nào bạn phải sử dụng nó?
Một máy chủ web được dự định để chạy các ứng dụng. Khi ứng dụng của bạn được phát triển để chạy trên nginx, bạn đã có nginx và bạn cũng có thể sử dụng tất cả các tính năng của nó.

Ngoại trừ khi ứng dụng của bạn không có ý định chạy trên nginx và nginx không tìm thấy ở đâu trong ngăn xếp của bạn (cửa hàng Java có ai không?) Thì có rất ít điểm trong nginx. Các tính năng của máy chủ web có khả năng tồn tại trong máy chủ web hiện tại của bạn và các tác vụ khác được xử lý tốt hơn bằng công cụ chuyên dụng thích hợp (HAProxy / Varnish / CDN).

Ngoại trừ khi máy chủ web / ứng dụng của bạn thiếu tính năng, khó định cấu hình và / hoặc bạn thà chết công việc hơn là nhìn vào nó (Gunicorn có ai không?), Thì bạn có thể đặt nginx ở phía trước (tức là cục bộ trên mỗi nút) để thực hiện URL viết lại, gửi chuyển hướng 301, thực thi kiểm soát truy cập, cung cấp mã hóa SSL và chỉnh sửa các tiêu đề HTTP một cách nhanh chóng. [Đây là những tính năng được mong đợi từ máy chủ web]

Varnish: Máy chủ lưu trữ

Các tính năng chính :

  • Bộ nhớ đệm
  • Bộ nhớ đệm nâng cao
  • Bộ nhớ đệm hạt mịn
  • Bộ nhớ đệm

Các lựa chọn thay thế tương tự : nginx (máy chủ web đa năng có thể định cấu hình như một máy chủ bộ đệm)
Các lựa chọn thay thế khác nhau : CDN (Akamai, Amazon CloudFront, CloudFlare), Phần cứng (F5, Fortinet, Citrix Netscaler)

Varnish làm gì và khi nào bạn phải sử dụng nó?
Nó không lưu trữ, chỉ lưu trữ. Nó thường không đáng để nỗ lực và nó lãng phí thời gian. Hãy thử CDN thay thế. Hãy lưu ý rằng bộ nhớ đệm là điều cuối cùng bạn nên quan tâm khi chạy một trang web.

Ngoại trừ khi bạn đang điều hành một trang web độc quyền về hình ảnh hoặc video thì bạn nên xem xét kỹ CDN và suy nghĩ nghiêm túc về bộ nhớ đệm.

Ngoại trừ khi bạn buộc phải sử dụng phần cứng của riêng mình trong trung tâm dữ liệu của riêng bạn (CDN không phải là một tùy chọn) và máy chủ web của bạn rất tệ trong việc cung cấp các tệp tĩnh (thêm nhiều máy chủ web không giúp đỡ) thì Varnish là giải pháp cuối cùng.

Ngoại trừ khi bạn có một trang web có nội dung chủ yếu là tĩnh-nhưng-phức tạp-được tạo động (xem các đoạn sau) thì Varnish có thể tiết kiệm rất nhiều sức mạnh xử lý trên máy chủ web của bạn.

Bộ nhớ đệm tĩnh được đánh giá cao trong năm 2016

Bộ nhớ đệm gần như là cấu hình miễn phí, không có tiền và thời gian miễn phí. Chỉ cần đăng ký CloudFlare hoặc CloudFront hoặc Akamai hoặc MaxCDN. Thời gian tôi viết dòng này dài hơn thời gian để thiết lập bộ nhớ đệm VÀ bia tôi đang cầm trên tay đắt hơn đăng ký CloudFlare trung bình.

Tất cả các dịch vụ này đều hoạt động tốt đối với tĩnh * .css * .js * .png và hơn thế nữa. Trên thực tế, họ chủ yếu tôn trọng Cache-Controlchỉ thị trong tiêu đề HTTP. Bước đầu tiên của bộ nhớ đệm là cấu hình máy chủ web của bạn để gửi các chỉ thị bộ đệm phù hợp. Không quan trọng CDN là gì, Varnish là gì, trình duyệt nào ở giữa.

Cân nhắc hiệu suất

Varnish được tạo ra vào thời điểm các máy chủ web trung bình đang nghẹt thở để phục vụ hình ảnh con mèo trên blog. Ngày nay, một ví dụ duy nhất của máy chủ web điều khiển từ thông dụng không đồng bộ đa luồng hiện đại trung bình có thể cung cấp mèo con một cách đáng tin cậy cho cả một quốc gia. Lịch sự của sendfile().

Tôi đã làm một số thử nghiệm hiệu suất nhanh chóng cho dự án cuối cùng mà tôi đã làm việc. Một phiên bản tomcat duy nhất có thể phục vụ 21 000 đến 33 000 tệp tĩnh mỗi giây qua HTTP (các tệp thử nghiệm từ 20B đến 12kB với số lượng kết nối HTTP / máy khách khác nhau). Lưu lượng ra bên ngoài được duy trì vượt quá 2,4 Gb / s. Sản xuất sẽ chỉ có giao diện 1 Gb / s. Không thể làm tốt hơn phần cứng, thậm chí không cần cố gắng Varnish.

Bộ nhớ đệm thay đổi nội dung động

CDN và máy chủ lưu trữ thường bỏ qua URL với các tham số như ?article=1843, họ bỏ qua mọi yêu cầu với cookie phiên hoặc người dùng được xác thực và họ bỏ qua hầu hết các loại MIME bao gồm application/jsontừ /api/article/1843/info. Có các tùy chọn cấu hình có sẵn nhưng thường không phải là hạt mịn, thay vì "tất cả hoặc không có gì".

Varnish có thể có các quy tắc phức tạp tùy chỉnh (xem VCL) để xác định cái gì là bộ nhớ cache và cái gì không. Các quy tắc này có thể lưu trữ nội dung cụ thể theo URI, tiêu đề và cookie phiên người dùng hiện tại và loại MIME và nội dung TẤT CẢ ĐẾN. Điều đó có thể tiết kiệm rất nhiều sức mạnh xử lý trên máy chủ web cho một số mẫu tải rất cụ thể. Đó là khi Varnish tiện dụng và TUYỆT VỜI.

Phần kết luận

Tôi phải mất một thời gian để hiểu tất cả những mảnh ghép này, khi nào nên sử dụng chúng và làm thế nào chúng khớp với nhau. Hy vọng điều này có thể giúp bạn.

Điều đó hóa ra khá dài (6 giờ để viết. OMG !: O). Có lẽ tôi nên bắt đầu một blog hoặc một cuốn sách về điều đó. Sự thật thú vị: Dường như không có giới hạn về độ dài câu trả lời.


5
Có giới hạn về độ dài của câu trả lời, nhưng bạn sẽ phải viết thêm một vài cuốn sách để tiếp cận nó.
Michael Hampton

2
Một điểm đáng nói về bộ nhớ đệm: đó là một cách mạnh mẽ để cải thiện hiệu suất của trang web khi bạn không có quyền kiểm soát ứng dụng; đặc biệt nếu ứng dụng có tiêu đề bộ đệm thực sự ngu ngốc (ứng dụng doanh nghiệp có ai không?). Bạn phải có ý thức nhiều hơn về các tài nguyên được xác thực mặc dù.
Cameron Kerr

@ user5994461 Tôi rất thích đọc blog của bạn. Câu trả lời tuyệt vời!
oxalorg

20

Đúng là 3 công cụ chia sẻ các tính năng phổ biến. Hầu hết các thiết lập đều ổn với bất kỳ sự kết hợp nào giữa 2 trong số 3. Nó phụ thuộc vào mục đích chính của chúng là gì. Việc chấp nhận hy sinh một số bộ nhớ đệm là điều phổ biến nếu bạn biết rằng máy chủ ứng dụng của bạn nhanh về thống kê (ví dụ: nginx). Việc hy sinh một số tính năng cân bằng tải là điều phổ biến nếu bạn sẽ cài đặt hàng chục hoặc hàng trăm máy chủ và không quan tâm đến việc tận dụng tối đa chúng cũng như về các vấn đề khắc phục sự cố. Việc hy sinh một số tính năng của máy chủ web là điều phổ biến nếu bạn có ý định chạy một ứng dụng phân tán có nhiều thành phần ở mọi nơi. Tuy nhiên, một số người xây dựng trang trại thú vị với tất cả chúng.

Bạn nên nhớ rằng bạn đang nói về 3 sản phẩm rắn. Nói chung, bạn sẽ không cần phải cân bằng chúng. Nếu bạn cần SSL phía trước, thì nginx trước tiên là proxy ngược là ổn. Nếu bạn không cần điều đó, thì vecni ở mặt trước là tốt. Sau đó, bạn có thể đặt haproxy để tải cân bằng các ứng dụng của bạn. Đôi khi, bạn cũng muốn chuyển sang các trang trại máy chủ khác nhau trên chính haproxy, tùy thuộc vào loại tệp hoặc đường dẫn.

Đôi khi bạn sẽ phải bảo vệ chống lại các cuộc tấn công DDoS nặng nề và haproxy ở phía trước sẽ phù hợp hơn các cuộc tấn công khác.

Nói chung, bạn không nên lo lắng về việc thỏa hiệp để làm gì giữa các lựa chọn của bạn. Bạn nên chọn cách lắp ráp chúng để có được sự linh hoạt tốt nhất cho nhu cầu của bạn bây giờ và sắp tới. Ngay cả khi bạn xếp một vài trong số chúng nhiều lần, đôi khi nó có thể đúng tùy theo nhu cầu của bạn.

Hy vọng điều này sẽ giúp!


1
+1 cho HAProxy - tác giả trả lời các câu hỏi trên Server Fault. Cảm ơn.
Joel K

Arenstar: Bạn đã viết một trong những công cụ này? Willy Tarreau là nhà phát triển chính của HAProxy.
Joel K

Cảm ơn vì điều này Willy. Bạn đã trả lời câu hỏi của tôi cho Arenstar ở trên.
John

2
Lưu ý rằng mã phát triển hiện tại cho HAProxy hiện bao gồm SSL.
Joel K

14

Tất cả các câu trả lời khác là trước năm 2010, do đó thêm một so sánh cập nhật.

Nginx

  • Một máy chủ web đầy đủ, các tính năng khác cũng có thể được sử dụng. Ví dụ: Nén HTTP
  • Hỗ trợ SSL
  • Trọng lượng rất nhẹ vì Nginx được thiết kế để nhẹ ngay từ đầu.
  • Hiệu suất bộ nhớ đệm gần Varnish
  • Gần với hiệu suất cân bằng tải HAProxy

Sơn dầu

  • tốt nhất cho các kịch bản bộ nhớ đệm phức tạp và kết hợp với các ứng dụng.
  • tập tin tĩnh tốt nhất
  • Không hỗ trợ SSL
  • Bộ nhớ và CPU ăn

Haproxy

  • bộ cân bằng tải tốt nhất, để cắt các tính năng cân bằng tải tiên tiến, có thể so sánh với bộ cân bằng tải phần cứng
  • SSL được hỗ trợ kể từ 1.5.0
  • Đơn giản hơn, chỉ là một proxy tcp mà không cần triển khai http, điều này làm cho nó nhanh hơn và ít bị lỗi hơn.

Vì vậy, phương pháp tốt nhất dường như là thực hiện tất cả chúng theo một thứ tự thích hợp.

Tuy nhiên, với mục đích chung, Nginx là tốt nhất khi bạn đạt được hiệu suất trên trung bình cho tất cả: Bộ nhớ đệm, ủy quyền ngược, Cân bằng tải , với rất ít chi phí sử dụng tài nguyên. Và sau đó bạn có SSL và các tính năng máy chủ web đầy đủ.


6

Varnish có hỗ trợ cân bằng tải: http://www.varnish-cache.org/trac/wiki/LoadBalANCE

Nginx có hỗ trợ cân bằng tải: http://wiki.nginx.org/NginxHttpUpstreamModule

Tôi chỉ đơn giản là cấu hình này với véc ni + stunnel. Nếu tôi cần nginx vì một số lý do khác, tôi sẽ chỉ sử dụng nginx + véc ni. Bạn có thể yêu cầu nginx chấp nhận các kết nối SSL và ủy quyền chúng để véc ni, sau đó nói chuyện về véc ni với nginx qua http.

Một số người có thể ném nginx (hoặc Apache) vào hỗn hợp vì đây là những công cụ có mục đích chung hơn so với Varnish. Ví dụ: nếu bạn muốn chuyển đổi nội dung (ví dụ: sử dụng XDV, bộ lọc apache, v.v.) ở lớp proxy, bạn sẽ cần một trong những thứ này, vì Varnish không thể tự làm điều đó. Một số người có thể quen thuộc hơn với cấu hình của các công cụ này, vì vậy việc sử dụng Varnish như một bộ đệm đơn giản và thực hiện cân bằng tải ở một lớp khác dễ dàng hơn vì họ đã quen thuộc với Apache / nginx / haproxy như một bộ cân bằng tải.


Phải - "nhóm phụ trợ" có nghĩa là chỉ ra rằng cả ba trong số này đều có các tính năng cân bằng tải. Từ điều tra ban đầu của tôi, có vẻ như HAProxy có các tùy chọn cân bằng tải có thể điều chỉnh nhất.
Joel K

Nghe có vẻ hợp lý, vì nó được xây dựng có mục đích như một công cụ cân bằng tải. Mặt khác, các tính năng cân bằng tải của Varnish khá tốt và việc loại bỏ một quy trình khỏi hỗn hợp này sẽ giúp bạn có cấu hình đơn giản hơn với độ trễ ít hơn.
larsks
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.