Định cấu hình Apache 2.4 mod_proxy_wstunnel cho Socket.IO 1.0


15

Tôi đang cố gắng định cấu hình Apache 2.4 để ủy quyền kết nối websocket cho socket.io đến máy chủ websocket của node.js, sử dụng mod_proxy_wstunnel. Chúng tôi đã làm việc tốt với socket.io 0.9, nhưng với bản phát hành 1.0, họ đã thay đổi điểm cuối của socket thành tham số truy vấn và bây giờ tôi gặp sự cố khi định cấu hình apache bằng các hướng dẫn proxy chính xác.

Tất cả các yêu cầu đến /socket.io/?EIO=N&transport=websocket(trong đó N là bất kỳ chữ số nào, thường là 2) cần được chuyển tiếp đến ws://localhost:8082/socket.io/, nhưng tất cả các yêu cầu khác cần phải được chuyển tiếp đến http://localhost:8082/socket.io/.

Tôi đã thử các biến thể của cả hai cấu hình sau:

ProxyPass /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket
ProxyPassReverse /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket

ProxyPass /socket.io/ http://localhost:8082/socket.io/
ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/

.

RewriteRule /socket.io/?EIO=([0-9]+)&transport=websocket ws://localhost:8082/socket.io/ [QSA,P]

ProxyPass /socket.io/ http://localhost:8082/socket.io/
ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/

Tôi đã tập hợp từ googling của mình rằng ProxyPass và Vị trí không thể nhắm mục tiêu chuỗi truy vấn, vậy có lựa chọn nào khác ở đây không? Các đường dẫn được mã hóa cứng vào socket.io, vì vậy, không thể thay đổi toàn bộ thư viện, tôi không thể thay đổi chúng.

Câu trả lời:


39

Sử dụng các điều kiện Rewrite để khớp với trường hợp đặc biệt này:

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
RewriteCond %{QUERY_STRING} transport=websocket    [NC]
RewriteRule /(.*)           ws://localhost:8082/$1 [P,L]

ProxyPass        /socket.io http://localhost:8082/socket.io
ProxyPassReverse /socket.io http://localhost:8082/socket.io

LƯU Ý Như Mark W đã lưu ý dưới đây. Chúng phải được nhập ở cấp vhost chứ không phải ở cấp máy chủ hoặc .htaccess.

Bạn cũng có thể tham khảo một bộ cân bằng:

<Proxy balancer://http-localhost/>
    BalancerMember http://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember http://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=bytraffic
</Proxy>

<Proxy balancer://ws-localhost/>
    BalancerMember ws://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember ws://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=bytraffic
</Proxy>

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io                [NC]
RewriteCond %{QUERY_STRING} transport=websocket        [NC]
RewriteRule /(.*)           balancer://ws-localhost/$1 [P,L]

ProxyPass        /socket.io balancer://http-localhost/socket.io
ProxyPassReverse /socket.io balancer://http-localhost/socket.io

+100000 Bạn đã thực hiện một ngày của tôi. Đã ở đây trong nhiều giờ. Tôi đã sử dụng đoạn mã đầu tiên. Tôi không cần một bộ cân bằng tại thời điểm này.
Eamorr

Tôi không thể làm việc này. Apache tiếp tục trả lời bằng mã 404. Nó hiển thị trong nhật ký truy cập như thể nó đang cố tải một tệp bình thường và quá trình nút socket không có dấu hiệu nhận được yêu cầu (nó hiển thị lệnh gọi cho tệp socket.io.js)
ChiperSoft

1
Có vẻ như mod_rewrite không biết giao thức ws: //. Tôi thấy điều này trong nhật ký viết lại của mình: forcing proxy-throughput with http://[REDACTED].dev/ws://localhost:8082/socket.io/(domain.dev
ChiperSoft

Đây có lẽ là lý do tại sao: issues.apache.org/bugzilla/show_bug.cgi?id=55598 Hình như hỗ trợ cho các giao thức đã được bổ sung trong Apache 2.5
ChiperSoft

5
LƯU Ý : Các khối này phải được đặt trong <VirtualHost>khối theo thứ tự chính xác được mô tả, ngay cả khi bạn đang sử dụng gốc tài liệu (ví dụ /var/www/html). Tôi đã dành gần 2 giờ để cố gắng tìm ra lý do tại sao những thay đổi này không hoạt động chính xác, chỉ để tìm ra rằng những RewriteRulengười không hoạt động ở cấp độ gốc httpd.conf(mặc dù ProxyPassđã hoạt động). Các ProxyPasschỉ thị không hoạt động trong <Directory>các khối hoặc .htaccesstệp (mặc dù RewriteRulethực hiện), vì vậy vị trí hợp lý để nhóm các thay đổi này nằm trong <VirtualHost>.
Đánh dấu W
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.