Apache 代理请求

Apache 代理请求

我的开发环境中有一个在端口 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 端点。

相关内容