Chạy máy chủ websocket và máy chủ http trên cùng một máy chủ


8

Tôi đang sử dụng nginx để phục vụ một thể hiện của ứng dụng PHP, đồng thời chạy ứng dụng Ratchet để nghe kết nối websocket. Vấn đề là, cả hai trường hợp này đều sử dụng cùng một cổng (80).

Làm cách nào để thiết lập máy chủ để tôi có thể phục vụ cả hai?

Chỉnh sửa: Chỉ cần quay lại để thấy câu hỏi đã bị hạ cấp nhiều lần, có thể hiểu được, tôi không thực sự hỏi câu hỏi một cách rõ ràng. Tôi xin lỗi vì điều đó. Tôi đã làm sự siêng năng của tôi mặc dù. Tôi sẽ thử làm rõ những gì tôi đã hỏi, tôi có thể đã hiểu nhầm một số khía cạnh của giao thức websocket, trong trường hợp này, vui lòng sửa lại cho tôi:

Tôi biết rõ rằng chỉ có thể có một quá trình lắng nghe một cổng cụ thể, điều tôi thực sự gặp phải một số vấn đề là toàn bộ điều websocket, từ những gì tôi hiểu, một yêu cầu websocket bắt đầu bằng một cái bắt tay HTTP, sau đó sẽ có cơ chế để 'nâng cấp' phiên đó lên cổng cụ thể.

Từ những gì tôi đọc xung quanh, có vẻ như cơ chế nâng cấp này được xử lý bởi máy chủ web. Vì vậy, làm cách nào để định cấu hình nginx để xử lý quá trình này?

Nói chung, một điều mà tôi lo ngại khi chạy máy chủ websocket trên cổng ngoài 80, là khả năng cổng bị chặn. Là mối quan tâm này vô căn cứ? Bất cứ lời khuyên nào về cách tôi nên thiết lập điều này?


that_guy - vui lòng xem lại serverfault.com/help/how-to-ask - đảm bảo thực hiện sự chuyên cần của bạn trước khi đăng. Mặc dù chúng tôi thích mọi người đặt câu hỏi, chúng tôi cũng thích mọi người làm bài tập về nhà của họ.
ETL

Câu trả lời:


16

Một câu hỏi khủng khiếp bằng văn bản, nhưng thuật ngữ tôi đang tìm kiếm là proxy ngược.

Về cơ bản, giống như cách nginx có thể chuyển tiếp yêu cầu khác nhau đến một số phiên bản của ứng dụng web dựa trên đường dẫn hoặc tên máy chủ, nó cũng có thể được cấu hình để "chuyển tiếp" yêu cầu đến phiên bản máy chủ websocket. ví dụ:

location /socket {
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

upstream websocket{
    server localhost:8000;
}

map $http_upgrade $connection_upgrade {
    default Upgrade;
    '' close;
}

Các yêu cầu HTTP http://hostnamesẽ được phục vụ trang html thông thường, trong khi kết nối websocket wss://hostname/socketsẽ được chuyển tiếp đến phiên bản websocket trên cùng một máy chủ lắng nghe trên cổng 8000.


Giúp đỡ rất nhiều !! Thanxx
gunjot singh

Một tùy chọn hữu ích khác bên trong khối vị trí đó sẽ là proxy_read_timeoutproxy_write_timeoutđể ngăn chặn việc ngắt kết nối khi không hoạt động.
Vi.

Không khắc phục sự cố trợ giúp cần thiết!
Nɪsʜᴀɴᴛʜ

2

Một máy chủ không thể có hai phần mềm khác nhau nghe trên cùng một địa chỉ cổng / IP. Mặt khác, làm thế nào lưu lượng sẽ được định tuyến đến Ứng dụng XYZ nếu nhiều ứng dụng có thể liên kết với cùng một cổng?

Bạn có thể tìm hiểu thêm về các cổng từ Cổng (mạng máy tính)

Những gì bạn cần làm là một trong các tùy chọn sau:

  1. Sử dụng một cổng khác cho một trong hai ứng dụng và cho phép thông qua tường lửa của bạn.
  2. Sử dụng hai địa chỉ IP khác nhau - và liên kết từng ứng dụng với địa chỉ IP tương ứng của chúng.

Tường lửa của bạn chỉ cần được cấu hình theo những gì bạn thiết lập.


bạn có thể cung cấp thêm thông tin không? Điều đó sẽ gây ra vấn đề với tường lửa? Không phải một trong những lợi thế của websocket là để tránh điều đó?
hndr

5
Có thể chia sẻ cổng vì bạn có thể có cả máy chủ HTTP và máy chủ Websocket trong một quy trình.
Pacerier 15/03/2015

0

Bạn có hai lựa chọn:

  1. Ràng buộc một đến một cổng khác (ví dụ 8000)
  2. (nếu có thể) thêm một địa chỉ IP bổ sung vào máy chủ và liên kết máy chủ web và máy chủ websocket với các IP khác nhau
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.