棘轮&x2B;nginx+;SSL/安全websocket

棘轮&x2B;nginx+;SSL/安全websocket,ssl,nginx,websocket,ratchet,Ssl,Nginx,Websocket,Ratchet,我一直在尝试通过SSL运行Ratchet.io(此问题:) 我的Web服务器在myhost.mobi上运行,我已经为websocket服务“wws.myhost.mobi”创建了一个单独的虚拟主机 我的web套接字: $webSock = new React\Socket\Server($loop); $webSock->listen(8080, '0.0.0.0'); $webServer = new Ratchet\Server\IoServer( new Ratchet\Ht

我一直在尝试通过SSL运行Ratchet.io(此问题:)

我的Web服务器在myhost.mobi上运行,我已经为websocket服务“wws.myhost.mobi”创建了一个单独的虚拟主机

我的web套接字:

$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上):

我的客户端脚本:

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交换协议”状态


编辑2以上配置现在一切正常。“101交换协议”状态显示为正常消息。问题解决了

通过检查问题编辑历史记录,可以清楚地看出,问题中的配置是正确的,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\u-pass
指令将请求绑定到本地websocket服务器,rest指令用于连接升级处理

因此,可以使用浏览器客户端访问websocket服务器

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

你真的帮了我这个问题。我无法让WebSocket在Nginx中使用SSL。原来我缺少代理集头X-Forwarded-Proto-https;配置中的指令-您的问题让我添加了它。谢谢这个问题已经解决了(请参见编辑),但没有解释解决方案。您可以发布详细的解决方案作为答案吗?您就是那个人!我花了几天时间想弄明白这一点。这太疯狂了,因为var url='ws://wss.myapp.mobi:8080'绝对有效,而var url='wss://wss.myapp.mobi:8080”“没有。删除端口号修复了我的沮丧。非常感谢。
// connect through binded domain
// instead of wss.myapp.mobi:8080 which will not work
var url = 'wss://wss.myapp.mobi';