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 握手不起作用