棘轮+ nginx + SSL /安全websocket

tem*_*uri 17 ssl nginx websocket ratchet

我一直试图通过SSL运行Ratchet.io(这个问题:php棘轮websocket SSL连接?).

我的网络服务器在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
);
Run Code Online (Sandbox Code Playgroud)

我的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;
        }
}
Run Code Online (Sandbox Code Playgroud)

我的客户端脚本:

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

    // ...

}, function() {
    console.warn('WebSocket connection closed');
}, {
    skipSubprotocolCheck: true
});
Run Code Online (Sandbox Code Playgroud)

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

我在那里错过了什么?

谢谢!

编辑我已经意识到我应该连接到wss://wss.myapp.mobi,但现在我正在获得"101 Switching Protocols"状态.

编辑2现在使用上面的配置一切正常."101 Switching Protocols"状态证明是正常消息.问题解决了!

Ren*_*han 7

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

upstream websocketserver {
        server localhost:8080;
}
Run Code Online (Sandbox Code Playgroud)

但是这个代码块告诉 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;
        }
}
Run Code Online (Sandbox Code Playgroud)

此配置将域绑定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';
Run Code Online (Sandbox Code Playgroud)