Centos7 nginx + uwsgi 部署flask应用

这里带来的nginx+uwsgi部署方式是考虑到兼顾flask的并发,能给项目带来更好的体验。

具体部署图示如下:
WX20190826-2148152x.png

首先需要的是之前文章里面提的环境搭建,这是前提,具体可以点击链接跳转查看:
centos7 部署应用相关配置

安装uWSGI

安装前需要安装一些依赖包,输入如下命令:

yum -y install gcc  gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel GeoIP gd libXpm libxslt sqlite-devel

然后:

进入虚拟环境里:
pip  install uwsgi 

然后新建一个uwsgi.ini配置文件,放置在应用根部目下,
打开并写入以下内容:

[uwsgi]


#http=127.0.0.1:5000
# uwsgi 启动时所使用的地址与端口

socket = 127.0.0.1:5000

#虚拟环境目录
home = /root/.virtualenvs/flask-movie

#指向网站根目录
chdir = /usr/local/nginx/html/flask_movie

#python启动程序文件
wsgi-file = manage.py

#python程序内用于启动的application变量名
callable = app

#处理器数
processes = 4

#线程数
threads = 2

#状态监测地址
stats = 127.0.0.1:9191

#设置uwsgi包解析的内部缓存区大小。默认4k

buffer-size = 32768

uWSGI命令

uwsgi 启动 :虚拟环境下uwsgi config.ini
uwsgi 关闭:虚拟环境下killall -9 uwsgi

在根目录下,输入启动命令,如果不报错,出现如下命令,则启动成功。

[uWSGI] getting INI configuration from uwsgi.ini
    *** Starting uWSGI 2.0.17 (64bit) on [Tue Jul  3 22:42:15 2018] ***
    compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-16) on 02 July 2018 14:12:13
    os: Linux-3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018
    nodename: shenghun
    machine: x86_64
    clock source: unix
    pcre jit disabled
    detected number of CPU cores: 1
    current working directory: /home/Servers_Nginx/Fisher
    detected binary path: /usr/bin/uwsgi
    uWSGI running as root, you can use --uid/--gid/--chroot options

nginx的配置

虽然只有Uwsgi也可以直接部署项目,但是为了安全,需要Nginx来进行请求代理,反向代理代理的是内部服务器,正是有Nginx存在,Uwsgi的真正接口才不会暴露在网络上,服务器的安全才有了一定的保障(当然,恶意攻击另说),此外,Nginx还自带防DDoS攻击机制.可以说日常使用是非常省心了.

前文已经对nginx的安装有了介绍,这里就不重复说明了,具体可以参考以下链接:
nginx安装

对于服务器来说,可能不会单单只部署一个应用,可能存在多个网站站点的情况,所以配置nginx一般也要考虑到这种情况,这里采用的是主文件加配置文件的方式,单个应用的nginx配置文件单独放置,用include的方式引入主文件中。

主文件配置
新建主配置文件nginx.conf

worker_processes 4;
events {
    worker_connections 262140;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    
    include /etc/nginx/vhosts/*.conf;
}

将其复制到nginx配置文件目录下:

cp nginx.conf /usr/local/nginx/conf/

项目nginx配置子文件:
新建应用配置文件flask_movie.conf

server {
        listen 80;
        server_name localhost;
        location / {
            root html;
            index index.html index.htm;
            include /usr/local/nginx/html/flask_movie/uwsgi_params;
            uwsgi_pass  127.0.0.1:5000; # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理 
            uwsgi_param UWSGI_PYHOME /root/.virtualenvs/flask-movie; # 指向虚拟环境目录 
            uwsgi_param UWSGI_CHDIR /usr/local/nginx/html/flask_movie; # 指向网站根目录 
            uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序
            uwsgi_read_timeout 100;

        }
        location ~ \.flv$ {
            flv;
            limit_conn addr 4;
            limit_rate 1024k;
            rewrite ^/static/uploads/movies/(.+?).flv$ /flask_movie/app/static/uploads/movies/$1.flv permanent;
        }
        location ~ \.mp4$ {
            mp4;
            limit_conn addr 4;
            limit_rate 1024k;
            rewrite ^/static/uploads/movies/(.+?).mp4$ /flask_movie/app/static/uploads/movies/$1.mp4 permanent;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

在/etc/下新建层级目录/nginx/vhosts/,然后将应用nginx配置文件放入目录中。

我在配置的时候出了一个错,记录一下,在重启nginx和开启uwsgi后,报:

in bind_to_environ environ['REQUEST_METHOD'], path_info, KeyError: 'REQUEST_METHOD'

这是因为没有配置uwsgi_params,新建文件命名为uwsgi_params,放置在项目根目录下,内容如下:

uwsgi_param QUERY_STRING        $query_string;
uwsgi_param REQUEST_METHOD      $request_method;
uwsgi_param CONTENT_TYPE        $content_type;
uwsgi_param CONTENT_LENGTH      $content_length;
 
uwsgi_param REQUEST_URI         $request_uri;
uwsgi_param PATH_INFO           $document_uri;
uwsgi_param DOCUMENT_ROOT       $document_root;
uwsgi_param SERVER_PROTOCOL     $server_protocol;
uwsgi_param UWSGI_SCHEME        $scheme;
 
uwsgi_param REMOTE_ADDR         $remote_addr;
uwsgi_param REMOTE_PORT         $remote_port;
uwsgi_param SERVER_PORT         $server_port;
uwsgi_param SERVER_NAME         $server_name;

然后启动项目:(项目根目录下操作)

uwsgi uwsgi.ini

重启nginx:

nginx -s stop
nginx
nginx -s reload

浏览器访问服务地址,点亮服务,一切ok,这样配置,也方便以后拓展。

Last modification:November 26th, 2019 at 10:04 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment