如何使用本教程在 apache 上设置 websockets,仅使用内置的 apache 模块?

问题描述 投票:0回答:2

我正在尝试 使用这些说明在我的本地主机 apache Web 服务器上设置 Websockets 连接,但它不起作用。

我打开了

mod_proxy_wstunnel
mod_proxy modules
,所以我应该能够在本地主机上运行 websockets。如今 Apache Web 服务器内置了 Websockets 支持。安装第三方 Websockets apache 模块(如 Rachet)的日子已经一去不复返了。

按照上述问题中的说明进行操作后,我收到此错误。

未捕获的 DOMException:无法在“WebSocket”上执行“发送”:仍处于 CONNECTING 状态。

与“ws://socket.localhost/”的 WebSocket 连接失败:

我使用的是 apache 网络服务器,而不是 litespeed、lighttpd、nginx 或 IIS。

顺便说一句,我正在使用Uniform Server

我的第一次尝试(以防有人评论让我展示我的作品)

确保以下apache模块已打开

  • mod_proxy_wstunnel
  • mod_proxy_modules

编辑已存在的名为 httpd.conf 的文件,然后将其插入其中。如果不同 apache 版本有重复的文件名,请确保编辑正确的文件

<VirtualHost *:80>
    ServerName socket.localhost

    ProxyRequests Off
    ProxyPass "/ws2/"  "ws://localhost:8546/"
    ProxyPass "/wss2/"  "wss://localhost:8546/"
</VirtualHost>

使用此 HTML 页面和内联 javascript 测试 websocket

<script type="text/javascript">
    var socket = new WebSocket('ws://socket.localhost');
    socket.send('Test');
</script>
apache websocket uniform-server
2个回答
1
投票

下面是我通过 websocket 用于 GraphQL 订阅的示例。

IP 和端口应由您的配置替换。

确保您已安装这些模块:

 proxy_module (shared)
 proxy_http_module (shared)
 proxy_wstunnel_module (shared)
 rewrite_module (shared)

站点配置:

<VirtualHost *:443>
        ServerName something.com
        ServerAdmin web@localhost
        DocumentRoot /var/www/html
        RewriteEngine On
        RewriteCond %{REQUEST_URI}  ^/subscription            [NC]
        RewriteCond %{QUERY_STRING} transport=websocket    [NC]
        RewriteRule /(.*)           ws://ip:port/$1 [P,L]
        ProxyPass "/subscriptions" "ws://ip:port/subscriptions"
        ProxyPassReverse "/subscriptions" "ws://ip:port/subscriptions"
        ProxyPass "/" "http://ip:port/"
        ProxyPassReverse "/" "http://ip:port/"
</VirtualHost>
/Subscription

是我的 websocket 端点。你的可能会有所不同。


0
投票

问题出在您的 javascript 代码上,只需尝试在 websocket.onopen 侦听器中发送消息,这就是您确保 WebSocket 不处于 CONNECTING 状态的方法。 下面是一个例子:

window.addEventListener("DOMContentLoaded", function (event) {
  const socket = new WebSocket("ws://localhost:8745/");
  socket.onopen = function () {
  socket.send("hey there)
  };
  socket.onmessage=function(event){
    console.log(event)
  }
  socket.onerror = function(error) {
    console.error("WebSocket error:", error);
  };
});
© www.soinside.com 2019 - 2024. All rights reserved.