Ubuntu 上 Flask 应用的生产环境部署
·
Ubuntu 上 Flask 应用的生产环境部署
在 Ubuntu 生产环境部署 Flask 应用需要考虑稳定性、安全性和性能,推荐使用 Gunicorn 作为 WSGI 服务器 + Nginx 作为反向代理 的组合方案。以下是详细步骤:
一、准备环境
1. 更新系统并安装依赖
# 更新系统包
sudo apt update && sudo apt upgrade -y
# 安装必要工具(Python、虚拟环境、数据库依赖等)
sudo apt install -y python3 python3-pip python3-venv python3-dev python3-full
sudo apt install -y build-essential libssl-dev libffi-dev
sudo apt install -y nginx mysql-client
2. 上传项目代码
将本地项目文件上传到服务器(以/var/www/flask_production为例):
# 创建项目目录
sudo mkdir -p /var/www/flask_production
# 赋予当前用户权限
sudo chown $USER:$USER /var/www/flask_production
# 上传代码(可选方式)
# 方式1:通过scp从本地上传
scp -r /本地项目路径/* user@服务器IP:/var/www/flask_production/
# 方式2:通过git克隆(如果代码在仓库中)
# git clone 你的仓库地址 /var/www/flask_production
wget https://raw.githubusercontent.com/xxxx
3. 创建虚拟环境并安装依赖
# 进入项目目录
cd /var/www/flask_production
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 安装项目依赖(确保有requirements.txt)
# 先创建依赖文件(如果没有)
# 本地生成后上传,或直接在服务器执行
pip freeze > requirements.txt
# 安装依赖
pip install -r requirements.txt
# 额外安装生产环境需要的WSGI服务器
pip install gunicorn
二、配置 Gunicorn(WSGI 服务器)
Gunicorn 用于运行 Flask 应用,替代开发环境的flask run。
1. 测试 Gunicorn 是否能正常启动应用
# 激活虚拟环境(如果未激活)
source venv/bin/activate
# 启动命令:gunicorn -w 工作进程数 -b 绑定地址 应用入口:Flask实例
gunicorn -w 4 -b 127.0.0.1:8000 "app:create_app()"
-w 4:根据 CPU 核心数设置(通常为2*CPU核心数 + 1)127.0.0.1:8000:仅本地访问,通过 Nginx 转发- 测试成功后按
Ctrl+C停止,继续配置服务。
2. 创建 Systemd 服务(实现开机自启和进程管理)
# 创建服务文件
sudo nano /etc/systemd/system/flask_app.service
写入以下内容(根据实际路径修改):
[Unit]
Description=Gunicorn instance to serve flask production API
After=network.target mysql.service
[Service]
User=root
Group=root
WorkingDirectory=/var/www/flask_production
Environment="PATH=/var/www/flask_production/venv/bin"
ExecStart=/var/www/flask_production/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 "app:create_app()"
Restart=always
[Install]
WantedBy=multi-user.target
3. 启动并设置开机自启
# 重新加载
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start flask_app
# 设置开机自启
sudo systemctl enable flask_app
# 查看服务状态(确保为active (running))
sudo systemctl status flask_app
三、配置 Nginx(反向代理)
Nginx 作为前端代理,处理静态资源、SSL 终结、负载均衡等,同时将动态请求转发给 Gunicorn。
1. 创建 Nginx 配置文件
sudo nano /etc/nginx/sites-available/flask_app
# 写入以下配置(替换server_name后的内容为你的域名或服务器 IP):
server {
listen 80;
server_name xxx.xxx.xxx.xxx 192.168.1.xxx; # 外网+内网IP地址,用空格分开
# 访问日志和错误日志
access_log /var/log/nginx/flask_access.log;
error_log /var/log/nginx/flask_error.log;
# 前端静态文件配置
location / {
root /var/www/flask_frontend; # 前端文件目录
index index.html; # 默认首页
try_files $uri $uri/ /index.html; # 支持SPA路由(如Vue Router的history模式)
}
# 后端API接口转发
location /api {
proxy_pass http://127.0.0.1:8000; # 对应Gunicorn的绑定地址
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;
}
# 健康检查接口转发(与/api转发规则一致)
location /health {
proxy_pass http://127.0.0.1:8000; # 同样转发到后端服务
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;
}
}
2. 启用站点并测试 Nginx 配置
# 重新加载
sudo systemctl daemon-reload
# 建立软链接到sites-enabled
sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled/
# 测试配置是否有误
sudo nginx -t
# 重启Nginx生效
sudo systemctl restart nginx
sudo systemctl enable nginx
sudo systemctl status nginx
四、配置防火墙(增强安全性)
# 查看已开放端口
sudo ufw status
# 允许HTTP(80)、HTTPS(443)和SSH(22)
sudo ufw allow 'Nginx Full'
sudo ufw allow ssh
# 启用防火墙
sudo ufw enable
五、配置 HTTPS(可选但推荐)
使用 Let’s Encrypt 获取免费 SSL 证书:
# 安装Certbot
sudo apt install -y certbot python3-certbot-nginx
# 为域名申请证书并自动配置Nginx
sudo certbot --nginx -d your_domain.com
证书会自动续期,无需手动操作。
六、部署验证
-
访问你的服务器 IP 或域名:
http://your_domain.com/health,应返回健康检查信息。 -
测试 API 接口(如
http://your_domain.com/api/employees),确认能正常返回数据。 -
查看日志排查问题:
-
Gunicorn 日志:
sudo journalctl -u flask_app -
Nginx 日志:
sudo tail -f /var/log/nginx/flask_error.logsudo tail -f /var/log/nginx/flask_access.log
七、后续维护
- 代码更新:
# 拉取最新代码
cd /var/www/flask_production
git pull # 或上传新文件
# 重启服务生效
sudo systemctl restart flask_app
- 依赖更新:
source venv/bin/activate
pip install -r requirements.txt # 若依赖有变化
sudo systemctl restart flask_app
- 数据库备份:
# 定期备份MySQL数据库
mysqldump -u 用户名 -p 数据库名 > backup_$(date +%Y%m%d).sql
通过以上步骤,你的 Flask 应用将在生产环境中以稳定、安全的方式运行,支持高并发并具备自动恢复能力。
更多推荐


所有评论(0)