通过 Apache 反向代理运行 Socket.io

Des*_*ond 2 apache node.js socket.io

我正在尝试在 Apache 后面运行 NodeJS,但到目前为止我遇到了 Socket.io 问题。

\n\n

我直接访问应用程序没有问题,但每当我通过我的域访问时,我都会从 socket.io 抛出此错误:

\n\n
Firefox can\xe2\x80\x99t establish a connection to the server at wss://example.com/socket.io/?EIO=3&transport=websocket&sid=X-hLU73t7ojk2zoRAAAB.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的Apache配置如下:

\n\n
     <VirtualHost _default_:443>\n            ServerName example.com\n\n            ErrorLog ${APACHE_LOG_DIR}/error.log\n            CustomLog ${APACHE_LOG_DIR}/access.log combined\n\n            SSLEngine on\n\n            SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt\n            SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key\n\n\n            ProxyRequests off\n            ProxyVia on\n\n            RewriteEngine On\n            RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]\n            RewriteCond %{QUERY_STRING} transport=websocket    [NC]\n            RewriteRule /(.*)           ws://localhost:8080/$1 [P,L]\n\n            ProxyPass        /socket.io http://localhost:8080/socket.io\n            ProxyPassReverse /socket.io http://localhost:8080/socket.io\n\n            <Location />\n                ProxyPass http://127.0.0.1:8080/\n                ProxyPassReverse http://127.0.0.1:8080/\n            </Location>\n            #ProxyPass / http://localhost:8080/\n            #ProxyPassReverse / http://localhost:8080/\n\n            # BrowserMatch "MSIE [2-6]" \\\n            #               nokeepalive ssl-unclean-shutdown \\\n            #               downgrade-1.0 force-response-1.0\n\n            BrowserMatch "MSIE [2-6]" \\\n                           nokeepalive ssl-unclean-shutdown \\\n                           downgrade-1.0 force-response-1.0\n\n    </VirtualHost>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我也尝试过更改RewriteRule /(.*)wss://localhost:8080/$1 [P,L]但仍然抛出相同的错误。似乎找不到任何其他答案来解决这个问题。

\n\n

我相信我正在使用 socket.io 2.0,并且在客户端它是这样连接的:

\n\n
var socket = io();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是让我烦恼的地方

\n\n

在此输入图像描述

\n\n

似乎有些连接正在建立,但有一个却没有。

\n

小智 9

考虑在 Apache 中设置连接升级。这就是我配置 nginx 所需要的。此外,这些 http 请求可能是为客户端文件提供服务的 socketio。

另请参阅:http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html

编辑:

通过传递 ws/wss 代理解决了该问题,如 mod_proxy_wstunnel 中所述。apache 虚拟主机配置应该有这样的:

         ProxyPass /socket.io/ ws://localhost:8080/socket.io
         ProxyPassReverse /socket.io/ ws://localhost:8080/socket.io
Run Code Online (Sandbox Code Playgroud)

而不是这个:

        ProxyPass /socket.io http://localhost:8080/socket.io
        ProxyPassReverse /socket.io http://localhost:8080/socket.io
Run Code Online (Sandbox Code Playgroud)