【问题标题】:Ratchet + nginx + SSL/secure websocketRatchet + nginx + SSL/安全 websocket
【发布时间】:2014-04-24 23:26:42
【问题描述】:

我一直在尝试通过 SSL 运行 Ratchet.io(这个问题:php ratchet websocket SSL connect?)。

我的网络服务器在 myhost.mobi 上运行,并且我为 websocket 服务“wws.myhost.mobi”创建了一个单独的虚拟主机。

我的网络套接字:

$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, '0.0.0.0');
$webServer = new Ratchet\Server\IoServer(
    new Ratchet\Http\HttpServer(
        new Ratchet\WebSocket\WsServer(
            new Ratchet\Wamp\WampServer(
                $pusher
            )
        )
    ),
    $webSock
);

我的 nginx 配置(我在 nginx 1.5.8 上):

upstream websocketserver {
        server localhost:8080;
}

server {
    server_name wss.myapp.mobi;

    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/myapp-mobi-ssl.crt;
    ssl_certificate_key /etc/ssl/myapp-mobi.key;

    access_log /var/log/wss-access-ssl.log;
    error_log /var/log/wss-error-ssl.log;
    location / {
                proxy_pass http://websocketserver;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect
                proxy_redirect off;
        }
}

我的客户端脚本:

var conn = new ab.Session('wss://wss.myapp.mobi', function(o) {

    // ...

}, function() {
    console.warn('WebSocket connection closed');
}, {
    skipSubprotocolCheck: true
});

因此,当我在 Firefox 中加载页面时,我看到了到 wss://wss.myapp.mobi:8080/ 的传出连接,该连接挂起(微调器)并且永远不会完成或终止。我在日志中没有看到任何请求到达后端的痕迹。

我错过了什么?

谢谢!

编辑我意识到我应该连接到 wss://wss.myapp.mobi,但现在我获得了“101 切换协议”状态。

EDIT 2 现在一切都在使用上面的配置。 “101 Switching Protocols”状态原来是一条正常消息。问题解决了!

【问题讨论】:

  • 你真的帮了我这个问题。我无法让 websockets 在 Nginx 中使用 SSL。原来我错过了 proxy_set_header X-Forwarded-Proto https;配置中的指令-您的问题使我添加了它。谢谢!
  • 这个问题解决了(见编辑),但没有解释解决方案。
  • 您能否发布详细的解决方案作为答案?

标签: ssl nginx websocket ratchet


【解决方案1】:

通过检查问题编辑历史,很明显,问题中的配置是正确的,temuri 正在尝试使用设置的端口从客户端连接,

upstream websocketserver {
        server localhost:8080;
}

但是这个代码块告诉 Nginx 有一个 tcp 服务器在端口 8080 上运行,将其表示为 websocketserver 别名,但运行的服务器不可公开访问。

检查以下配置,

server {
    server_name wss.myapp.mobi;

    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/myapp-mobi-ssl.crt;
    ssl_certificate_key /etc/ssl/myapp-mobi.key;

    access_log /var/log/wss-access-ssl.log;
    error_log /var/log/wss-error-ssl.log;
    location / {
                proxy_pass http://websocketserver;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect
                proxy_redirect off;
        }
}

此配置将域 wss.myapp.mobi 绑定到端口 443,启用 ssl 和 proxy通过 proxy_pass 指令将请求发送到本地 websocket 服务器,其余指令用于连接升级处理。

所以websocket服务器可以通过浏览器客户端访问

// connect through binded domain
// instead of wss.myapp.mobi:8080 which will not work
var url = 'wss://wss.myapp.mobi';

【讨论】:

  • 你就是男人!我花了几天时间试图弄清楚这一点。这太疯狂了,因为 var url = 'ws://wss.myapp.mobi:8080' 绝对有效,但 var url = 'wss://wss.myapp.mobi:8080' 却不行。删除端口号解决了我的挫败感。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多