使用apache mod_proxy_wstunnel的Websocket无法正常工作

时间:2016-09-28 08:32:20

标签: websocket mod-proxy apache2.4

我做了很好的准备:Apache 2.4 + PHP7 + WebSocket
访问此链接以查看我的准备工作 详情:Cannot load modules/mod_proxy_wstunnel.so into server
但是当我运行一个简单的WebSocket演示时,我遇到了一些问题。我不知道如何解决它们。

Websocket对我来说是一个新概念。我了解到Apache 2.4支持mod_proxy_wstunnel.so的WebSockets 我的步骤:

  1. 编辑httpd.conf,加载mod_proxymod_proxy_wstunnel(当然两者都在apachedir / modules中)
  2. LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
    
    1. 添加代理(仍在httpd中)
    2. ProxyPass /ws ws://10.180.0.123/
      ProxyPassReverse /ws ws://10.180.0.123/
      
      1. 创建HTML客户端和PHP服务器(cd apachedir/htdocs
      2. client.html

        <html>
        <script>
            var socket = new WebSocket("ws://10.180.0.123/server.php");
            socket.onopen = function(e){
                console.log("open success");
            }
            socket.onmessage = function(e){
                console.log("mes:"+e);
            }
            //socket.close();
            socket.send("Hello World");
        </script>
        <html>
        

        server.php

        <?php
          echo "hello";
        ?>
        

        4.start apache

        /usr/local/apache2/bin/apachectl start
        

        我的问题:

        1. 当我打开:10.180.0.123/client.html时,出现以下错误:
        2. Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.  
          WebSocket connection to 'ws://10.180.0.123/server.php' failed: Error during WebSocket handshake: Unexpected response code: 200  
          

          我想我应该在server.php中编写一些代码并运行它。我对吗?我该怎么写呢。我没有在谷歌上找到任何信息。

          1. 当我打开:10.180.0.123/ws/client.html时,我收到以下Apache错误日志
          2. [Wed Sep 28 00:14:54.063989 2016] [proxy:warn] [pid 6646:tid 140326217934592] [client 10.230.0.93:57508] AH01144: No protocol handler was valid for the URL /ws/client.html. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
            

            似乎没有加载代理模块,但请看我的屏幕截图:

            loaded modules screenshot

1 个答案:

答案 0 :(得分:3)

返回“hello”的PHP脚本不是WebSocket服务器。

您需要运行实际的WebSocket服务器并将代理配置指向它。

查看基于PHP的WebSocket服务器的Ratchet

当您运行WebSocket服务器时,您需要设置Apache配置。

假设它在同一台机器和8080端口上运行:

ProxyPass /ws ws://localhost:8080/
ProxyPassReverse /ws ws://localhost:8080/

client.html内,您应将WebSocket连接到ws://10.180.0.123/ws