Конфигурирование Apache 2.4 mod_proxy_wstunnel для Сокета. IO 1.0

Я пытаюсь настроить 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, таким образом, за исключением разветвления всей библиотеки я не могу изменить их.

14
задан 29 July 2014 в 20:12
1 ответ

Использовать условия перезаписи для этого особого случая:

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
38
ответ дан 2 December 2019 в 21:00

Теги

Похожие вопросы