火影推荐程序连载47-Flask 内置了简单的 Web 环境

Flask 内置了简单的 Web 环境,让我们在开发的时候只需要专注于应用实现,而真正要在生产环境运行时这个简单的 Web 环境就不够用了,还需要一系列操作才能让 Web 应用高效的运行起来。现在记录一下在生产环境部署 Flask 应用的其中一套方案:Nginx + Gunicorn + Supervisor。

1. 准备

1.1 项目结构

我的项目结构类似这样, myapp 包是应用的主要代码,其中的初始化文件 init 提供了创建程序实例的工厂方法 create_app ,主目录下的 .flaskenv 和 .env 文件存储了一些 Flask 程序要用到的环境变量。

 

MyApp |----myapp | | __init__.py | | ... | .flaskenv | .env | ...

当然一个最简单的 Flask 应用可能类似下面这种结构也是可以的,我们只需要清楚自己最后的程序实例 app 的位置即可。

 

MyApp | app.py | ...

1.2 修改生产环境配置

这个配置写在 .flaskenv 文件里面比较方便,后面运行时从里面读取加载。

 

FLASK_ENV = production

1.3 在项目根目录创建 wsgi.py

创建这个文件的作用主要有两个:

  • 自行读取文件中定义的环境变量,因为后面用正式服务器运行时不会自动从文件中加载。
  • 导入程序实例,方便启动。
 

import os from dotenv import load_dotenv from myapp import create_app # 读取环境变量 flaskenv_path = os.path.join(os.path.dirname(__file__), '.flaskenv') env_path = os.path.join(os.path.dirname(__file__), '.env') if os.path.exists(flaskenv_path): load_dotenv(flaskenv_path) if os.path.exists(env_path): load_dotenv(env_path) # 如果是简单的单文件结构,这里直接 from app import app 也可 app = create_app()

2. 使用Gunicorn启动Flask应用

开发环境下使用flask run 命令或者程序中使用 app.run() 启动的是由 Werkzeug 提供的 WSGI 服务器,它的性能很弱,我们需要一个更健壮的WSGI服务器,也叫WSGI容器,主流选择是 uWSGI 和 Gunicorn ,也有其他像 GeventWaitress 等等,这里我们使用 Gunicorn,主要是简单易用且高效。

2.1 安装

Gunicorn 使用 pip 安装即可,若有用虚拟环境,在虚拟环境中安装。

 

pip install gunicorn

2.2 启动

Gunicorn 启动 Flask 程序需要指定包含程序实例的模块,还有其他参数设置例如工作进程数,一般为cpu核心数,监听地址,设置为 0.0.0.0:端口号 即可监听外网,这里我们只需监听本地地址,因为后面会用到 Web服务器 监听外网然后转发请求到本地地址。

 

# -w 6 工作线程数,相当于 --workers=6 # -b 127.0.0.1:8000 监听地址,相当于 --bind=127.0.0.1:8000 gunicorn -w 6 -b 127.0.0.1:8000 wsgi:app

3. 使用Supervisor管理进程

直接通过命令运行 Gunicorn 并不可靠,我们需要一个工具来自动在后台运行它并同时监控运行状态,自动重启等。

3.1 安装

 

sudo apt install supervisor

3.2 配置

全局配置文件在 /etc/supervisor/supervisord.conf,在同级 conf.d/ 目录下创建自己的程序配置myapp.conf,注意目录改成自己的目录,command 要使用正确的虚拟环境(如果有):

 

[program:myapp] directory=/home/assassin/tmp/MyApp stdout_logfile=/home/assassin/tmp/MyApp/supervisor.log stderr_logfile=/home/assassin/tmp/MyApp/supervisor.log command=/home/assassin/usr/miniconda3/envs/flask/bin/gunicorn -w 6 -b 127.0.0.1:8000 wsgi:app user=assassin autostart=true autorestart=true stopasgroup=true killasgroup=true

3.3 启动

重启 supervisor 服务来加载配置好的 WSGI 程序。

 

sudo service supervisor restart

查看程序运行状态:

 

sudo supervisorctl status

停止/启动程序:

 

sudo supervisorctl stop/start myapp

4. 使用Nginx提供反向代理

