Flask接口通过WSGI服务器部署到后台

1、flask开发服务器警告问题

(1)flask直接部署警告问题

flask接口直接部署会出现下列警告:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

例如

Flask接口通过WSGI服务器部署到后台_第1张图片这条警告的意思是:

  • 开发服务器:Flask 默认使用的内置服务器是为开发目的设计的,它具有自动重载功能,可以检测到代码变化并自动重启服务器。这种行为非常适合开发阶段,但在生产环境中是不必要的,并且可能会带来性能和安全性方面的问题。
  • 不要在生产环境中使用:开发服务器不适合用于生产环境,因为它缺乏许多生产环境中所需的特性,如多线程支持、负载均衡能力、更好的错误处理机制等。
  • 使用生产WSGI服务器:生产环境中应当使用专门的 WSGI 服务器(如 Gunicorn、uWSGI 等),这些服务器专为生产环境设计,提供了更好的性能和可靠性。

生产环境最佳实践

  • 使用 WSGI 服务器:
    • 使用如 Gunicorn 或 uWSGI 这样的 WSGI 服务器来部署 Flask 应用。
  • 反向代理:
    • 使用 Nginx 或 Apache 作为反向代理服务器,可以提高安全性并提供负载均衡功能。
  • 静态文件管理:
    • 使用 CDN(内容分发网络)来托管静态文件,减轻服务器压力。
  • 日志记录:
    • 使用日志框架(如 logging)记录应用的日志,并定期归档或清理日志文件。
  • 错误处理:
    • 使用错误监控工具(如 Sentry 或 Rollbar)来监控生产环境中的错误。

2)使用生产WSGI服务器进行部署

上述解决方法是通过WSGI服务器Gunicorn进行部署

Linux安装Gunicorn

pip install gunicorn

通过如下指令启动接口:hi.py接口

gunicorn --workers 3 --bind 172.0.0.1:5000 hi:app

参数解释

  • --workers 3:

指定 Gunicorn 使用的工作进程数量。这里的 3 表示使用三个工作进程。这有助于处理并发请求。

  • --bind 172.0.0.1:5000:

指定 Gunicorn 绑定的 IP 地址和端口号。这里的 172.0.0.1是IP地址,5000是端口号。

  • run:app:

指定 Flask 应用的模块名和应用实例名。这里的 hi 是模块名(即文件名 hi.py 不带 .py 后缀),app 是 Flask 应用实例的变量名。

通过Gunicorn方式启动的flask接口不存在上述警告,如下

Flask接口通过WSGI服务器部署到后台_第2张图片

2、通过nohub以WSGI服务器部署flask接口到后台

通过nohub方式启动WSGI(Gunicorn)服务器部署flask接口后台

2.1 flask接口示例

随便一个接口举例

from flask import Flask
import logging
app = Flask(__name__)

# 配置日志记录
logging.basicConfig(filename='app.log', level=logging.INFO)

@app.route('/hello', methods=['GET'])
def hello_world():
    return 'Hello World', 200

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)
注意:加上这一行代码便于后续的日志信息查看:# 配置日志记录logging.basicConfig(filename='app.log', level=logging.INFO)

2.2 编写bash脚本hi.sh

  • 编写bash脚本命名为hi.sh:
vi hi.sh
  • 进入脚本输入以下bash脚本内容
#!/bin/bash

# 显式指定 Gunicorn 的路径
GUNICORN_PATH=$(which gunicorn || echo "/path/to/gunicorn")

# 检查 Gunicorn 是否可用
if [ -z "$GUNICORN_PATH" ]; then
    echo "Error: Gunicorn not found. Please make sure it is installed and available."
    exit 1
fi

# 使用 nohup 命令启动 Gunicorn,并将输出重定向到日志文件
nohup $GUNICORN_PATH -w 4 -b 172.100.0.77:5001 hi:app --access-logfile gunicorn.access.log --error-logfile gunicorn.error.log > gunicorn.log 2>&1 &

# 获取进程 ID 并打印
echo "Gunicorn running in background with PID $!"


上述脚本hi.sh bash解释

这段脚本是一个 Bash 脚本,用于启动并后台运行 Gunicorn 服务。下面是对每一部分的详细解释:

