本文记录一下我的flask部署踩坑记。
我的项目是部署在阿里云服务器上面的,项目采用了websocket,以实现服务器端和客户端的双向通信。
我参考的第一篇文章就是这个了:https://www.cnblogs.com/Ray-liang/p/4173923.html
讲解的非常详细,文章里面大神的原话如下:
听说Gunicorn 的配置很简单,但可惜我一直没有配置成功过,我现采用的是 uWSGI。接下来就安装uWSGI吧。
只怪我当时并没有注意QAQ。
我按照上面的文章配置了一遍,基本成功了。
但是我在浏览器里面访问时F12打开Console,发现了websocket传输产生了400错误。
然后就是各种百度、谷歌。但是还是没有配置成功。
因此这里简单说一下flask程序里面使用了websocket 的部署方法(使用gunicorn和nginx)。
它们的大体关系如下:
首先你要按照gunicorn,在虚拟环境里面直接pip即可。
pip install gunicorn
然后你需要
pip install eventlet
安装完上面的模块,你可以直接在你的项目文件下执行,下面的语句。
gunicorn --worker-class eventlet -w 1 -b 127.0.0.1:8080 app:app
--worker-class eventlet
要使用的工作模式,这样设置即可以websocket通信。
-w 1
用于处理工作进程的数量,为正整数,默认为1
-b 127.0.0.1:8080
Gunicorn绑定服务器套接字,需要按照你的nginx设置。
app:app
第一个app就是你的.py的启动文件了。
更多参数讲解可以看这篇文章:
https://blog.csdn.net/y472360651/article/details/78538188
这里再附上我的nginx的参考配置,将下面这个复制到默认配置的http{}里面(或者弄到default里面):
server {
listen 80; # 监听端口
server_name XXX.XXX.XXX.XXX; #公网地址TODO,自己替换
location / {
proxy_pass http://127.0.0.1:8080; # 这里是指向 gunicorn host 的服务地址,和上面对应
proxy_set_header Host $host; # 添加这句话貌似会让flask端口忽略 https://segmentfault.com/q/1010000008339331
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
这里有个nginx的问题,如果你不用80端口的话,
例如用5000端口,需要更改为
proxy_set_header Host $host:5000;
然后在flask中使用redirect函数时添上:5000端口!
如果想要自动启动,那么需要配置supervisor。
下载好以后,进入/etc/supervisor/conf.d创建.conf配置文件。(不是文件名叫.conf而是指xxx.conf)
这里给出我的配置文件:
[program:my_flask]
# 启动命令入口
command=/root/my_flask/venv/bin/gunicorn --worker-class eventlet -w 1 -b 127.0.0.1:8080 app:app
# 命令程序所在目录
directory=/root/my_flask
#运行命令的用户名
user=root
autostart=true
autorestart=true
#日志地址
# stdout_logfile=/root/my_flask/logs/supervisor.log
配置好以后supervisorctl update
会加载新配置的文件
my_flask: stopped
my_flask: updated process group
supervisorctl reload
会重启supervisorctl
Restarted supervisord
supervisorctl start all
会启动所有命令
supervisorctl status
可以查看当前启用命令的状态
my_flask RUNNING pid 18099, uptime 0:00:11