使用websocket mod_proxy_wstunnel进行反向代理

12

我在使用反向代理Apache和WebSockets时遇到了问题,我升级到了最新的2.4.5版本,并加载了mod_proxy_wstunnel模块。

httpd.conf文件内容如下:

<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName www.toto.fr
ServerAlias toto.fr


ProxyPass /my_app  http://1X.X.X.1:8080/my_app
ProxyPassReverse /web_pmr  http://1X.X.X.1:8080/my_app
ProxyPassReverseCookiePath /my_app /
ProxyPassReverseCookieDomain localhost my_app
ProxyRequests off
ProxyTimeout 15

#WEBSOCKETS


ProxyPass /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/my_app/BasicWebsocketServlet retry=0
ProxyPassReverse /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/web_pmr/BasicWebsocketServlet retry=0


ErrorLog "logs/my_app_error.log"
LogLevel debug
CustomLog "logs/my_app_access.log" combined
<Proxy *>
      Order deny,allow
      Allow from all
</Proxy>
</VirtualHost>

在本地 URL 进行测试时,WebSocket 正常工作,但是通过反向代理 Apache,Tomcat 日志中没有任何迹象。


“无痕”是什么意思?请求是否被转发到Tomcat? - jimjag
1个回答

22

这一行:

ProxyPass /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/my_app/BasicWebsocketServlet retry=0

需要放在这个之前:

ProxyPass /my_app  http://1X.X.X.1:8080/my_app

解释(来自https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass):

ProxyPass指令的顺序

按照配置的顺序检查配置的ProxyPass和ProxyPassMatch规则。最先匹配的规则将获胜。因此,通常应该以最长的URL首先为冲突的ProxyPass规则排序。否则,后面的较长URL的规则会被任何使用URL前缀的先前规则隐藏。请注意,这与工作进程共享有一定关系。相反,一个位置块中只能放置一个ProxyPass指令,最具体的位置优先。

出于同样的原因,在普通的ProxyPass指令之前必须进行排除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接