39

我有一个棘轮聊天服务器文件

use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use MyAppChat\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
    new WsServer(
        new Chat()
    )
  , 26666
);
$server->run();

我使用 Websocket 连接,ws它工作正常

if ("WebSocket" in window) {
    var ws = new WebSocket("ws://ratchet.mydomain.org:8888");
    ws.onopen = function() {
        // Web Socket is connected. You can send data by send() method.
        ws.send("message to send");
    };
    ws.onmessage = function (evt) { 
        var received_msg = evt.data;
    };
    ws.onclose = function() { 
        // websocket is closed. 
    };
} else {
  // the browser doesn't support WebSocket.
}

我想要安全的连接,所以我尝试使用 SSL 连接但不工作。

if ("WebSocket" in window) {
    var ws = new WebSocket("wss://ratchet.mydomain.org:8888");
    ws.onopen = function() {
        // Web Socket is connected. You can send data by send() method.
        ws.send("message to send");
    };
    ws.onmessage = function (evt) { 
        var received_msg = evt.data;
    };
    ws.onclose = function() { 
        // websocket is closed. 
    };
} else {
  // the browser doesn't support WebSocket.
}

我的问题是如何使用 SSL 连接连接 websocket

任何想法?

4

9 回答 9

55

如果您使用的是 Apache Web 服务器(2.4 或更高版本),请在 httpd.conf 文件中启用这些模块:

  1. mod_proxy.so
  2. mod_proxy_wstunnel.so

将此设置添加到您的 httpd.conf 文件

ProxyPass /wss2/ ws://ratchet.mydomain.org:8888/

如果需要 WSS 连接,请在 JavaScript 调用中使用此 URL:

var ws = new WebSocket("wss://ratchet.mydomain.org/wss2/NNN");

重新启动 Apache Web 服务器并确保您的 Ratchet 工作程序(Web 套接字连接)在应用设置(telnet 主机名端口)之前已打开。

于 2015-02-08T11:45:00.437 回答
14

几天前我正在寻找这个问题的答案,我在 Github Ratchet 问题中找到了这个:https ://github.com/ratchetphp/Ratchet/issues/489

heidji回答的最后一个答案是这样说的:

我只为像我这样需要快速说明如何实现 SSL 的新手添加了此评论:通过 ReactPHP 文档,您只需构建以这种方式提到的 SecureServer:
$webSock = new React\Socket\Server('0.0.0.0:8443', $loop);
$webSock = new React\Socket\SecureServer($webSock, $loop, ['local_cert' => '/etc/ssl/key.pem', 'allow_self_signed' => true, 'verify_peer' => false]);
然后注入上面 cboden 提到的 IoServer

因此,现在似乎有一种方法可以使用 Ratchet 实现安全的 websocket 服务器,而无需 HTTPS 代理。

这里有 SecureServer 类文档:https ://github.com/reactphp/socket#secureserver

于 2017-11-09T11:34:34.150 回答
11

问题是 React(构建 Ratchet 的基础上)不支持直接 SSL 连接。看到这个问题

有一个简单的解决方法。使用具有如下配置的stunnel :

[websockets]
accept = 8443
connect = 8888

Stunnel 将处理端口 8443 上的 SSL 流量并将它们移植到您的 websocket 服务器。

于 2013-06-07T21:27:56.587 回答
9

我在Chris Boden的 Ratchet 谷歌小组中找到了这个答案:

最好的解决方案是使用 Nginx 作为您的 Web 服务器。让 Nginx 在端口 80 上侦听传入连接并让它处理您的 SSL。Nginx 会将传入连接转发到您的常规网站的 PHP-FPM,如果它检测到连接是 WebSocket 连接,则将其代理到您选择的端口上正在运行的 Ratchet 应用程序。然后您的 javascript 可以通过 wss://mydomain.org连接

如果您的应用程序将使用nginx提供服务,这是使用stunnel的另一种方法。

于 2013-11-26T21:20:14.220 回答
5

如果您使用的是 Nginx,只需在您的 SSL 服务器块中写入:

location /services/myservice {
    # switch off logging
    access_log off;

    # redirect all HTTP traffic to localhost
    proxy_pass http://localhost:1234;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support (nginx 1.4)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    # Path rewriting
    rewrite /services/myservice/(.*) /$1 break;
    proxy_redirect off;

    # timeout extension, possibly keep this short if using a ping strategy
    proxy_read_timeout 99999s;
}

这将升级wss://yoursite.com/services/myservice对在端口 1234 上运行的套接字的任何调用。只要确保您记住不要让端口 1234 对世界开放。

于 2017-03-25T05:41:07.010 回答
4

Apache 也为我工作,只需添加域 conf:

ProxyPass /wss/ wss://127.0.0.1:8888/

重新加载 apache,然后在客户端设置 wss 以包含/wss/位置。

wss://127.0.0.1/wss/
于 2014-12-18T18:59:32.923 回答
3

如果您使用的是 Windows IIS,请确保已将其配置为 HTTPS(我使用的是自签名证书),然后安装反向代理:

URL 重写: https ://www.iis.net/downloads/microsoft/url-rewrite 和 ARR 3.0: https ://www.iis.net/downloads/microsoft/application-request-routing

您还需要在 IIS 中启用 websockets 支持:在此处输入图像描述

为 URL 重写创建文件夹(例如 myproxyfolder),在此文件夹上创建包含内容的 web.config 文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="WebSocketProxy" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://127.0.0.1:8080" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

并将“ http://127.0.0.1:8080 ”更改为您的 websocket 服务(我在 WIN 上使用 Ratched for PHP)。

在 javascript 的客户端,使用安全的 websockets wss:// 协议,例如:

    mysock = new WebSocket('wss://127.0.0.1/myproxyfolder');
...
于 2017-10-24T09:09:03.863 回答
1

它适用于 ubuntu 18.04。

var ws = new WebSocket('wss://domain.com/ws/');

通过在终端中运行以下命令启用代理模块。

sudo a2enmod 代理 proxy_balancer proxy_wstunnel proxy_http

在我的 Apache 虚拟主机配置文件中添加了这些行(/etc/apache2/sites-available/000-default-le-ssl.conf)

代理请求关闭

ProxyPass "/ws/" "ws://domain.com:5555/"

重启apache服务。websocket 开始在 https 中工作。

于 2019-01-29T09:20:02.510 回答
0

我试图为子域执行此操作。例如:从 apache 将 realtime.domain.org 重定向到 localhost:8080。

这是它的工作原理。您可以创建一个虚拟主机和代理传递它。

<VirtualHost *:80>
    ServerName realtime.domain.org

    RewriteEngine On
    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteRule /(.*) ws://localhost:8080/$1 [P,L]

    ProxyPreserveHost On
    ProxyRequests off
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>

因此,对 realtime.domain.org 的所有请求都可以重定向到端口 8080,您可以在其中运行 WebSocket 处理程序。

于 2019-10-23T15:04:02.573 回答