首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >棘轮+ nginx +SSL/安全websocket

棘轮+ nginx +SSL/安全websocket
EN

Stack Overflow用户
提问于 2014-03-19 08:05:04
回答 1查看 9.7K关注 0票数 19

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

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

我的网页插座:

代码语言:javascript
复制
$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上):

代码语言:javascript
复制
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;
        }
}

我的客户端脚本:

代码语言:javascript
复制
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 Switching Protocols“状态。

使用上面的配置,EDIT 2一切都可以正常工作。"101切换协议“状态原来是一条正常消息。问题解决了!

EN

回答 1

Stack Overflow用户

发布于 2017-06-12 16:55:00

通过检查问题编辑历史,可以清楚地看到,问题中的配置是正确的,temuri正在尝试使用中设置的端口从客户端进行连接,

代码语言:javascript
复制
upstream websocketserver {
        server localhost:8080;
}

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

检查下面的配置。

代码语言:javascript
复制
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_pass指令将请求proxy到本地websocket服务器,rest指令用于连接升级处理。

这样就可以通过浏览器客户端访问websocket服务器。

代码语言:javascript
复制
// connect through binded domain
// instead of wss.myapp.mobi:8080 which will not work
var url = 'wss://wss.myapp.mobi';
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22493646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档