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