今天在部署自己的前后端项目到腾讯云服务器时出现了这个问题,在本地调试时没有出现过,网上对于这个问题的潜在原因可以总结成以下几个:

  • 网络问题:网络连接不稳定或中断。
  • 服务器WebSocket配置错误:服务器未正确配置WebSocket支持,或WebSocket服务未启动。
# 检查 WebSocket 服务是否运行​
sudo netstat -tulnp | grep 8090
​​# 如果有输出​​(如 tcp6 0 0 :::8090 :::* LISTEN 12345/java),说明服务正在运行。
​​# 如果没有输出​​,说明服务未启动,检查日志并重启:
  • 跨域问题:尝试连接一个不同域的WebSocket服务器,但是未设置正确的跨域策略。
  • 协议不匹配:客户端和服务器使用的WebSocket协议版本不一致。

将以上潜在原因的解决方案都尝试一番后,还是没能解决问题。最后在AI的提示下尝试出了问题的原因:

没有开启服务器本地防火墙的WebSocket端口。
一开始将服务器本地防火墙和云服务器安全组混为一谈了,只是在服务器的控制台放行了8090端口,没有打开本地防火墙的8090端口(注:8090是前端向后端发起WebSocket连接使用的端口)。

解决方案
# 查看本地防火墙放行端口列表
sudo ufw status

# 打开本地防火墙8090端口
sudo ufw allow 8090/tcp
服务器本地防火墙和云服务器安全组的关系

在这里插入图片描述

引生问题:在项目部署过程中,我的许多中间件都是通过Docker部署,但是我都没有手动开启端口,为什么只需要放行云服务器安全组的端口就能在本地能正常访问这些容器?

Docker 默认网络模式(Bridge)的端口映射​​:这个模式会在你运行容器并映射端口(如 -p 9200:9200)后,自动在宿主机上创建一条 ​​iptables 规则​​,将宿主机的 9200 端口流量转发到容器内。也就是说由于 Docker 的 iptables 规则放行了 9200,云防火墙放行后,流量会直接抵达容器,无需再经过 ufw。

# 通过如下命令查看
sudo iptables -t nat -L -n 

# 示例规则:
# Chain DOCKER (2 references)
# target     prot opt source     destination
# DNAT       tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:9200 to:172.17.0.2:9200

更多推荐