美文网首页
CentOS7 部署Flask应用

CentOS7 部署Flask应用

作者: _Walker__ | 来源:发表于2018-01-09 01:16 被阅读492次

实验环境:

  • VirtualBox 5.1.30 r118389 (Qt5.6.2)
  • Centos7 x86_64
  • WSGI容器:Gunicorn
  • 反向代理服务器:Nginx

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负载、性能调优,等

相关文章

网友评论

      本文标题:CentOS7 部署Flask应用

      本文链接:https://www.haomeiwen.com/subject/ayninxtx.html