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 和 http 2 的 Socket.io

带有 nginx 负载平衡器问题的 Socket.IO 集群

Socket.io 不适用于 nginx

使用 Nginx 的 socket.io 出现 CORS 错误

从 Nginx 到 express.js 上的 socket.io 的反向代理上的“无法获取”