Налаштування Apache 2.4 mod_proxy_wstunnel для Socket.IO 1.0


15

Я намагаюся налаштувати Apache 2.4 для підключення з'єднання websocket для socket.io до сервера websocket node.js, використовуючи mod_proxy_wstunnel. У нас це було чудово з socket.io 0.9, але з випуском 1.0 вони змінили кінцеву точку сокета на параметр запиту, і тепер у мене виникають проблеми з налаштуванням apache з правильними інструкціями проксі.

Усі запити до /socket.io/?EIO=N&transport=websocket(де N - будь-яка цифра, як правило, 2) потрібно переадресувати ws://localhost:8082/socket.io/, але всі інші запити потрібно переадресувати http://localhost:8082/socket.io/.

Я спробував варіанти обох наведених нижче конфігурацій:

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/

З мого googling я зрозумів, що ProxyPass і Locations не можуть орієнтуватися на рядки запитів, тож чи є тут інший варіант? Шляхи кодуються в socket.io, тому не вистачаючи розсилки на всю бібліотеку, я не можу їх змінити.

Відповіді:


39

Використовуйте умови перезапису, щоб відповідати цьому окремому випадку:

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

ПРИМІТКА Як Марк W зазначав нижче. Вони повинні бути введені на рівні vhost, а не на рівні сервера чи .htaccess.

Ви також можете посилатися на балансира:

<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 Ти зробив мій день. Був у цьому годинами. Я використав перший фрагмент коду. На даний момент мені не потрібен балансир.
Еамор

Я не в змозі змусити це працювати. Apache продовжує відповідати кодом 404. Він відображається в журналі доступу так, ніби він намагається завантажити нормальний файл, і процес вузла сокета не показує ознак отримання запиту (він дійсно показує виклик для файлу socket.io.js)
ChiperSoft,

1
Здається, що mod_rewrite не знає протокол ws: //. Я бачу це у своєму журналі переписування: forcing proxy-throughput with http://[REDACTED].dev/ws://localhost:8082/socket.io/(domain.dev
ChiperSoft

Ймовірно, саме тому: issues.apache.org/bugzilla/show_bug.cgi?id=55598 Схоже, підтримка протоколу була додана в Apache 2.5
ChiperSoft

5
ПРИМІТКА . Ці блоки слід розміщувати в <VirtualHost>блоці в точно описаному порядку, навіть якщо ви використовуєте корінь документа (наприклад /var/www/html). Я витратив майже 2 години, намагаючись з'ясувати, чому ці зміни не працюють належним чином, лише щоб з'ясувати, що ті RewriteRuleне функціонують на кореневому рівні httpd.conf(хоча ProxyPassпрацювали). Ці ProxyPassдирективи не працюють в <Directory>блоках або .htaccessфайлах (хоча RewriteRule«s робити), так що логічне місце в групі ці зміни в <VirtualHost>.
Позначте W
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.