接着二:可以完美实现前端与后端的有机结合后
三需要
- 实现程序上线后,需要记录日志,
- 将程序设置成系统守护进程,方便管理
- 将环境设置为生产环境,在这一步前还是使用的app.run(),不符合生产需要
记录日志
需求:出现错误,能够查看日志找出错误的地方,但考虑到日志文件过长长时间不清理会占用空间,需要实现自动清理30天前的日志
- 在当前项目中创建一个模块logging_config.py,以及一个log文件abc.log
import logging
from logging.handlers import TimedRotatingFileHandler
def setup_logging(log_file="log文件的绝对路径"):
handler = TimedRotatingFileHandler(
filename=log_file,
when='D',
interval = 1, #时间间隔
backupCount = 30, # 备份周期
encoding = 'utf-8'
)
format=logging.Formatter("%(asctime)s-%(levelname)s-%(filename)s-%(funcName)s-%(message)s",
datefmt="%Y-%m-%d %H:%M:%S")
handler.setFormatter(format)
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.addHandler(handler)
return logger
- 在flask文件中引用上述的配置文件
# flask文件以及其他需要log的文件
from log_file.logging_config import *
# 仅flask文件
logger = setup_logging()
- 在需要记录到log中的输出使用logging.info/error等即可
设置系统守护进程Daemon
- 进入到etc/systemed/system/
- 新建文件[daemon文件名].service
- 写入
[Unit]
Description=My Python Daemon
After=network.target # 确保服务在网络服务启动后才启动
[Service]
WorkingDirectory=[项目绝对路径 例如/abc/my_rpogram]
ExecStart=[python虚拟环境路径] /path/to/your/project/your_script.py # 不同情况不同写法
Restart=always # 进程崩溃时自动重启
User=root # 以root用户权限运行
StandardOutput=append:/var/log/[文件名].log # 日志输出
StandardError=append:/var/log/[文件名].log
[Install]
WantedBy=multi-user.target # 服务将在系统启动时自动加载
a. ExecStart的值分几种情况
虚拟环境运行Flask应用:
ExecStart=[python虚拟环境路径] /path/to/your/project/your_script.py
非虚拟环境运行:
ExecStart=[python路径] /path/to/your/project/your_script.py
- 重新加载systemd配置并启动服务
# 输入以下四行
sudo systemctl daemon-reload # 重新加载
sudo systemctl enable [daemon文件名].service # 设置开机自启
sudo systemctl start [daemon文件名].service # 启动进程
sudo systemctl status [daemon文件名].service # 查看运行状态
# 下面命令看需求输入
# 查看系统日志 非程序logger输出实时日志
journalctl -u [daemon文件名] -f
# 取消开机自启
sudo systemctl disable [daemon文件名].service
# 导出所有日志
journalctl > system_logs.txt
# 仅导出某个服务的日志
journalctl -u [daemon文件名].service > [文件名].log
- 如果需要改动代码需要停止服务再重启才可以生效
sudo systemctl stop [daemon文件名].service # 停止
sudo systemctl restart [daemon文件名].service # 重启
使用gunicorn部署Flask应用
这一步将环境改为生产环境(WSGI服务器)
gunicorn支持多进程,高并发,适合生产环境,支持自动重启
进入到项目目录,
- 安装gunicorn
pip install gunicorn
如果是虚拟环境,安装完成后gunicorn就会出现在.venv/bin目录中
2. 启动flask应用
gunicorn -w 4 -b 0.0.0.0:[端口号] your_app:app
1)-w 4 表示worker,开启4个工作进程,通常设置为CPU数量*2+1
2)-b 0.0.0.0:[端口号] 绑定到所有网卡的xx端口
3)your_app:app :your_app是flask所在的python文件不带.py,并且your_app不是绝对或者香炉路径,而是python的模块名称,app是flask实例名称
3. 将应用作为linux服务启动,自动管理进程
将前面的daemon.service文件打开,更改变量
ExecStart=[gunicorn路径] -w 4 -b 0.0.0.0:[端口号] your_app:app
a. Flask应用运行在系统python环境中:
[gunicorn路径]: /usr/local/bin/gunicorn
b. Flask应用运行在虚拟环境中:
[gunicorn路径]:/path/to/venv/bin/gunicorn
4. 重载systemd,重启flask服务即可
sudo systemctl daemon-reload
sudo systemctl start [daemon文件名].service
sudo systemctl status [daemon文件名].service
sudo systemctl enable [daemon文件名].service