socketio项目部署
在开发期间,后台服务使用的是 Flask 自带的 development server,该服务不支持 websocket 协议,只支持 pollling 协议。
在项目上线时,我们需要使用生产环境的 web server,如 gunicorn,uwsgi,以及能够支持 websocket 协议的网络库: eventlet 或 gevent。
gunicorn + eventlet 开启服务
这里使用 gunicorn + eventlet,需要修改如下部分:
(1)创建 socketio 服务时指定 async_mode 为 eventlet:
1 | sio = SocketIO(cors_allowed_origins='*', async_mode='eventlet') |
(2)为避免使用 polling 协议,socketio 客户端指定协议为 websocket:
1 | const socket = io("https://10.0.0.76:5000", { |
现在可以通过以下指令开启服务(https):
1 | gunicorn -b 10.0.0.76:5000 --certfile CA/xxx.crt --keyfile CA/xxx.key --worker-class eventlet -w 1 app:app |
第一个 app 指的是定义 application 实例的文件(app.py),第二个 app 指定的是 application 实例本身。
为了方便,我们用文件的形式来启动 gunicorn:
新建 gunicorn.conf.py,向其中添加如下内容:
1 | # 并行工作进程数 |
通过以下命令启用配置文件:
1 | gunicorn -c gunicorn.conf.py app:app |
nginx 反向代理
将 https 代理到 http。
向 nginx 配置文件中添加如下内容:
1 | server { |
此时前端接口的端口号不再是 5000,而是默认 443。