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

证书会自动续期,无需手动操作。

六、部署验证

  1. 访问你的服务器 IP 或域名:http://your_domain.com/health,应返回健康检查信息。

  2. 测试 API 接口(如http://your_domain.com/api/employees),确认能正常返回数据。

  3. 查看日志排查问题:

  • Gunicorn 日志:sudo journalctl -u flask_app

  • Nginx 日志:sudo tail -f /var/log/nginx/flask_error.log
    sudo tail -f /var/log/nginx/flask_access.log

七、后续维护

  1. 代码更新
# 拉取最新代码
cd /var/www/flask_production
git pull  # 或上传新文件

# 重启服务生效
sudo systemctl restart flask_app
  1. 依赖更新
source venv/bin/activate
pip install -r requirements.txt  # 若依赖有变化
sudo systemctl restart flask_app
  1. 数据库备份
# 定期备份MySQL数据库
mysqldump -u 用户名 -p 数据库名 > backup_$(date +%Y%m%d).sql

通过以上步骤,你的 Flask 应用将在生产环境中以稳定、安全的方式运行,支持高并发并具备自动恢复能力。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