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

Flask-SocketIO部署Railway失败:tcp协议错误求助

解决Flask-SocketIO部署Railway时eventlet相关报错问题

问题场景

本地MacOS系统运行正常的Flask-SocketIO应用,部署到Railway平台时构建失败,核心报错为Error: class uri 'eventlet' invalid or not found,最终触发OSError: protocol not found。已尝试多种Procfile配置均未解决。

报错详情

Error: class uri 'eventlet' invalid or not found:
[Traceback (most recent call last):
File "/opt/venv/lib/python3.9/site-packages/gunicorn/util.py", line 99, in load_class
mod = importlib.import_module('.'.join(components))
File "/nix/store/dcy4s05wgyznzcvghsm1sgbf7a0xrp8k-python3-3.9.13/lib/python3.9/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "/opt/venv/lib/python3.9/site-packages/gunicorn/workers/geventlet.py", line 12, in <module>
import eventlet
File "/opt/venv/lib/python3.9/site-packages/eventlet/__init__.py", line 17, in <module>
from eventlet import convenience
File "/opt/venv/lib/python3.9/site-packages/eventlet/convenience.py", line 7, in <module>
from eventlet.green import socket
File "/opt/venv/lib/python3.9/site-packages/eventlet/green/socket.py", line 21, in <module>
from eventlet.support import greendns
File "/opt/venv/lib/python3.9/site-packages/eventlet/support/greendns.py", line 71, in <module>
setattr(dns.rdtypes.IN, pkg, import_patched('dns.rdtypes.IN.' + pkg))
File "/opt/venv/lib/python3.9/site-packages/eventlet/support/greendns.py", line 61, in import_patched
return patcher.import_patched(module_name, **modules)
File "/opt/venv/lib/python3.9/site-packages/eventlet/patcher.py", line 132, in import_patched
return inject(
File "/opt/venv/lib/python3.9/site-packages/eventlet/patcher.py", line 109, in inject
module = __import__(module_name, {}, {}, module_name.split('.')[:-1])
File "/opt/venv/lib/python3.9/site-packages/dns/rdtypes/IN/WKS.py", line 25, in <module>
_proto_tcp = socket.getprotobyname('tcp')
OSError: protocol not found
]

已尝试的Procfile配置

  • web: gunicorn --bind 0.0.0.0:${PORT} wsgi:app
  • web: gunicorn --worker-class eventlet -w 1 app:app

解决方案

报错根源是Railway容器环境缺失/etc/protocols文件,导致socket.getprotobyname('tcp')无法解析协议,进而引发eventlet加载失败。以下是可行解决方法:

1. 更换为gevent worker(推荐生产环境)

放弃eventlet,改用gevent作为Gunicorn的worker类型,同时依赖gevent-websocket支持WebSocket。

  • 更新requirements.txt,添加依赖:
    flask-socketio
    gunicorn
    gevent
    gevent-websocket
    
  • 修改Procfile为:
    web: gunicorn --worker-class gevent -w 1 --bind 0.0.0.0:${PORT} app:app
    

2. 手动添加/etc/protocols文件(保留eventlet)

如果必须使用eventlet,可手动将本地的协议文件复制到容器中:

  • 从本地MacOS复制/etc/protocols到项目根目录
  • 修改Procfile,先复制文件再启动服务:
    web: cp protocols /etc/protocols && gunicorn --worker-class eventlet -w 1 --bind 0.0.0.0:${PORT} app:app
    
  • 确保requirements.txt包含eventlet:
    flask-socketio
    gunicorn
    eventlet
    

3. 使用Flask内置服务器(仅测试用)

仅用于临时验证,不推荐生产环境:

  • 修改Procfile:
    web: python app.py
    
  • 在app.py中添加启动代码:
    import os
    from flask import Flask
    from flask_socketio import SocketIO
    
    app = Flask(__name__)
    socketio = SocketIO(app)
    
    # ... 其他业务代码 ...
    
    if __name__ == '__main__':
        port = int(os.environ.get('PORT', 5000))
        socketio.run(app, host='0.0.0.0', port=port, debug=False)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:45:27