Gunicorn 这类WSGI服务器虽然内置了 Web 服务器,已经可以与客户端交换数据,但是不够健壮,更流行的方式是使用一个常规的 Web 服务器运行在前段为 WSGI 服务器提供反向代理,如Nginx,Apache等,这样做的好处有:

  • 提高处理静态文件的效率。Nginx可以对静态文件设置缓存,速度非常快。
  • 提高安全系数。避免直接暴露 WSGI 服务器。
  • 提高处理能力。缓冲请求,预处理,负载均衡等。

这样使用反向代理服务后,WSGI服务器只需要监听本地端口,由代理服务器监听外部端口,将请求转发到WSGI服务器。

4.1 安装

 

sudo apt install nginx

4.2 配置

新建 /etc/nginx/conf.d/myapp.conf 来配置代理服务

  1.   xmlns:xsi="http://www.lanboyulezc.cn /2001/XMLSchema-instance"

  2.   

  3.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://www.dongdongrji.cn maven.apache.org/xsd/maven-4.0.0.xsd">

  4.   

  5.   <artifactId>dubbo<www.xxinyoupt.cn /artifactId>

  6.   

  7.   <groupId>nacos</groupId>

  8.   

  9.   <version>0.0.1-SNAPSHOT<www.lanboyulezc.cn /version>

  10.   

  11.   <priority value=www.lanboylgw.com/"info"www.chuanchenpt.cn/ />

  12.   

  13.   <appender-ref ref=www.yixingxzc.cn"stdout"www.lanboylgw.com />

  14.   

  15.   <appender-ref ref="fileout"www.baichuangyule.cn /

  16.   

  17.   换掉encoder的实现类或者换掉layout的实现类就可以了

  18.   

  19.   <?xml version= www.lanboyulezc.cn www.jiuerylzc.cn"1.0"www.zhuyngyule.cn encoding=www.bhylzc.cn"UTF-8"?>

  20.   

  21.   <configuration debug=www.shicaiyulezc.cn"false"www.huachenguoj.com >

  22.   

  23.   <property name=www.51huayuzc.cn"APP_NAME" value="logtest"/>

  24.   

  25.   <property name=www.xinhuihpw.com "LOG_HOME" value="./logs" www.wanyaylezc.cn//>

  26.   

  27.   <appender name="STDOUT" class=www.yachengyl.cn"ch.qos.logback.core.ConsoleAppender">

  28.   

  29.   <!--替换成AspectLogbackEncoder-->

  30.   

  31.   <encoder class="www.shengrenyp.cn "com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder"www.51huayuzc.cn>

  32.   

  33.   <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{www.pinguo2yl.com} - %msg%n</pattern>

  34.   

  35.   <appender www.baishenjzc.cn name="FILE" www.baihua178.cn class="ch.qos.logback.core.rolling.RollingFileAppender">

  36.   

  37.   <File>${LOG_HOME}/${APP_www.jinliyld.cn NAME}.log<www.baihua178.cn /File>

  38.   

  39.   <rollingPolicy class="www.jintianxuesha.com"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"www.wanyaylezc.cn/>

  40.   

  41.   <FileNamePattern>www.yachengyl.cn ${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>

  42.   

  43.   <MaxHistory>30<www.51huayuzc.cn /MaxHistory>

  44.   

  45.   <maxFileSize>1000MB<www.jinliyld.cn /maxFileSize>

  46. .1:

  47.  

server { listen 15535; # 监听15535端口来自外部的请求 server_name _; # 如果映射了域名,可以代替_ # 为HTTP规则 / 设置转发 location / { 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; proxy_set_header X-Forwarded-Proto $scheme; } # 为 /static 静态资源请求设置转发,并指定缓存时间,这比从Flask中获取快得多 location /static { alias /home/assassin/tmp/Bluelog/bluelog/static/; expires 10d; } }

4.3 启动

使用 sudo nginx -t 来测试配置文件的正确性,没问题后便可以用 sudo service nginx restart 重启Nginx服务。此时访问主机地址的 15535 端口便可以访问到 Flask 应用。

5. 补充

  • Nginx 和 supervisor 安装后默认都是自启动的,如果不需要,可以使用如下命令(Ubuntu):
 

# 查看服务状态 service --status-all # 查看自启 systemctl list-unit-files | grep enable # 关闭自启 sudo systemctl disable nginx.service sudo systemctl disable supervisor.service # 打开自启 sudo systemctl enable nginx.service sudo systemctl enable supervisor.service

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页