centos上发布flask项目当然和开发环境上不一样,直接nohup python app.py这样就可以了,没一会你的站可能就会报500了,我们需要使用uwsgi发布他,然后使用nginx做前端转发,当然,你也可以直接使用uwsgi作为最外层的WEB服务器直接提供访问
在网上找了些教程做了个试验,还是最后综合总结下,讲的都不完善,我这里再把自己整理的心得发出来。
首先就是安装uwsgi,这个是python模块,有的教程讲yum install uwsgi这样,我不知道这样能不能装上,会不会有问题,我是用的pip安装的,我的环境安装方法是
pip3 install uwsgi
安装好以后我们就去建立一个ini后缀的配置文件,文件名随便,但是我这里教程中就命名为uwsgi.ini,内容如下
[uwsgi] socket = :9090 pythonpath = /data/www/default pidfile = /tmp/uwsgi.pid uid = nobody gid = nobody master = true #启动主进程,来管理其他进程 vacuum = true #设置退出后清理文件 wsgi-file = app.py #flaskpy文件 callable = app #Flask应用对象 listen = 4096 #监听队列 thunder-lock = true #防止惊群 processes = 2 #启动进程数机器核数+1 harakiri = 300 #超时设置 post-buffering = 65536 daemonize = /data/logs/uwsgi/default.log
我这里就写了几个我需要的参数,其它的不多说,主要就是socket和pidfile
socket这里有的可能是http之类的,网上讲的比价混乱,我个人总结得出,如果这里如果使用的socket的话,那么前端nginx做转发的时候使用uwsgi_pass来做转发,如果是用http的话,uwsgi就可以做最前端的web服务器,或者是使用nginx的proxy_pass做代理来转发请求
pidfile这个主要是用来友好的停止该应用
其它的如:
master这个一般都没讲到,需要设置true,子进程挂掉会重新拉起,否则会出现[uwsgi] <defunct>僵尸子进程
harakiri
定时器,这个摧毁掉卡住的进程
这样,这里的配置好了,我们要启动他,当然我的uwsgi文件目录不在$PATH中,所以无法直接用这个命令,我的是编译安装的python3.7
/usr/local/python3/bin/uwsgi --ini /data/www/default/uwsgi.ini
这样就启动了
接着我们就使用nginx做前端,这样对大并发直接更好。
我们这里列下socket和http两种配置的方式,我个人倾向于第一种socket,这样通讯效率较高
uwsgi的配置就是上面给的那个,nginx的配置如下:
server { listen 80; server_name localhost; root /data/www/default; access_log /data/logs/nginx/default-access.log; error_log /data/logs/nginx/default-error.log; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; uwsgi_param UWSGI_CHDIR /data/www/default; uwsgi_param UWSGI_SCRIPT app.py; } }
第二种方式nginx的proxy_pass代理和uwsgi的http代理
uwsgi.ini的配置如下:
[uwsgi] http = :9090 pythonpath = /data/www/default pidfile = /tmp/uwsgi.pid uid = nobody gid = nobody master = true vacuum = true wsgi-file = app.py callable = app listen = 4096 thunder-lock = true processes = 2 harakiri = 300 post-buffering = 65536 daemonize = /data/logs/uwsgi/default.log
nginx配置如下
server { listen 80; server_name localhost; root /data/www/default; access_log /data/logs/nginx/default-access.log; error_log /data/logs/nginx/default-error.log; location / { proxy_pass http://127.0.0.1:9090; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
最后我的启动我写了个简单脚本
启动start.sh
#!/bin/bash export PATH=$PATH:/usr/local/python3/bin ini_path='/data/www/default' echo -e "Flask start !!!" nohup uwsgi --ini ${ini_path}/uwsgi.ini & >/dev/null
停止脚本
#!/bin/bash export PATH=$PATH:/usr/local/python3/bin pid_file='/tmp/uwsgi.pid' echo -e "Stoped uwsgi !!!" uwsgi --stop $pid_file >/dev/null