Python Flask应用Docker+Nginx生产环境部署指南

发布时间:2026/10/28 19:55:14
Python Flask应用Docker+Nginx生产环境部署指南

1. 项目概述

去年接手了一个Python Flask项目,需要部署到生产环境。考虑到传统部署方式的各种痛点,最终选择了Docker+Nginx的方案。这套组合不仅解决了环境依赖问题,还实现了负载均衡和HTTPS支持,上线后稳定运行至今。下面就把整个部署过程拆解开来,分享给需要将Python Web应用投入生产的开发者们。

这个方案特别适合以下场景:

  • 需要快速部署Python Web应用(Flask/Django等)
  • 要求环境隔离和快速迁移
  • 需要HTTPS支持和静态文件服务
  • 计划实现蓝绿部署或横向扩展

2. 环境准备与工具选型

2.1 基础环境配置

建议使用Ubuntu 20.04 LTS作为基础系统,长期支持版本更稳定。先进行基础环境配置:

# 更新系统 sudo apt update && sudo apt upgrade -y # 安装基础工具 sudo apt install -y git curl wget vim

2.2 Docker安装与配置

Docker是实现环境隔离的核心工具,安装时要注意版本选择:

# 卸载旧版本 sudo apt remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt install -y apt-transport-https ca-certificates gnupg-agent software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 添加稳定版仓库 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 安装Docker引擎 sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io # 验证安装 sudo docker run hello-world

注意:生产环境建议锁定Docker版本,避免自动升级带来兼容性问题。可以使用sudo apt install docker-ce=<VERSION>指定版本。

2.3 Docker Compose安装

虽然可以直接使用docker命令,但compose能更好地管理多容器应用:

# 下载最新稳定版 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod +x /usr/local/bin/docker-compose # 验证安装 docker-compose --version

3. Python应用容器化

3.1 项目结构准备

标准的Python Web项目应该有以下结构:

myapp/ ├── app/ # 应用代码 │ ├── __init__.py │ ├── routes.py │ └── ... ├── requirements.txt # 依赖文件 ├── Dockerfile # 构建定义 └── docker-compose.yml # 服务编排

3.2 编写Dockerfile

这是容器化的核心配置文件,以Flask应用为例:

# 使用官方Python镜像作为基础 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口 EXPOSE 5000 # 启动命令 CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

关键点解析:

  1. 使用slim镜像减小体积
  2. 先复制requirements.txt可以更好利用Docker缓存
  3. Gunicorn比Flask内置服务器更适合生产环境

3.3 优化Docker构建

几个实用的构建优化技巧:

  1. 使用.dockerignore文件排除不需要的文件:

    __pycache__/ *.pyc .git .env
  2. 多阶段构建减小最终镜像大小:

    # 构建阶段 FROM python:3.9 as builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt # 运行阶段 FROM python:3.9-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

4. Nginx配置与优化

4.1 Nginx容器配置

创建nginx/conf.d/app.conf配置文件:

