go websocket 服务 及 nginx 的配置

go websocket 开启服务 ws, wss 服务

  • 5001 对应的是 ws, 5000 对应的是 wss
go func() {
	if err := r.Run(fmt.Sprintf(":%d", c.WsPort)); err != nil {
		global.Logger.Panic("启动失败 ws:", err)
	}
}()
if err := r.RunTLS(fmt.Sprintf(":%d", c.WssPort), "domain.crt", "privkey.key"); err != nil {
	global.Logger.Panic("启动失败 wss:", err)
}

Nginx 中 80,443 端口配置

1.

检查 Nginx 配置

确保您的 Nginx 配置针对 WebSocket 的设置是否正确。以下是一个基本的配置示例(包括SSL的配置):

nginx<button><svg><path></path></svg><span>Copy code</span><span></span></button>
server {
    listen 80;
    server_name task.vip;

location /ws {
    proxy_pass http://localhost:5001;
    proxy_http_version 1.1;  # 使用 HTTP/1.1,支持 WebSocket
    proxy_set_header Upgrade $http_upgrade;  # 确保 WebSocket 升级请求通过
    proxy_set_header Connection "upgrade";  # 把连接标记为升级
    proxy_set_header Host $host;  # 注意,如果没有,这里对应指向后端服务 localhost:5001,而不是取 $host
    proxy_set_header X-Real-IP $remote_addr;  # 转发用户 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 转发代理 IP
    proxy_set_header X-Forwarded-Proto $scheme;  # 转发协议(http 或 https)
}




}




server {

listen 443 ssl;

server_name task.vip;



ssl_certificate /path/to/your/certificate.crt;  # 替换为您的证书路径
ssl_certificate_key /path/to/your/private.key;  # 替换为您的私钥路径

location /ws {
    proxy_pass http://localhost:5000;  # 注意,这里应该用 https, 对应 go websocket 中的服务 wss 服务,因为对应的 http 对应的应该是 ws 5001
    proxy_http_version 1.1;  # 使用 HTTP/1.1
    proxy_set_header Upgrade $http_upgrade;  # 确保 WebSocket 升级请求通过
    proxy_set_header Connection "upgrade";  # 把连接标记为升级
    proxy_set_header Host $host;  # 注意,如果在私有网络中,这里对应指向后端服务 localhost:5000,而不是取 $host
    proxy_set_header X-Real-IP $remote_addr;  # 转发用户 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 转发代理 IP
    proxy_set_header X-Forwarded-Proto $scheme;  # 转发协议(http 或 https)
}


location /ws {
    proxy_pass http://localhost:5001;
    proxy_http_version 1.1;  # 使用 HTTP/1.1,支持 WebSocket
    proxy_set_header Upgrade $http_upgrade;  # 确保 WebSocket 升级请求通过
    proxy_set_header Connection "upgrade";  # 把连接标记为升级
    proxy_set_header Host $host;  # 注意,如果没有,这里对应指向后端服务 localhost:5001,而不是取 $host
    proxy_set_header X-Real-IP $remote_addr;  # 转发用户 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 转发代理 IP
    proxy_set_header X-Forwarded-Proto $scheme;  # 转发协议(http 或 https)
}
ssl_certificate /path/to/your/certificate.crt;  # 替换为您的证书路径
ssl_certificate_key /path/to/your/private.key;  # 替换为您的私钥路径

location /ws {
    proxy_pass http://localhost:5000;  # 注意,这里应该用 https, 对应 go websocket 中的服务 wss 服务,因为对应的 http 对应的应该是 ws 5001
    proxy_http_version 1.1;  # 使用 HTTP/1.1
    proxy_set_header Upgrade $http_upgrade;  # 确保 WebSocket 升级请求通过
    proxy_set_header Connection "upgrade";  # 把连接标记为升级
    proxy_set_header Host $host;  # 注意,如果在私有网络中,这里对应指向后端服务 localhost:5000,而不是取 $host
    proxy_set_header X-Real-IP $remote_addr;  # 转发用户 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 转发代理 IP
    proxy_set_header X-Forwarded-Proto $scheme;  # 转发协议(http 或 https)
}
}

2.

检查后端服务

确保位于 localhost:5000 上的 WebSocket 服务正在运行,并且可以处理来自 Nginx 的 WebSocket 请求。尝试直接使用 WebSocket 客户端连接到 ws://localhost:5000/ws 测试后端服务是否正常工作。

3.

SSL/TLS 到 WebSocket 的配置

确认您的 WebSocket 后端服务支持在 TLS(SSL)下运行。虽然您可以通过 http://localhost:5000 来处理 WebSocket,但您需要确保它至少也支持在 HTTPS 基础上进行的连接。

4.

跨域问题

如果您的 WebSocket 前端与后端分属不同的域,确保后端处理了跨域请求,特别是通过适当的 CORS 策略来允许来自 task.vip 的请求。

5.

查看 Nginx 错误日志

在 Nginx 错误日志中查找更详细的信息。错误日志通常位于 /var/log/nginx/error.log,查看是否有相关的错误消息,可以帮助定位问题的根源。

6.

检查浏览器控制台

查看浏览器的开发者控制台,确认是否有其他更详细的错误信息。例如,SSL 证书是否有效、握手是否被阻止、拒绝连接等。

7.

Nginx 版本

您的 Nginx 版本是 1.15.11,这个版本相对比较老,建议考虑升级 Nginx 至更新版本,以便获取到更多的功能和 bug 修复,尤其是对 WebSocket 的支持。

8.

示例调试

  • 在 Nginx 中将 location /ws 通配符替换为 location /ws/,确保路径一致性。
  • 将 proxy_set_header Connection "Upgrade"; 和 proxy_set_header Upgrade $http_upgrade; 放置在 location 内部以确保它们被正确解析。

完成前述检查和配置后,重启 Nginx 服务并再次测试连接以查看问题是否得到解决。使用以下命令重启 Nginx:

bash<button><svg><path></path></svg><span>Copy code</span><span></span></button>
sudo systemctl restart nginx

希望以上信息能帮助您解决问题!如果问题依然存在,请提供更多的上下文信息来进行更深入的分析。

连接 WS、WSS - 可直接用 postman 测试

  • ws://task.vip/ws
  • wss://task.vip/ws
posted @   nswodewy  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示