nginx websocket握手不起作用,配置错误?

Posted

技术标签:

【中文标题】nginx websocket握手不起作用,配置错误?【英文标题】:nginx websocket handshake doesnt work, wrong configuration? 【发布时间】:2019-11-21 19:20:10 【问题描述】:

我有一个 php 脚本,它只有一些功能,比如获取一些内容或将文件发布到服务器。

现在我正在尝试用 JS 打开一个 websocket。但我每次握手都不起作用。 new WebSocket('myDomain.com')

与“ws://mydomain.com/ws”的 WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:200

我不确定,出了什么问题。

server 
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
#    listen 80 default_server;
#    listen [::]:80 default_server;
#    root /var/www/html;
    server_name  mydomain.com;

#  index index.php index.html index.htm index.nginx-debian.html;

    listen 443 ssl; # managed by Certbot

    # RSA certificate
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    location ~ \.php$ 
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    
    location / 
                try_files $uri $uri/ =404;
#      proxy_set_header Upgrade $http_upgrade;
#      proxy_set_header Connection $connection_upgrade;

    


【问题讨论】:

【参考方案1】:

设置中似乎缺少 websocket 服务器。

它应该绑定到一个独立于 nginx 的端口。

相关的 nginx 设置应该如下所示:

    location /ws 
        proxy_pass http://localhost:8123/websocket;

        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    

您的 php 脚本可能需要扩展为 php websocket 服务器。

你可以在这里阅读:

How to create websockets server in PHP

【讨论】:

好的,那么问题还在于php脚本需要打开一个socket吗?所以我需要把它还给开发者。非常感谢! 如果您想要使用 websockets,那么还有更多工作要做。如果您想获取/发布一些内容,可以查看 ajax 以通过 GET/POST 而不是 websockets 进行通信。 我有一个代码可以部署在 nginx 服务器上,并且使用了我以前没有使用过的技术。但我目前无法更改代码。所以我很高兴知道这不仅仅是失败的 nginx 配置。

以上是关于nginx websocket握手不起作用,配置错误?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase - 切换到 WebSocket 协议 - 握手不起作用

Node.JS、Socket.IO 和集群中的 WebSocket 握手不起作用

nginx websocket配置

将 nginx 配置为 websocket 的代理

Nginx add_header Sec-WebSocket-Protocol 不起作用

php websocket连接报错怎么解决