美文网首页
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