资讯详情

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

📅 2026/10/28 19:55:33 | 华诺云谱 👁 阅读
Python Flask应用Docker+Nginx生产环境部署指南
1. 项目概述去年接手了一个Python Flask项目需要部署到生产环境。考虑到传统部署方式的各种痛点最终选择了DockerNginx的方案。这套组合不仅解决了环境依赖问题还实现了负载均衡和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 [archamd64] 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-ceVERSION指定版本。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 --frombuilder /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使用Lets 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_ENVproduction 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: 36. 部署与持续集成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/CDGitLab 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 userserver cd /path/to/app ./deploy.sh7. 监控与维护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:5147.2 性能监控使用cAdvisorPrometheusGrafana方案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 youremail.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 env8.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-formatCOMBINED9. 安全加固措施9.1 Docker安全配置禁止root用户运行容器services: app: # ...其他配置 user: 1000:1000启用内容信任export DOCKER_CONTENT_TRUST19.2 Nginx安全头部添加安全相关HTTP头add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection 1; modeblock; 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:这套部署方案经过多个生产项目验证在保证性能的同时极大简化了部署复杂度。特别是在需要频繁更新和扩展的场景下DockerNginx的组合展现了极大的灵活性。实际使用中建议根据具体业务需求调整配置参数并建立完善的监控体系。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