部署Go Fiber WebSocket应用时出现426 Upgrade Required错误
问题分析与解决方案
为什么会出现426 Upgrade Required错误
你复制的那个/ws中间件作用很明确:它检查当前请求是否包含WebSocket协议升级所需的HTTP头(Upgrade: websocket和Connection: Upgrade),只有符合条件的请求才会被放行到后续的WebSocket处理逻辑,否则直接返回426错误。
部署到服务器后报错,核心原因是Nginx没有正确转发WebSocket升级请求的关键头信息,导致后端Fiber服务无法识别这是一个合法的WebSocket升级请求,从而触发了中间件的错误返回。
修正Nginx配置
需要在Nginx的代理配置中添加WebSocket专用的转发规则,确保升级头被正确传递给后端服务。修改后的配置如下:
server { listen 443 ssl; server_name myserver.com; server_tokens off; client_max_body_size 60M; ssl_certificate ...; ssl_certificate_key ...; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://rest-api:9000; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 添加WebSocket代理必备配置 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; proxy_read_timeout 86400; # 延长超时时间,避免长连接被过早断开 } }
如果你希望单独对/ws路径做更精细的控制,也可以单独配置一个location块:
location /ws/ { proxy_pass http://rest-api:9000; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # WebSocket代理必备配置 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; proxy_read_timeout 86400; }
后续操作与调试要点
- 重启Nginx生效配置:执行
sudo nginx -s reload让修改后的配置生效 - 客户端连接方式:因为服务器启用了SSL,客户端必须使用
wss://api.myserver.com/ws/comments进行连接(使用ws://会触发浏览器混合内容拦截,无法正常连接) - 调试请求头:可以通过浏览器开发者工具的Network面板,查看WebSocket请求的Request Headers,确认
Upgrade和Connection头是否存在且正确;同时查看Response Headers和状态码,验证是否正常升级
内容的提问来源于stack exchange,提问作者Andrew Rusinas
相关产品推荐
相关产品推荐

