我在我的开发环境中有一个运行在端口8888上的Apache服务器。 我想让我的WebSocket服务器使用相同的端口。 (原因是在现场环境中不是8888,我们希望每个用户都能够使用websocket,所以80端口是最好的)。
我认为,如果我可以代理呼叫8888到托pipe到端口12345的套接字可以工作的内部WebSocket。
到目前为止,我已经启用
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
我已经添加到我的httpd.conf中:
<VirtualHost *:8888> ProxyRequests On ProxyPass ^serverWebSocket.php ws://localhost:12345/serverWebSocket.php ProxyPassReverse ^serverWebSocket.php ws://localhost:12345/serverWebSocket.php </VirtualHost>
Javascript以这种方式打开套接字:
socket = new WebSocket("ws://localhost:8888/serverWebSocket.php");
我知道用于websocket的Javascript和PHP服务器的代码工作,因为如果我直接把端口12345直接工作。 但现在,我想从外部使用端口8888。
我错过了什么?
首先, closuresProxyRequests! 这个指令是用来创build一个代理服务器,可以给予互联网上所有网站的请求。 它会被发现和用于你不想做的事情,如果暴露在networking中。
无论如何..更改您的ProxyPass (和匹配反向)应该做的伎俩。 这里没有正则expression式,它在<VirtualHost>上下文中使用绝对path。 如果你需要正则expression式,你可以使用mod_rewrite,但是看起来并不像你所做的那样。
ProxyPass /serverWebSocket.php http://localhost:12345/serverWebSocket.php ProxyPassReverse /serverWebSocket.php http://localhost:12345/serverWebSocket.php
我想你会想使用Apache 2.4,并使用它的mod_proxy_wstunnel模块。
http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html
我甚至认为最好让你的API端点在不同的主机名上(例如api.example.com和www.example.com),这意味着你可以将APIstream量与非APIstream量分开,并使用基础设施这是适合每个人。 (例如:我最近听说,Varnish人群已经发布了一个像清漆的产品,但APIpipe理 – 这是我目前所知道的)。
由于C10K的关注,我不太愿意让Apache(至less2.2,这是我使用的)提供API端点。