Flask+uWSGI+nginx

童浩言
2023-12-01

环境

CentOS

名词解释

flask:Flask是一个Python实现的Web开发微服务框架,相关资料,http://docs.jinkan.org/docs/flask/

uWSGI:uWSGI是一个web服务器,它实现了WSGI协议、uwsgi、http协议等

部署释疑

单独Flask也可以启动并提供web服务,但是Flask毕竟只是一个web框架,它的web服务只能用于开发环境,不能用于生产环境 ,因此还需要和uWSGI及nginx一起整合

uWSGI本身就是一个web服务,这里再次引入nginx的原因是因为nginx是一个反向代理。这样,一些图片、js等静态资源就可以用nginx提供服务,而其他的转发给uWSGI,这也是我们这套部署架构的最终目的

整合步骤

1、全局安装flask

>sudo pip install flask

2、实现一个最小应用hello.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0') # host='0.0.0.0' 标示外部可访问


3、安装nginx

>sudo yum install nginx

4、修改nginx配置

如果是自己下载安装的nginx,默认的安装目录可能是/usr/local/nginx

但如果是yum安装的,默认的安装目录则在/etc/nginx/,并且默认安装的nginx配置文件内有如下配置

 
include /etc/nginx/conf.d/*.conf;

这样,我们只需要在/etc/nginx/conf.d/目录下增加一个hello.conf

upstream hello-test {
    server unix:///root/works/flask/hello.sock;
}

server {
    listen      8088;
    server_name  hello.yunzong  localhost;
    charset    utf-8;

    client_max_body_size 100M;

    location / {
        uwsgi_pass  hello-test;
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

    }
}


>systemctl restart nginx

注意:如果启动失败提示:nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied)

那么可能是系统开启了selinux,我们需要关闭selinux,以下是临时关闭命令,如果想永久关闭请另行google

>setenforce 0

那么此时我们就已经启动了nginx,然后我们访问http://10.211.55.3:8088/ ,这里ip是nginx服务器的ip,则会提示:502 Bad Gateway,这里的原因是在上面的配置中我们配置了“server unix:///root/works/flask/hello.sock;”,但是我们没有部署uWSGI,并且还没有提供socket服务

5、安装uWSGI

>pip install uwsgi

6、创建一个hello.ini类型的文件,当然其他的也可以,具体请google

[uwsgi]
pythonpath = /root/tensorflow   # 可删除
chdir           = /root/works/flask/
wsgi-file  = /root/works/flask/hello.py
#socket file's location
socket = /root/works/flask/hello.sock

#permissions for the socket file
chmod-socket    = 666

#the variable that holds a flask application inside the module imported at line #6
callable = app

#location of log files
logto = /root/works/flask/hello.log


注意:/root/flask目录下放着我们之前的hello.py文件

7、启动uWSGI

>uwsgi --ini hello.ini &

注意:启动uWSGI时注意命令中涉及的各种文件及路径


结束语:

整个过程还是遇到不少问题的

1、nginx 中配置的/root/works/flask/hello.sock 访问提示(13: Permission denied),查找资料说是关闭SeLinux,自己测试不行,所以就把这段配置改成了0.0.0.0:1500即ip和端口模式,同时修改了uWSGI的hello.ini配置 

 类似资料: