Назад | Перейти на главную страницу

Настройка Apache 2.4 mod_proxy_wstunnel для Socket.IO 1.0

Я пытаюсь настроить 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/

Из своего поиска в Google я понял, что ProxyPass и Locations не могут настраивать таргетинг на строки запроса, так есть ли здесь другой вариант? Пути жестко запрограммированы в 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