You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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测试端口是否可达,比如:
    telnet your_vps_public_ip 12345
    # 或者用nc
    nc -zv your_vps_public_ip 12345
    
    如果测试不通,重点排查网络层面(安全组、运营商端口限制);如果能通但WebSocket连接失败,检查客户端代码是否使用了正确的协议(ws而非wss)、路径是否匹配服务器配置。

内容的提问来源于stack exchange,提问作者Mahmoud amr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:39:34