部署项目

我们依然可以使用 gunicorn 来部署 Flask-SocketIO 项目,另外还需要使用 eventlet 或者 gevent 来运行 Flask-SocketIO 项目。因为 eventlet 的效率比 gevent 高,并且 eventlet 也是官方推荐的方式,安装 eventlet 的命令如下。

pip install eventlet

下面创建一个 gunicorn.conf.py 文件来配置 gunicorn 的运行参数,这里简化一下,直接使用以下命令部署项目。

gunicorn --worker-class eventlet app:app

上述命令中,使用 --worker-class 来指定工作进程由 eventlet 来运行即可。

与第 9 章中论坛项目一样,我们选择 Nginx 来作为项目的 Web 服务器。Nginx 的配置与论坛项目一样,不同的是,Nginx 需要增加 JavaScript SocketIO 默认的 /socket.io 转发。Ngnix 的配置如下。

server {
    listen 80;
    server_name _;

    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:5000;
    }

    location /static {
        alias <path-to-your-application>/static;
        expires 30d;
    }

    location /socket.io {
        include proxy_params;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://127.0.0.1:5000/socket.io;
    }
}

上述配置中,除了 location/ 和 location/static 外,还增加了 location/socket.io,这个 URL 是使用 SocketIO 创建对象时默认使用的 URL。当然也可以修改为自定义的 URL,如以下配置:

const socket = io({path: "/my-socketio-path"})

在监听到 location/socket.io 后,会把请求代理给 Flask-SocketIO 项目的 location/socket.io 路径,这样即可完成 Nginx 配置。

注意,JavaScript SocketIO 的官方文档地址为 https://socketio.bootcss.com/docs/ 。Flask-SocketIO 的官方文档地址为 https://flask-socketio.readthedocs.io/en/latest/intro.html