如何配置Apache以正确转发websockets?

时间:2017-01-03 00:32:56

标签: node.js apache websocket mod-proxy mod-proxy-wstunnel

我已经在SO和相关网站上查看了this question以及其他各种信息,但到目前为止所提出的解决方案都没有奏效。

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

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

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使Websockets正常工作的正确配置是什么?

1 个答案:

答案 0 :(得分:1)

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

 checking pcap.h usability... yes
 checking pcap.h presence... yes
 checking for pcap.h... yes
 checking for pcap_compile in -lpcap... no
 configure: error: libpcap is required

事实证明,此请求在具有http://localhost:9000/tty/socket.io/1/ 标头的实际请求之前发出,并且它是正常的AJAX请求

当此请求传递给Upgrade: Websocket时,模块会注意到Websocket标头丢失并拒绝处理它,导致Apache在日志消息中声明mod_proxy_wstunnel并返回状态代码500。

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

No protocol handler was valid