CentOS VPS上Python简易WebSocket服务器无法接受外部连接求助
WebSocket服务器CentOS VPS外部无法连接问题排查
问题
我有一段本地运行正常的Python简易WebSocket服务器代码:
import asyncio import re import sys from queue import Queue import websockets import exampl_script client = None async def new_client_connected(client_socket, path): global client print("New Client Connected") client = client_socket while True: new_message = await client_socket.recv() print("Receivevd Message from the client") if new_message.endswith("."): new_message = re.sub(r'RECOGNIZED: Text=|。', '', new_message) exampl_script.cache += [new_message] async def start_server(): print("Server Started!") await websockets.serve(new_client_connected, '', port=12345, reuse_port=True) if __name__ == "__main__": event_loop = asyncio.get_event_loop() runners = [] runners.append(start_server()) exampl_script.main() event_loop.run_until_complete(asyncio.gather(*runners)) event_loop.run_forever()
该脚本在本地运行正常,JS可通过12345端口与WebSocket通信。但迁移至CentOS7.0 VPS并配置好网页(80端口可正常访问)后,外部电脑无法连接到WebSocket的12345端口。
已关闭系统所有防火墙(iptables、firewalld等),且确认应用正在监听该端口:lsof -i:12345输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python3 25461 root 6u IPv6 321812 0t0 TCP *:italk (LISTEN) python3 25461 root 7u IPv4 321813 0t0 TCP *:italk (LISTEN) python3 25462 root 6u IPv6 321800 0t0 TCP *:italk (LISTEN) python3 25462 root 7u IPv4 321801 0t0 TCP *:italk (LISTEN) python3 25463 root 6u IPv6 321807 0t0 TCP *:italk (LISTEN) python3 25463 root 7u IPv4 321808 0t0 TCP *:italk (LISTEN) python3 25464 root 6u IPv4 320792 0t0 TCP *:italk (LISTEN) python3 25464 root 7u IPv6 320793 0t0 TCP *:italk (LISTEN) python3 25692 root 6u IPv4 323315 0t0 TCP *:italk (LISTEN) python3 25692 root 7u IPv6 323316 0t0 TCP *:italk (LISTEN)
sudo netstat -nltp输出:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1112/sshd tcp 0 0 0.0.0.0:12345 0.0.0.0:* LISTEN 25692/python3 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 25414/nginx: master tcp6 0 0 :::22 :::* LISTEN 1112/sshd tcp6 0 0 :::12345 :::* LISTEN 25462/python3 tcp6 0 0 :::80 :::* LISTEN 25414/nginx: master
服务器本地执行python3 -m websockets "ws://localhost:12345"连接成功,但外部电脑用服务器IP无法访问。
解决方案
- 检查VPS运营商安全组:绝大多数云服务商自带安全组规则,即使关闭系统防火墙,安全组未开放12345端口会直接阻断外部连接。登录VPS管理控制台,添加入站规则,允许TCP协议、12345端口、所有来源IP访问。
- 修正服务器监听地址:代码中
websockets.serve的地址参数为空字符串'',在部分IPv6优先的环境下可能导致外部IPv4访问异常。改为明确监听0.0.0.0(所有IPv4地址):async def start_server(): print("Server Started!") # 强制监听所有IPv4地址,确保外部可访问 await websockets.serve(new_client_connected, '0.0.0.0', port=12345, reuse_port=True) - 清理多进程监听:从
lsof输出可见多个Python进程同时监听12345端口,尽管启用了reuse_port=True,但多实例可能导致连接逻辑异常。先杀掉所有相关进程,再启动单个实例:# 替换为你的脚本文件名 pkill -f "python3.*your_script_name.py" # 重新启动服务器 python3 your_script_name.py - 测试基础连通性:在外部电脑用
telnet或nc测试端口是否可达,比如:
如果测试不通,重点排查网络层面(安全组、运营商端口限制);如果能通但WebSocket连接失败,检查客户端代码是否使用了正确的协议(ws而非wss)、路径是否匹配服务器配置。telnet your_vps_public_ip 12345 # 或者用nc nc -zv your_vps_public_ip 12345
内容的提问来源于stack exchange,提问作者Mahmoud amr
相关产品推荐
相关产品推荐

