Nginx 在 /socket.io 请求上返回 400
Posted
技术标签:
【中文标题】Nginx 在 /socket.io 请求上返回 400【英文标题】:Nginx returns 400 on /socket.io request 【发布时间】:2022-01-03 17:02:40 【问题描述】:Flask socket.io 无法在使用 gunicorn 和 nginx 的实时网站上运行。代码与主机上的 gunicorn 完美配合
Nginx 配置如下:
server
listen 80;
listen 443 ssl;
server_name domain_name;
ssl_certificate /home/azureuser/code/proj/cert.pem;
ssl_certificate_key /home/azureuser/code/proj/key.pem;
location = /favicon.ico access_log off; log_not_found off;
location /static/
root /home/azureuser/code/proj;
location /
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
location /socket.io
include proxy_params;
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://127.0.0.1:443/socket.io;
浏览器对 /socket.io 请求抛出 400 错误。有什么建议吗?
【问题讨论】:
什么是http://127.0.0.1:443
?您将 Socket.IO 转发给那个,而不是您的 gunicorn。
http://127.0.0.1:443
是 gunicorn,html 运行良好
抱歉,您的 nginx 配置不同意您的说法。根据您自己的配置,您可以在 Unix 套接字上运行 gunicorn。
【参考方案1】:
将您的位置参数更改为:
location ^~ /socket
rewrite ^/socket/(.*) /$1 break; #used to send request to base url
proxy_pass http://127.0.0.1:443;
proxy_redirect off;
proxy_pass_request_headers on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
更多详情请参考nginx as webserver incl. socket.io and node.js / ws:// 400 Bad Request
【讨论】:
以上是关于Nginx 在 /socket.io 请求上返回 400的主要内容,如果未能解决你的问题,请参考以下文章
使用 socket.io / nginx / node 时出现 CORS 错误
带有 nginx 负载平衡器问题的 Socket.IO 集群