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

devtools/2024/10/15 5:22:39/

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服务器:生产环境中应当使用专门的 WSGI 服务器(如 Gunicorn、uWSGI 等),这些服务器专为生产环境设计,提供了更好的性能和可靠性。

生产环境最佳实践

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

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

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

Linux安装Gunicorn

python">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接口不存在上述警告,如下

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

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

2.1 flask接口示例

随便一个接口举例

python">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', 200if __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" ]; thenecho "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
 
  • 如下图

上述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
 

http://www.ppmy.cn/devtools/125995.html

相关文章

基于单片机的教室灯光自动控制系统设计(243)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】 系统架构规划【2】 硬件选型与电路设计【3】 软件设计【4】 照明控制策略【5】 显示屏与按键模块设计【6】 系统调试与优化【7】 系统集成与应用1.3 项目开发背景【…

Qt C++设计模式->备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获并保存对象的内部状态,以便在将来的某个时刻可以恢复到之前的状态。备忘录模式的核心是状态的保存和恢复,常用于实现撤销…

AOT漫谈专题(第三篇): 如何获取C#程序的CPU利用率

一:背景 1. 讲故事 上篇聊到了如何对AOT程序进行轻量级的APM监控,有朋友问我如何获取AOT程序的CPU利用率,本来我觉得这是一个挺简单的问题,但一研究不是这么一回事,这篇我们简单的聊一聊。 二:如何获取C…

Java Python 开发效率利器:IDEA、PyCharm 与 通义灵码深度融合

随着软件开发行业的快速发展,提高开发效率成为每个程序员追求的目标。在众多开发工具中,IntelliJ IDEA 和 PyCharm 分别作为 Java 和 Python 开发者的首选集成开发环境(IDE),因其强大的功能和良好的用户体验而备受青睐…

1-laravel 搭建与路由基础

文章目录 laravel 环境搭建安装工程的命令 基于laravel 开发访问默认欢迎页面第一路由 laravel 环境搭建 借助 phpstudy 搭建环境 安装工程的命令 C:\phpstudy_pro\WWW>composer create-project --prefer-dist laravel/laravel la-3 安装位置 安装…

R语言统计分析——马赛克图

参考资料:R语言实战【第2版】 当变量时类别型变量时,若直观察单个类别型变量,可以使用柱状图或饼图;若存在两个类别型变量或更多时,我们可以使用马赛克图。 在马赛克图中,嵌套矩形面积正比于单元格频率&…

成都睿明智科技有限公司正规吗怎么样?

在数字经济的浪潮中,抖音电商以其独特的内容生态和庞大的用户基础,正逐步成为商家们竞相布局的新蓝海。而在这场电商变革的浪潮中,成都睿明智科技有限公司以其专业的服务和敏锐的市场洞察力,成为了众多商家信赖的合作伙伴&#xf…

02 go语言(golang) - 包和模块

包(package) 在Go语言中,包(package)是一种封装代码的方式,用于组织和重用代码。包可以被看作是一个功能模块,它可以包含函数、变量、类型(如结构体和接口)以及其他包。…