逐行解释

(1)注释和 shebang 行:

#!/bin/bash

#!/bin/bash:这是脚本的第一行,称为 shebang,告诉系统使用 bash 解释器来执行此脚本。

(2)显式指定 Gunicorn 的路径:

GUNICORN_PATH=$(which gunicorn || echo "/path/to/gunicorn")

  • $(which gunicorn):使用 which 命令查找 gunicorn 可执行文件的路径。
  • || echo "/path/to/gunicorn":如果 which gunicorn 没有找到 gunicorn,则输出一个默认路径。这里应该替换为你实际的路径,或者可以省略这部分,仅使用 which gunicorn 的结果。

(3)检查 Gunicorn 是否可用:

if [ -z "$GUNICORN_PATH" ]; then

echo "Error: Gunicorn not found. Please make sure it is installed and available."

exit 1

fi

  • [ -z "$GUNICORN_PATH" ]:检查 $GUNICORN_PATH 是否为空。
  • echo "Error: Gunicorn not found. Please make sure it is installed and available.":如果 Gunicorn 没有找到,则输出错误信息。
  • exit 1:退出脚本,并返回错误码 1。

(4)使用 nohup 命令启动 Gunicorn,并将输出重定向到日志文件:

nohup $GUNICORN_PATH -w 4 -b 172.0.0.1:5000 run:app --access-logfile gunicorn.access.log --error-logfile gunicorn.error.log > gunicorn.log 2>&1 &

  • nohup:使 Gunicorn 在后台持续运行,即使终端关闭后也不会停止。
  • $GUNICORN_PATH:使用上一步中找到的 Gunicorn 可执行文件路径。
  • -w 4:指定使用 4 个工作进程。
  • -b 172.100.0.77:5001:绑定到 IP 地址 172.0.0.1 和端口 5000。
  • hi:app:指定 Flask 应用模块名 hi.py 和应用实例名 app。
  • --access-logfile gunicorn.access.log:指定访问日志文件路径。
  • --error-logfile gunicorn.error.log:指定错误日志文件路径。
  • > gunicorn.log 2>&1 &:将标准输出和标准错误重定向到 gunicorn.log 文件,并在后台运行。

(5)获取进程 ID 并打印:

echo "Gunicorn running in background with PID $!"

  • echo "Gunicorn running in background with PID $!":打印后台运行的进程 ID。$! 是最近一次在后台启动的进程的 PID。

(6)总结

这段脚本的主要作用是确保 Gunicorn 正确安装并可用,然后在后台启动 Gunicorn,并将输出和错误重定向到指定的日志文件。这样可以方便地管理和监控 Gunicorn 的运行状态。

整体说明

  • 指定日志文件:
    • --access-logfile gunicorn.access.log:指定访问日志文件。
    • -error-logfile gunicorn.error.log:指定错误日志文件。
  • 设置日志级别:--log-level info:设置日志级别为 info。
  • 设置访问日志格式:--access-logformat '%(h) - %(l) - %(t) "%(r)" %(s) %(b)':设置访问日志格式。
  • 自定义日志格式解释
    • %h: 客户端 IP 地址。
    • %l: 用户标识(通常是 -)。
    • %t: 时间戳(日期和时间)。
    • %(r): 请求行(包括方法、URL 和协议)。
    • %s: 状态码。
    • %b: 响应大小(字节数)。

2.3 给hi.sh脚本执行权限执行

hi.sh脚本执行权限

chmod +x hi.sh
./hi.sh
 
   
  • 如下图

Flask接口通过WSGI服务器部署到后台_第3张图片

上述2 hi.sh执行权限3运行hi.sh脚本4 脚本端口结束运行通过kill 61348杀掉进程方式结束运行

这样flask接口通过nohub方式部署在后台Gunicorn服务器

2.4 查看日志

Gunicorn 的访问日志将记录到 gunicorn.access.log 文件中,错误日志将记录到 gunicorn.error.log 文件中

cat gunicorn.access.log
cat gunicorn.error.log
 
  

你可能感兴趣的:(flask部署,flask,服务器,python,持续部署)