环境
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配置