我有一个用FeathersJS构建的节点应用程序在我的服务器上运行,我希望它在apache后面,我试图使用apache中的mod_proxy模块来实现这一点,但我遇到了问题。
这是我的apache mod_proxy部分的样子:
<IfModule mod_proxy.c>
ProxyRequests off
ProxyPass /ws/api/phone/ ws://localhost:3030
ProxyPassReverse /ws/api/phone/ ws://localhost:3030
ProxyPass /api/phone/ http://localhost:3030/
ProxyPassReverse /api/phone/ http://localhost:3030/
</IfModule>
我已经设置了我的客户端套接字配置如下:
var socket = io('/', { path: '/ws/api/phone/socket.io/', transports: ['websocket']});
当我尝试打开使用应用程序时,我得到以下错误:
WebSocket connection to 'ws://local.mysite.com/ws/api/phone/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 500
我启用了apache日志记录,错误如下:
127.0.0.1 - - [22/Oct/2016:14:48:32 -0400] "GET /ws/api/phone/socket.io/?EIO=3&transport=websocket HTTP/1.1" 500 540 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"
如果我通过localhost运行一切,它工作完美,没有问题,所以这显然是ProxyPass的问题。任何帮助将是非常感激的,或者如果有另一种方式,我可以完成把节点应用程序后面的apache不使用ProxyPass我有兴趣听到任何其他的解决方案。
这是我在2.4.10上的工作:自从我配置这个已经有一段时间了,但我知道我不能使用纯ProxyPass
使其工作ServerName api.example.com
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteRule ^/(.*) ws://localhost:3030/$1 [P,L]
ProxyPass / http://localhost:3030/
ProxyPassReverse / http://localhost:3030/