首页 文章

WebSockets(Apache ProxyPass)

提问于
浏览
0

我想通过Apache设置一个简单的WebSocket连接 .

我正在运行两个Web服务器,一个是Apache,另一个是simple PHP WebSocket server来处理套接字连接,这是在RackSpace上托管的Ubuntu框上运行的 .

我已经做了很多研究,但仍未找到一个很好的例子,它显示了在远程主机上以任何语言(在本例中为PHP)设置WebSocket服务器的基本配置,我见过的每个例子都在使用'localhost'在我看来是没用的 .


所以Apache的root是/ 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>

我'm positive it'不是网络问题我确保允许两个端口(8080/9000),并确保加载mod_proxymod_proxy_wstunnel .

Question: 那我在Apache Config中做错了什么?

1 回答

  • 2

    我刚刚在自己的服务器上完成了这个设置,所以我希望这对某人有帮助 . 我的配置与你的配置非常相似 . 这就是我要改变的

    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/');
    

    VirtualHost

    # 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服务器不需要向公众公开 . 您可以将端口9000保持关闭状态 .

    我也启用了 mod_proxy_http ,但我不需要't know whether it' .

    如果没有发生重定向,请查看Apache错误日志 . 你已经提到了其中的几件事,但要确保:

    • 已加载 mod_proxymod_proxy_wstunnel

    • 在更改模块或VirtualHost配置后重启Apache

    • WS服务器正在运行并正在侦听端口9000

    • ProxyPass 在正确的VirtualHost中

相关问题