微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ratchet websocket (Docker/nginx/SSL) WebSocket 打开握手超时

如何解决Ratchet websocket (Docker/nginx/SSL) WebSocket 打开握手超时

女士们先生们您好!我想弄清楚如何使用 Docker (laradock)、NginxPHP、棘轮 (https://socketo.me) 和 wss 协议进行聊天(因为我的网站使用的是 SSL)。

问题出现在js控制台的聊天页面

WebSocket connection to 'wss://mydomain.com:8787/' Failed: WebSocket opening handshake timed out

当时,如果我尝试通过 ws:// 进行连接,则会出现页面是通过 https 加载的错误,因此我必须使用 wss。

我有什么:

我在我的工作区容器上创建并公开了 8787 端口: docker ps screenshot

这是我从棘轮文档复制并通过 ssh 控制台运行的 websocket 服务器代码

use Classes\Messenger\Chat;
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;

require('/var/www/mydomain.com/vendor/autoload.PHP');


$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),8787,'0.0.0.0'
);

$server->run();

这是我的页面聊天脚本:

<script>
   var conn = new WebSocket('wss://mydomain.com:8787');
   conn.onopen = function(e) {
      console.log("Connection established!");
   };

   conn.onmessage = function(e) {
      console.log(e.data);
   };
</script>

我尝试了从搜索获取的所有提示,但我发现的所有信息都非常矛盾。

我尝试了什么:

我尝试在 Nginx docker 容器上公开端口并在 443 端口侦听器中使用 proxy_pass,如下所示:

server {
    server_name mydomain.com;

    # For https
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate /var/certs/mydomain.com_fullchain1.pem;
    ssl_certificate_key /var/certs/mydomain.com_privkey1.pem;
    #ssl_trusted_certificate /var/certs/mydomain.com_chain1.pem;

    root /var/www/mydomain.com;
    index index.PHP index.html index.htm;

    location /websocket {
        proxy_pass                              http://172.22.0.1:8787;
        proxy_pass_header                       Server;
        proxy_http_version                      1.1;
        proxy_set_header Upgrade                $http_upgrade;
        proxy_set_header Connection             "upgrade";
        proxy_read_timeout                      86400;
        proxy_set_header Host                   $host;
        proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP              $remote_addr;
    }

然后在我的页内聊天脚本中按行 new WebSocket('wss://mydomain/websocket'); 连接到 websocket,但它确实影响了“CONNECTION_REFUSED”错误

请告诉我必须朝哪个方向探索。感谢您的时间!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。