centos下使用nginx+uwsgi发布flask项目的几种方式

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
callable = app
thunder-lock = true
processes = 8
enable-threads = true
threads = 2
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
thunder-lock = true
processes = 8
enable-threads = true
threads = 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 2>&1

停止脚本

#!/bin/bash
export PATH=$PATH:/usr/local/python3/bin
pid_file='/tmp/uwsgi.pid'
echo -e "Stoped uwsgi !!!"
uwsgi --stop $pid_file >/dev/null 2>&1


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://sulao.cn/post/574.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。