使用Apache& amp;代理WebSocket连接Socket.io

时间:2015-04-13 19:48:54

标签: apache proxy socket.io

我遇到通过Apache(2.4.6)代理我的WebSocket连接(Socket.io)的问题。我试图使用Socket.io问题https://github.com/Automattic/socket.io/issues/1696中描述的设置,但我在开发人员工具中发现错误,导致WebSocket握手期间连接失败:

WebSocket connection to 'ws://example.domain.com/socket.io/?EIO=3&transport=websocket&sid=KPd7VBy4Yi7mj-wAAABN' failed: Error during WebSocket handshake: 'Connection' header value must contain 'Upgrade'

这种情况正在发生,因为Connection标头设置为Close而不是Upgrade

我已经确认已加载proxy_wstunnel_module模块,当我查看跟踪日志时,我可以看到它响应某些请求,但我仍然遇到上述错误。我绝对不是Apache专家,因此我在httpd.conf文件中认为某些内容不正确(我已尝试使用Apache文档确认所有行。

<VirtualHost *:80>

        ServerName example.domain.com
        ServerAlias example.domain.com

        Header set Access-Control-Allow-Origin "*"
        Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
        Header set Access-Control-Allow-Headers "content-type,x-requested-with"

        RewriteEngine on
        RewriteRule ^/$ /otherApp/home [PT]

        RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
        RewriteCond %{QUERY_STRING} transport=polling      [NC]
        RewriteRule /(.*)           http://localhost:3000/$1 [P,L]

        <Directory />
                Options All
                Order Deny,Allow
                Allow from all
        </Directory>

        ProxyRequests off

        <Proxy *>
                Order Deny,Allow
                Allow from all
        </Proxy>

        <Location />
                Order Deny,Allow
                Allow from all
        </Location>

        ProxyPass /socket.io            ws://localhost:3000/socket.io
        ProxyPassReverse /socket.io     ws://localhost:3000/socket.io

        ProxyPass /AnotherApp ajp://localhost:8009/location
        ProxyPass /AnotherApp2  ajp://somewhere.else:8009/location2

        DocumentRoot /opt/appThings
        <Directory /opt/appThings>
                Options +Indexes
                AllowOverride None
                Require all granted
        </Directory>
</VirtualHost>

有没有人在我上面的httpd.conf文件中看到任何可能导致此问题的明显内容?

如果需要其他相关信息,请与我们联系。我查看了日志,但我并不完全确定我需要查找的相关内容。

1 个答案:

答案 0 :(得分:3)

嗯,我不能完全确定正确的答案,因为我的另一位同事是明白了 - 而且我不确定他是否完全理解答案。

我认为我们发现的是我们所拥有的mod_rewrite模块的版本存在错误。我们必须使用建议的补丁编译该模块的源代码,这样才能使代理正常工作。

对于通过防火墙的请求,似乎还有某种“标题剥离”。似乎剥离了显然导致我们连接失败的Connection: Upgrade标题。

因此,虽然我没有尽可能多的细节,但希望这可能会给别人一些关于将来要找什么的线索。