如何配置 Apache 以正确转发 websocket



我已经在SO和相关网站上查看了这个问题和其他各种问题,但到目前为止建议的解决方案都没有奏效。

我在localhost:8080上运行tty.js,并验证了 websocket 在直接访问该端口时是否正常工作。现在,我正在尝试通过 Apache 反向代理连接到tty.js。该应用程序可以在不使用Websockets的情况下工作,但我试图理解为什么Websockets不起作用。

这是我的 Apache 配置,用于使用来自源代码的新 Apache 构建在 localhost 上进行测试。

Listen 9000
# Load proxy modules
LoadModule proxy_module "modules/mod_proxy.so"
LoadModule proxy_http_module "modules/mod_proxy_http.so"
LoadModule proxy_wstunnel_module "modules/mod_proxy_wstunnel.so"
<VirtualHost *:9000>
ServerName localhost
ProxyPass /tty/socket.io/1/ ws://localhost:8080/socket.io/1/
ProxyPassReverse /tty/socket.io/1/ ws://localhost:8080/socket.io/1/
ProxyPass /tty/ http://localhost:8080/
ProxyPassReverse /tty/ http://localhost:8080/
</VirtualHost>

当我连接到http://localhost:9000/tty/时,我收到500错误。

在服务器端日志中,我收到以下错误。

[Mon Jan 02 19:30:32.342551 2017] [proxy:warn] [pid 28226:tid 140098955872000] [client 127.0.0.1:38372] AH01144: No protocol handler was valid for the URL /tty/socket.io/1/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., referer: http://localhost:9000/tty/

Apache使Websocket正常工作的正确配置是什么?

在调试器中运行 Apache 几个小时后,我发现 Apache 忠实地通过 mod_proxy 传递了与给定路径匹配的所有请求,包括以下请求。

http://localhost:9000/tty/socket.io/1/

事实证明,此请求在带有 Upgrade: Websocket 标头的实际请求之前发出,并且是正常的 AJAX 请求

当这个请求传递给mod_proxy_wstunnel时,模块注意到Websocket头丢失并拒绝处理它,导致Apache在日志消息中声明该No protocol handler was valid并返回状态代码500。

解决方法是扩展 ProxyPath 指令的路径,使其仅涵盖实际的 Websocket 请求,而不涵盖杂散的 Ajax 请求。

ProxyPass /tty/socket.io/1/websocket/ ws://localhost:8080/socket.io/1/websocket/
ProxyPassReverse /tty/socket.io/1/websocket/ ws://localhost:8080/socket.io/1/websocket/

相关内容

  • 没有找到相关文章