如何在Phusion Passenger中使用Flask-SocketIO?
如何在Phusion Passenger中使用Flask-SocketIO?
嘿,我之前也踩过这个坑,刚好能给你捋清楚怎么解决这个矛盾——Phusion Passenger要自己接管服务器启动,而Flask-SocketIO又依赖异步服务器的问题,其实只要调整下代码和配置就能搞定,具体步骤如下:
第一步:安装异步后端依赖
Flask-SocketIO需要异步服务器来处理实时连接,Passenger对eventlet的支持最好,先把它装上:pip install eventlet第二步:调整你的Flask-SocketIO代码
核心是要给Phusion Passenger暴露一个它能识别的、包含SocketIO逻辑的WSGI应用对象,而不是普通的Flask app。修改后的代码如下:from flask import Flask from flask_socketio import SocketIO app = Flask('') # 明确指定用eventlet作为异步后端,确保SocketIO能正常处理实时连接 socketio = SocketIO(app, async_mode='eventlet') @app.route('/') def home(): return open("index.html", "r").read() @socketio.on('echo') def echo(json): return json # 关键!给Passenger暴露处理SocketIO的WSGI应用 application = socketio.get_wsgi_app()这里要注意:绝对不能调用
app.run()或者socketio.run(),完全交给Passenger来启动就好。第三步:配置Phusion Passenger
不管你用Nginx还是Apache搭配Passenger,都要确保配置正确指向你的应用,以Nginx为例,在server块里添加这些配置:server { listen 80; server_name your-domain.com; # Passenger要求的根目录,指向你应用下的public文件夹(没有就新建一个空的) root /path/to/your/app/public; # 你的应用根目录 passenger_app_root /path/to/your/app; # 指定应用类型为WSGI passenger_app_type wsgi; # 指向你的启动文件(比如上面的代码存在wsgi.py里) passenger_startup_file wsgi.py; passenger_enabled on; }几个重要的注意点
- 确保你的Passenger版本是6.0及以上,旧版本对异步WSGI的支持不太好
- 不要跳过安装eventlet/gevent,同步模式下SocketIO根本无法处理实时连接
- 必须创建
public目录,这是Passenger识别Python WSGI应用的要求之一,哪怕目录里什么都没有
这样调整后,Passenger就能正确加载包含SocketIO逻辑的应用,同时处理好实时连接的异步需求啦。
备注:内容来源于stack exchange,提问作者HGStyle
相关产品推荐
相关产品推荐

