实验环境:
1、在Gunicorn上运行Flask
1.1 安装运行环境
# 1.创建虚拟环境
shell> python3 -m venv FlaskEnv
# 2.激活虚拟环境
shell> source FlaskEnv/bin/activate
# 3.安装Flask运行库
(FlaskEnv)shell> pip install -r requirements
# 4.安装Gunicorn
(FlaskEnv)shell> pip install gunicorn
1.2 编写应用启动脚本
我把启动脚本命名为server.py.
"""
服务启动入口
该脚本只用于启动,不涉及任何flask逻辑
"""
from app import app
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=8080)
这里说明一下,import的app就是创建出来的flask.Flask对象。
1.3 启动服务
(FlaskEnv)shell> gunicorn server:app
Gunicorn启动服务真的非常方便,一个命令搞定。这里的server就是上面的server.py脚本,app就是import的app。
这一步后,就可以在本地通过127.0.0.1:8000访问网站了,目前的绑定IP和端口都是Gunicorn默认的,可以通过启动参数指定。
2018-10-05 补充
上面的启动命令是“临时”的,控制台退出后服务也就停止了。为了让服务一直运行,需要将其设为守护进程:
(FlaskEnv)shell> gunicorn -D server:app
2、引入Nginx
2.1 安装
强烈推荐使用yum的方式安装,因为这样可以直接使用service的方式管理nginx。
shell> wget https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
shell> sudo yum install nginx-release-centos-7-0.el7.ngx.noarch.rpm
shell> sudo yum install nginx
2.2 配置
下面是一个完整的配置,但它只保证运行成功。用下面内容替换nginx的默认配置文件:/etc/nginx/nginx.conf
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name _;
location / {
# 转发给本地Flask应用
proxy_pass http://127.0.0.1:8000;
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;
}
}
}
2018-10-05 补充
用上面的配置会遇到一个问题,代码里用redirect(url_for('XXX'))
重定向后,会把浏览器的访问地址改成127.0.0.1,导致访问出错。有两个解决方法,推荐后者:
- url_for指定额外参数:_external=True
- nginx添加配置:
proxy_set_header X-Forwarded-Proto $scheme;
2.3 启动
shell> service nginx start
我直接使用了service的方式其他,它会读取默认的配置文件。如果想自己指定一个配置文件,可以使用这个命令:
shell> sudo nginx -c /etc/nginx/flask.conf
启动成功后,就可以通过本地IP的80端口,访问8000端口的Flask应用了。
2.4 错误处理
通过Nginx访问Flask应用时会报下面这个错误
connect() to 127.0.0.1:8000 failed (13: Permission denied) while connecting to upstream
解决:shell> sudo setsebool -P httpd_can_network_connect 1
3、后记说明
这一篇快餐式的文章,它的作用只是让Flask应用在一个正式的环境下跑起来。而它涉及的很多东西,都需要后面慢慢的学习、了解。比如:各项参数、配置的含义;Gunicorn服务注册;Nginx负载、性能调优,等
网友评论