![Apache 代理请求](https://linux22.com/image/555007/Apache%20%E4%BB%A3%E7%90%86%E8%AF%B7%E6%B1%82.png)
我的开发环境中有一个在端口 8888 上运行的 Apache 服务器。我希望我的 WebSocket 服务器使用相同的端口。(原因是在实时环境中它不是 8888,我们希望每个用户都能使用 websocket,因此端口 80 是最好的)。
我认为如果我可以将对 8888 的调用代理到托管在端口 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。
我错过了什么?
答案1
首先: 关闭 ProxyRequests! 该指令用于创建一个代理服务器,该服务器可以向互联网上的所有站点发出请求;它将要如果暴露在网络上,就会被发现并被用来做一些你不想做的事情。
无论如何……更改您的ProxyPass
(并匹配反向)应该可以解决问题。这里没有正则表达式,它在<VirtualHost>
上下文中使用绝对路径。如果您需要正则表达式,您可以使用 mod_rewrite,但看起来您不需要。
ProxyPass /serverWebSocket.php http://localhost:12345/serverWebSocket.php
ProxyPassReverse /serverWebSocket.php http://localhost:12345/serverWebSocket.php
答案2
我认为您会想要使用 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),这意味着您可以将 API 流量与非 API 流量分开,并使用适合每种流量的基础设施。(例如:我最近听说 Varnish 团队发布了一款类似 varnish 的产品,但用于 API 管理 --- 这就是我目前所知道的全部内容)。
由于 C10K 问题,我不太愿意让 Apache(至少是 2.2,我使用的版本)提供 API 端点。