Я пытаюсь настроить Apache 2.4 для проксирования websocket соединения для socket.io к node.js websocket сервер, с помощью mod_proxy_wstunnel. У нас было это хорошо работающее с socket.io 0.9, но с этими 1,0 выпусками они изменили конечную точку сокета на параметр запроса, и теперь я испытываю затруднения при конфигурировании апача с корректными инструкциями прокси.
Все запросы к /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/
Я заключил от своего поиска с помощью Google, что ProxyPass и Местоположения не могут быть нацелены на строки запроса, так есть ли здесь какая-либо другая опция? Пути трудно кодируются в socket.io, таким образом, за исключением разветвления всей библиотеки я не могу изменить их.
Использовать условия перезаписи для этого особого случая:
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