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 vim2.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 --version3. 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"]关键点解析:
- 使用slim镜像减小体积
- 先复制requirements.txt可以更好利用Docker缓存
- Gunicorn比Flask内置服务器更适合生产环境
3.3 优化Docker构建
几个实用的构建优化技巧:
使用.dockerignore文件排除不需要的文件:
__pycache__/ *.pyc .git .env多阶段构建减小最终镜像大小:
# 构建阶段 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: bridge5.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 down6.2 自动化部署脚本
创建deploy.sh自动化脚本:
#!/bin/bash # 拉取最新代码 git pull origin main # 重建容器 docker-compose down docker-compose build --no-cache docker-compose up -d # 清理旧镜像 docker image prune -f6.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_network7.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 容器启动失败
检查步骤:
- 查看容器日志:
docker logs <container_id> - 检查端口冲突:
netstat -tulnp | grep <port> - 验证环境变量:
docker exec -it <container_id> env
8.2 Nginx 502 Bad Gateway
可能原因及解决方案:
- 上游服务未启动 - 检查应用容器状态
- 连接超时 - 增加proxy_read_timeout
- 权限问题 - 检查SELinux/AppArmor设置
8.3 性能瓶颈定位
使用工具分析:
# 查看容器资源使用 docker stats # Nginx状态监控 curl http://localhost/nginx_status # 慢请求分析 goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED9. 安全加固措施
9.1 Docker安全配置
- 禁止root用户运行容器:
services: app: # ...其他配置 user: "1000:1000"- 启用内容信任:
export DOCKER_CONTENT_TRUST=19.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 定期更新策略
- 设置自动安全更新:
sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades- 监控CVE漏洞:
docker scan your_image:tag10. 扩展与优化
10.1 负载均衡配置
扩展为多节点部署:
services: app: # ...其他配置 deploy: replicas: 3 update_config: parallelism: 1 delay: 10s restart_policy: condition: on-failure10.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的组合展现了极大的灵活性。实际使用中建议根据具体业务需求调整配置参数,并建立完善的监控体系。