棘轮&x2B;nginx+;SSL/安全websocket
我一直在尝试通过SSL运行Ratchet.io(此问题:) 我的Web服务器在myhost.mobi上运行,我已经为websocket服务“wws.myhost.mobi”创建了一个单独的虚拟主机 我的web套接字:棘轮&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
$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';