WebSockets (Apache ProxyPass)
WebSockets (Apache ProxyPass)
我希望通过 Apache 设置一个简单的 WebSocket 连接。
我是 运行 两台网络服务器,其中一台是 Apache and the other a simple PHP WebSocket server to handle socket connections, this is running on a Ubuntu box hosted on RackSpace。
我已经做了很多研究,但仍然没有找到一个很好的例子来显示在远程主机上以任何语言(在本例中 PHP)设置 WebSocket 服务器的基本配置,我见过的每个例子都使用了 'localhost',在我看来这是毫无用处的。
所以 Apache 的根目录是 /var/www/html(默认)并且正在侦听端口 8080,因此下面的示例目的 (www.mydomain.com:8080) 是index.html
页面的源代码。
<html>
<head>
<script>
document.addEventListener("DOMContentLoaded", init);
function init(){
var socket = new WebSocket("ws://www.mydomain.com:8080/sockets");
setInterval(timer.sockstate, 3000, socket);
socket.addEventListener('open', sock.open);
socket.addEventListener('message', sock.msg);
socket.addEventListener('error', sock.err);
socket.addEventListener('close', sock.close);
}
var timer = {
"sockstate": function(o){
switch(o.readyState){
case 0:
console.log('CONNECTING...');
break;
case 1:
console.log('OPEN...');
break;
case 2:
console.log('CLOSING...');
break;
case 3:
console.log('CLOSED...');
break;
}
}
};
var sock = {
"open": function(e){
console.log(e);
},
"msg": function(e){
console.log(e);
},
"err": function(e){
console.log(e);
},
"close": function(e){
console.log(e);
}
};
</script>
</head>
<body></body>
</html>
现在 PHP 服务器正在端口 9000 上侦听 127.0.0.1 这是它的 source code,并且它通过 cmd 行启动正常 php -q /var/www/html/sockets/server.php
终于在 Apache 中找到我的配置文件
<VirtualHost *:8080>
ServerName www.mydomain.com
DocumentRoot /var/www/html
ProxyPass "/sockets/" "http://127.0.0.1:9000/"
ProxyPassReverse "/sockets/" "http://127.0.0.1:9000/"
</VirtualHost>
我确定这不是网络问题,我 ufw status
确保允许两个端口 (8080/9000),并确保 mod_proxy and mod_proxy_wstunnel 正在加载。
问题:那么我在 Apache 配置中做错了什么?
我刚刚在我自己的服务器上完成了这个设置,所以我希望这对某人有所帮助。我的配置与你的非常相似。这就是我要改变的
Javascript
//Notice the path ends with a trailing hash. Don't know whether it matters
var socket = new WebSocket('ws://www.domain.com:8080/socket/');
虚拟主机
# Protocol should be 'ws', not 'http', for mod_proxy_wstunnel to work
ProxyPass "/sockets/" "ws://127.0.0.1:9000/"
ProxyPassReverse "/sockets/" "ws://127.0.0.1:9000/"
因为 Apache 转发 WS 流量,websocket 服务器不需要暴露给 public。您可以保持端口 9000 对互联网关闭。
我也启用了mod_proxy_http
,但不知道是否需要。
如果没有发生重定向,请查看您的 Apache 错误日志。您已经提到了其中的一些事情,但请确保:
mod_proxy
和 mod_proxy_wstunnel
已加载
- 您在更改模块或 VirtualHost 配置后重新启动 Apache
- WS 服务器 运行 并侦听端口 9000
ProxyPass
在正确的虚拟主机中
我希望通过 Apache 设置一个简单的 WebSocket 连接。
我是 运行 两台网络服务器,其中一台是 Apache and the other a simple PHP WebSocket server to handle socket connections, this is running on a Ubuntu box hosted on RackSpace。
我已经做了很多研究,但仍然没有找到一个很好的例子来显示在远程主机上以任何语言(在本例中 PHP)设置 WebSocket 服务器的基本配置,我见过的每个例子都使用了 'localhost',在我看来这是毫无用处的。
所以 Apache 的根目录是 /var/www/html(默认)并且正在侦听端口 8080,因此下面的示例目的 (www.mydomain.com:8080) 是index.html
页面的源代码。
<html>
<head>
<script>
document.addEventListener("DOMContentLoaded", init);
function init(){
var socket = new WebSocket("ws://www.mydomain.com:8080/sockets");
setInterval(timer.sockstate, 3000, socket);
socket.addEventListener('open', sock.open);
socket.addEventListener('message', sock.msg);
socket.addEventListener('error', sock.err);
socket.addEventListener('close', sock.close);
}
var timer = {
"sockstate": function(o){
switch(o.readyState){
case 0:
console.log('CONNECTING...');
break;
case 1:
console.log('OPEN...');
break;
case 2:
console.log('CLOSING...');
break;
case 3:
console.log('CLOSED...');
break;
}
}
};
var sock = {
"open": function(e){
console.log(e);
},
"msg": function(e){
console.log(e);
},
"err": function(e){
console.log(e);
},
"close": function(e){
console.log(e);
}
};
</script>
</head>
<body></body>
</html>
现在 PHP 服务器正在端口 9000 上侦听 127.0.0.1 这是它的 source code,并且它通过 cmd 行启动正常 php -q /var/www/html/sockets/server.php
终于在 Apache 中找到我的配置文件
<VirtualHost *:8080>
ServerName www.mydomain.com
DocumentRoot /var/www/html
ProxyPass "/sockets/" "http://127.0.0.1:9000/"
ProxyPassReverse "/sockets/" "http://127.0.0.1:9000/"
</VirtualHost>
我确定这不是网络问题,我 ufw status
确保允许两个端口 (8080/9000),并确保 mod_proxy and mod_proxy_wstunnel 正在加载。
问题:那么我在 Apache 配置中做错了什么?
我刚刚在我自己的服务器上完成了这个设置,所以我希望这对某人有所帮助。我的配置与你的非常相似。这就是我要改变的
Javascript
//Notice the path ends with a trailing hash. Don't know whether it matters
var socket = new WebSocket('ws://www.domain.com:8080/socket/');
虚拟主机
# Protocol should be 'ws', not 'http', for mod_proxy_wstunnel to work
ProxyPass "/sockets/" "ws://127.0.0.1:9000/"
ProxyPassReverse "/sockets/" "ws://127.0.0.1:9000/"
因为 Apache 转发 WS 流量,websocket 服务器不需要暴露给 public。您可以保持端口 9000 对互联网关闭。
我也启用了mod_proxy_http
,但不知道是否需要。
如果没有发生重定向,请查看您的 Apache 错误日志。您已经提到了其中的一些事情,但请确保:
mod_proxy
和mod_proxy_wstunnel
已加载- 您在更改模块或 VirtualHost 配置后重新启动 Apache
- WS 服务器 运行 并侦听端口 9000
ProxyPass
在正确的虚拟主机中