2012-02-07 37 views
24

Điều này dường như không hoạt động ngay bây giờ. Tôi đang sử dụng Faye với NodeJS đằng sau một ELB của Amazon. Khi tôi bật HTTPS các kết nối không còn có thể được môi giới. Tôi đã tìm thấy câu hỏi ở đây chưa được trả lời: https://forums.aws.amazon.com/message.jspa?messageID=283293. Bất cứ ai cũng có thể làm việc này? Có bất kỳ công việc nào bên ngoài chạy trường hợp riêng của tôi về HAProxy không?Làm thế nào để bạn có được ELB của Amazon với HTTPS/SSL để làm việc với Web Sockets?

Trả lời

42

Tôi xác nhận, dựa trên các bài kiểm tra riêng của chúng tôi, mà cấu hình ELB trên TCP/SSL, thay vì oh HTTP/HTTPS, làm các trick với WebSockets. Những hạn chế là hai:

1) Như đã được chỉ ra bởi arturnt, bạn không thể có được độ dính.

2) Bạn sẽ mất khả năng truy xuất danh tính của khách hàng. IP ban đầu được máy chủ WebSocket của bạn nhìn thấy sẽ luôn là ELB và, khác với cấu hình HTTP/HTTPS, không có tiêu đề X-Forwarded-For sẽ được thêm vào các yêu cầu.

CẬP NHẬT tháng 7 năm 2013: Amazon vừa thêm hỗ trợ cho Proxy Nghị định thư, mà giải quyết nhược điểm số 2 ở trên. Với Giao thức Proxy, một tiêu đề chứa IP gốc của máy khách sẽ được thêm ngay cả khi ELB hoạt động ở cấp TCP, thay vì HTTP. Đầy đủ chi tiết: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html

CẬP NHẬT Tháng Tám 2016: Amazon vừa công bố mới AWS Ứng dụng cân bằng tải, mà hỗ trợ WebSocket ở lớp 7 (cũng như HTTP/2.0 và định tuyến dựa trên nội dung). Xem https://aws.amazon.com/it/blogs/aws/new-aws-application-load-balancer/

+0

WSS có thể được sử dụng với tùy chọn thứ hai không? – whadar

+1

... và có [một mô-đun để xử lý giao thức PROXY] (http://stackoverflow.com/q/17981943/201952). – josh3736

+0

... hoặc một [fork] hiện đang hoạt động (https://github.com/findhit/proxywrap) của mô-đun ở trên. – jamix

10

Nó sẽ không hoạt động, proxy của ELB (S) proxy không hiểu yêu cầu websocket, ít nhất là bây giờ, và tôi không biết khi nào/nếu nó được lên kế hoạch.

Tôi không chắc chắn HAProxy là hoàn toàn cần thiết. Có thể đặt một trình kết thúc SSL, ví dụ: stud/stunnel, trên cùng một ví dụ như các máy chủ nodejs của bạn và đi qua đó. Sau đó bạn có thể giữ ELB, nhưng đặt nó vào chế độ TCP.

Rõ ràng là có phí SSL trên mỗi trường hợp, nhưng về lâu dài có thể quy mô tốt hơn việc chuyển SSL sang ELB (đặc biệt dựa trên nhận xét của người dùng về hiệu suất SSL của ELB).

+1

Nó thường là mong muốn nhiều hơn nữa để chấm dứt SSL tại AWS ELB, nếu chỉ để đổi mới giấy chứng nhận có thể dễ dàng thực hiện ở một nơi. Nó cũng có nghĩa là mã ứng dụng có khả năng dễ bị tổn thương không có quyền truy cập vào chứng chỉ. Nhược điểm, tất nhiên, là giao tiếp giữa ELB và ứng dụng không được mã hóa, nhưng điều này có thể được giảm nhẹ với VPC và bảo mật mạng cứng. – jokeyrhyme

4

Sau câu trả lời của James, tôi đã nghiên cứu thêm một chút và kết thúc với lộ trình TCP, không chắc chắn có bất kỳ nhược điểm nào của việc sử dụng đường hầm HTTP của ELB (xem xét tôi không cần dính). Điều tốt là bạn không cần phải làm stud/stunnel vì ELB cung cấp cho bạn. Vì vậy, chính thức thiết lập ELB nơi NodeJS/Faye đang lắng nghe trên cổng 8000:

Secure TCP Forward (443) -> Local (8000) 
TCP Forward 80 -> Local(8000) 
+0

Nhược điểm là độ dính và khả năng của ELB chuyển tiếp trên một yêu cầu đến một máy chủ khác nếu máy chủ hiện tại mà nó chọn trả về lỗi. –

1

Bạn có thể sử dụng Ứng dụng LB để hỗ trợ websocket tốt.Tôi chỉ thực hiện ý tưởng này vào dự án mới nhất của chúng tôi sau khi thực hiện một số thủ thuật trên ALB:

  1. mở 80 cổng vào SG tất cả liên quan
  2. làm NodeJS chạy trên 80
  3. phép NodeJS đáp ứng http-80 yêu cầu (NodeJS sẽ nâng cấp theo yêu cầu http để WebSocket trong backend)
  4. làm ALB nhóm đối tượng kiểm tra http-80 & đúng con đường ping
  5. tạo người nghe trên ALB: http80->http80, https443->http80
  6. cre ăn quy tắc listener trên ALB: http80->target group, https443->target group
  7. Enable dính http trong
+1

Bạn đã định cấu hình đường dẫn kiểm tra/ping sức khỏe để hoạt động như thế nào? – BrokenGlass

+0

Tôi đã kết thúc việc tạo một HTTP, điểm cuối riêng biệt chỉ để kiểm tra sức khỏe. Theo [tài liệu] (https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html), "... kiểm tra tình trạng không hỗ trợ WebSockets". – dskrvk

+0

@dskrvk Bạn đã thiết lập điểm cuối để kiểm tra sức khỏe ở đâu và như thế nào? Bạn đang chạy nginx cho bạn ALB? Tôi đang ở trong tình trạng tương tự không chạy nginx và bây giờ chắc chắn những gì tập tin tôi nên phục vụ cho kiểm tra sức khỏe và những gì nó nên đáp ứng với? – jdog

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