upstream app_server { server app:5000; # 对应Docker服务名 } server { listen 80; server_name yourdomain.com; location / { proxy_pass http://app_server; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } location /static/ { alias /var/www/static/; expires 30d; } }

4.2 启用HTTPS

使用Let's Encrypt免费证书:

server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # SSL优化配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...'; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; # 其他配置同上 }

4.3 性能优化参数

在nginx.conf中添加以下全局优化参数:

worker_processes auto; events { worker_connections 1024; multi_accept on; use epoll; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; # 其他配置... }

5. 使用Docker Compose编排服务

5.1 基础编排配置

docker-compose.yml示例:

version: '3.8' services: app: build: . ports: - "5000:5000" environment: - FLASK_ENV=production volumes: - ./app:/app restart: unless-stopped networks: - app_network nginx: image: nginx:1.21 ports: - "80:80" - "443:443" volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./static:/var/www/static - /etc/letsencrypt:/etc/letsencrypt depends_on: - app restart: unless-stopped networks: - app_network networks: app_network: driver: bridge

5.2 生产环境增强配置

对于生产环境,建议添加以下配置:

services: app: # ...其他配置 deploy: resources: limits: cpus: '1' memory: 512M healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5000/health"] interval: 30s timeout: 10s retries: 3 nginx: # ...其他配置 logging: options: max-size: "10m" max-file: "3"

6. 部署与持续集成

6.1 手动部署流程

# 构建镜像 docker-compose build # 启动服务 docker-compose up -d # 查看日志 docker-compose logs -f # 停止服务 docker-compose down

6.2 自动化部署脚本

创建deploy.sh自动化脚本:

#!/bin/bash # 拉取最新代码 git pull origin main # 重建容器 docker-compose down docker-compose build --no-cache docker-compose up -d # 清理旧镜像 docker image prune -f

6.3 结合CI/CD

GitLab CI示例配置:

stages: - test - deploy test: stage: test image: python:3.9 script: - pip install -r requirements.txt - pytest deploy_prod: stage: deploy only: - main script: - apt-get update && apt-get install -y openssh-client - ssh user@server "cd /path/to/app && ./deploy.sh"

7. 监控与维护

7.1 日志管理

配置集中式日志收集:

services: app: # ...其他配置 logging: driver: "json-file" options: max-size: "10m" max-file: "3" nginx: # ...其他配置 logging: driver: "syslog" options: syslog-address: "tcp://192.168.1.100:514"

7.2 性能监控

使用cAdvisor+Prometheus+Grafana方案:

services: cadvisor: image: gcr.io/cadvisor/cadvisor:v0.47.0 ports: - "8080:8080" volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro networks: - app_network

7.3 备份策略

数据库备份示例(如果使用PostgreSQL):

# 每日备份脚本 docker exec -t your_db_container pg_dumpall -c -U postgres > dump_$(date +%Y-%m-%d).sql # 加密后上传到云存储 gpg --encrypt --recipient your@email.com dump_$(date +%Y-%m-%d).sql rclone copy dump_$(date +%Y-%m-%d).sql.gpg backup:db_backups/

8. 常见问题排查

8.1 容器启动失败

检查步骤:

  1. 查看容器日志:docker logs <container_id>
  2. 检查端口冲突:netstat -tulnp | grep <port>
  3. 验证环境变量:docker exec -it <container_id> env

8.2 Nginx 502 Bad Gateway

可能原因及解决方案:

  1. 上游服务未启动 - 检查应用容器状态
  2. 连接超时 - 增加proxy_read_timeout
  3. 权限问题 - 检查SELinux/AppArmor设置

8.3 性能瓶颈定位

使用工具分析:

# 查看容器资源使用 docker stats # Nginx状态监控 curl http://localhost/nginx_status # 慢请求分析 goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED

9. 安全加固措施

9.1 Docker安全配置

  1. 禁止root用户运行容器:
services: app: # ...其他配置 user: "1000:1000"
  1. 启用内容信任:
export DOCKER_CONTENT_TRUST=1

9.2 Nginx安全头部

添加安全相关HTTP头:

add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; add_header Content-Security-Policy "default-src 'self' https:";

9.3 定期更新策略

  1. 设置自动安全更新:
sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades
  1. 监控CVE漏洞:
docker scan your_image:tag

10. 扩展与优化

10.1 负载均衡配置

扩展为多节点部署:

services: app: # ...其他配置 deploy: replicas: 3 update_config: parallelism: 1 delay: 10s restart_policy: condition: on-failure

10.2 数据库分离

添加PostgreSQL服务:

services: db: image: postgres:13 environment: POSTGRES_PASSWORD: yourpassword volumes: - pg_data:/var/lib/postgresql/data networks: - app_network volumes: pg_data:

10.3 缓存层添加

集成Redis缓存:

services: redis: image: redis:6 command: redis-server --requirepass yourpassword ports: - "6379:6379" volumes: - redis_data:/data networks: - app_network volumes: redis_data:

这套部署方案经过多个生产项目验证,在保证性能的同时极大简化了部署复杂度。特别是在需要频繁更新和扩展的场景下,Docker+Nginx的组合展现了极大的灵活性。实际使用中建议根据具体业务需求调整配置参数,并建立完善的监控体系。