Nginx nên ở phía trước của HAProxy hay ngược lại?


11

Tôi có ít kinh nghiệm trong thiết kế kiến ​​trúc cơ sở hạ tầng trang web. Tôi biết nó có thể là tình huống cụ thể. Các trang web được cho là:

1) Cần hỗ trợ HTTPS cho một số trang (ví dụ: trang đăng nhập) trong khi các trang khác chỉ là trang HTTP.

2) Cần nhiều máy chủ web để yêu cầu một số cân bằng tải.

3) Cần bộ nhớ đệm và nén HTTP để tăng hiệu suất.

4) Một số yêu cầu (ví dụ: tải lên hình ảnh) nên được chuyển đến các máy chủ phụ trợ chuyên dụng. Vì vậy, cân bằng dựa trên URL là bắt buộc.

Tôi biết rằng NginX và HAProxy đều là Proxy đảo ngược có nguồn mở và / hoặc Load Balancer. Vì HAProxy không hỗ trợ SSL, trong khi cân bằng tải Nginx không tốt bằng HAProxy. Tôi sẽ lấy cả hai.

Vậy, tôi nên đặt Nginx (dưới dạng proxy ngược) ở phía trước HAProxy (dưới dạng cân bằng tải) hay ngược lại?

Cảm ơn

Câu trả lời:


7

Nếu bạn dự định có sẵn mọi máy chủ web qua HTTPS, thì bạn sẽ cần cài đặt Nginx trước HAProxy. Với cấu hình đó, Nginx của bạn sẽ xử lý tất cả các công việc SSL và gửi lưu lượng HTTP được giải mã trực tiếp đến giao diện HAProxy, sau đó sẽ yêu cầu cân bằng tải đến các máy chủ web của bạn dựa trên các quy tắc bạn chỉ định.

Ý tưởng sử dụng LVS, như được đề cập bởi womble là nó ít xâm phạm hơn vì nó không giữ kết nối giữa máy chủ web của bạn và máy khách truy cập trang web. Mặt khác, LVS sẽ chỉ cung cấp cho bạn tính năng cân bằng tải đơn giản và sẽ không cho phép bạn chuyển tiếp các yêu cầu dựa trên phần mở rộng tệp, URL được yêu cầu, tiêu đề, v.v. Đó là lý do tại sao HAProxy được sử dụng trong nhiều tình huống.

Nếu bạn chỉ cần SSL trên một máy chủ (không cân bằng tải) thì bạn có thể sử dụng HAProxy cho mọi thứ mà không cần sử dụng Nginx. Mặt khác, bạn sẽ gặp một vấn đề là không thể thấy địa chỉ IP nguồn của máy khách trong nhật ký HTTPS của máy chủ web (vì HAProxy viết lại địa chỉ đó). IP sẽ ở trong nhật ký HAProxy nếu bạn bật nó;)


Cảm ơn. vì "Một số yêu cầu (ví dụ: tải lên hình ảnh) nên được định tuyến đến các máy chủ phụ trợ chuyên dụng. Vì vậy, cần phải cân bằng dựa trên URL." (như tôi đã cập nhật câu hỏi). LVS có thể không phục vụ yêu cầu của tôi.
Morgan Cheng

BTW, việc ẩn địa chỉ IP của HAProxy chỉ dành cho HTTPS, hay cho HTTP?
Morgan Cheng

@Morgan, Ẩn ip chỉ dành cho HTTPS.

Nó chỉ dành cho các phụ trợ ở chế độ TCP, vì vậy mọi thứ không phải là HTTP sẽ không thấy địa chỉ IP vì nó được gửi dưới dạng Tiêu đề HTTP (X-Forwarded-For).

Không chính xác. Haproxy có thể kết nối với máy chủ bằng địa chỉ IP của máy khách, nhưng điều đó đòi hỏi sự hợp tác của hạt nhân (ví dụ: tính năng TPROXY). Điều này nên được tránh bất cứ nơi nào có thể mặc dù.
Willy Tarreau


1

Bạn chỉ nên sử dụng nginx, nó thực hiện mọi thứ bạn cần như một máy chủ web frontend. Nếu bạn cần cân bằng tải phía trước, hãy sử dụng bộ cân bằng tải L3 như Linux Virtual Server , vì nó không gây cản trở như HAproxy. Sử dụng HAproxy nếu được yêu cầu thực hiện cân bằng tải phía sau hậu trường, như cân bằng các yêu cầu cho nhóm công nhân phụ trợ.


2
Người ta nói rằng cân bằng tải NginX rất đơn giản, chỉ là cách tiếp cận vòng tròn. Đó là lý do tôi đang cân nhắc HAProxy.
Morgan Cheng

1
Người ta nói chính xác; Tôi đã tự nói điều đó. Đó là lý do tại sao tôi không khuyên bạn nên sử dụng nginx làm bộ cân bằng tải và bạn sẽ không tìm thấy bất kỳ đề cập nào về việc sử dụng nginx làm bộ cân bằng tải trong câu trả lời này (hoặc bất kỳ) nào khác của tôi.
womble

Điều đó chỉ khi bạn sợ sử dụng trình biên dịch của riêng mình từ nguồn (hoặc cổng trên FreeBSD). Có nhiều mô-đun bên thứ 3 cải thiện cân bằng tải: wiki.nginx.org/3rdPartyModules
Martin Fjordvald

2
Cải thiện, có. Làm cho đầy đủ, không. Suy nghĩ của tôi về điều này có thể được tìm thấy trong hezmatt.org/~mpalmer/blog/2011/07/24/ (tìm kiếm "không đẹp").
womble
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.