nginx代理websocket需显式配置:启用http/1.1、透传upgrade和connection头、关闭缓冲、调大读写超时,且不缓存、不干预cors响应头。

要在CentOS系统上用Nginx把用户请求安全转发到后端服务(比如Flask、Node.js或Gotify),同时让实时通信的WebSocket连接不中断、不报错,必须同时满足路径转发、协议升级、长连接维持三个条件,缺一不可。
确认Nginx已安装并运行
执行sudo yum install nginx -y安装;若已安装,运行sudo systemctl start nginx && sudo systemctl enable nginx启动并设为开机自启。
验证是否生效:在浏览器中打开http://你的服务器IP,看到“Welcome to nginx!”页面即表示基础服务正常。
【注意】若提示端口被占用或启动失败,请先执行sudo netstat -tuln | grep :80检查80端口是否被Apache或其他进程占用。
配置反向代理转发后端HTTP服务
编辑主配置文件:sudo vim /etc/nginx/conf.d/backend.conf(推荐新建独立配置文件,避免污染默认配置)。
写入以下内容(以代理运行在127.0.0.1:3000的Node.js服务为例):
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
【关键点】proxy_pass末尾的/必须保留——它会剥离/api/前缀,只把/user/list这样的路径发给后端;漏掉斜杠会导致后端收到/api/user/list而404。
测试语法并重载:sudo nginx -t && sudo systemctl reload nginx。
配置WebSocket反向代理(含WSS支持)
WebSocket不是普通HTTP请求,它依赖HTTP/1.1的协议升级机制。Nginx必须显式透传Upgrade头并维持长连接,否则前端必然报“Error during WebSocket handshake”。
方法一:在已有server块内追加location(适合单服务轻量场景)
在刚才的backend.conf中,紧接在location /api/ } 块之后,新增:
location /ws/ {
proxy_pass http://127.0.0.1:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
方法二:独立HTTPS + WSS配置(生产推荐)
新建/etc/nginx/conf.d/wss.conf,内容如下:
upstream ws_backend {
server 127.0.0.1:3000;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location /ws/ {
proxy_pass http://ws_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
}
这一步必须确保SSL证书路径真实存在,否则nginx -t会直接报错退出。
强制HTTP跳转HTTPS(可选但强烈建议)
第一步:在/etc/nginx/conf.d/redirect.conf中写入:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
第二步:确认所有HTTPS server块中的server_name与该文件中完全一致,否则跳转会指向错误域名。
第三步:执行sudo nginx -t && sudo systemctl reload nginx生效。











