第200集:Python项目部署实战

课程目标

  • 了解项目部署的完整流程
  • 掌握Linux服务器的基本操作
  • 学会使用Nginx作为Web服务器
  • 掌握Gunicorn作为应用服务器的配置
  • 学会使用systemd管理应用服务
  • 掌握数据库的部署与配置
  • 了解HTTPS的配置方法
  • 学会使用CI/CD自动化部署项目
  • 掌握项目维护与监控的基本方法

一、项目部署概述

1.1 什么是项目部署?

项目部署是将开发完成的应用程序发布到生产环境,使其能够正常运行并提供服务的过程。部署包括服务器配置、应用安装、数据库配置、网络设置等多个环节。

1.2 部署的主要流程

1. 准备部署环境
2. 配置服务器
3. 安装应用程序
4. 配置数据库
5. 配置Web服务器
6. 配置应用服务器
7. 配置系统服务
8. 配置HTTPS
9. 测试应用
10. 部署完成

二、部署环境准备

2.1 服务器选择

  • 云服务器:阿里云、腾讯云、AWS、Azure等
  • 物理服务器:自购服务器设备

2.2 操作系统选择

  • Linux:推荐使用Ubuntu、CentOS、Debian等
  • Windows Server:适合.NET应用,Python应用推荐使用Linux

2.3 远程连接工具

  • SSH:Linux服务器的标准远程连接工具
  • XshellPutty:Windows平台的SSH客户端
  • VS Code Remote SSH:集成开发环境的远程连接功能

三、项目部署实战(Flask博客系统)

3.1 项目介绍

我们将部署一个简单的Flask博客系统,包含用户认证、文章管理、评论功能等。

3.2 项目结构

flask_blog/
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── routes.py
│   ├── forms.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── index.html
│   │   ├── login.html
│   │   ├── register.html
│   │   └── post.html
│   └── static/
│       ├── css/
│       └── js/
├── config.py
├── manage.py
├── requirements.txt
└── wsgi.py

3.3 核心代码示例

app/init.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from config import Config

app = Flask(__name__)
app.config.from_object(Config)

db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'

from app import routes, models

wsgi.py

from app import app

if __name__ == "__main__":
    app.run()

requirements.txt

Flask==2.3.2
Flask-SQLAlchemy==3.0.5
Flask-Bcrypt==1.0.1
Flask-Login==0.6.2
WTForms==3.0.1
SQLAlchemy==2.0.15
python-dotenv==1.0.0

四、服务器配置

4.1 服务器基本配置

更新系统

# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y

# CentOS/RHEL
sudo yum update -y

创建用户

# 创建用户
sudo adduser flask_user

# 添加到sudo组
sudo usermod -aG sudo flask_user

# 切换到新用户
su - flask_user

安装必要软件

# 安装Python和pip
sudo apt install python3 python3-pip python3-venv git -y

4.2 防火墙配置

# 查看防火墙状态
sudo ufw status

# 允许SSH
sudo ufw allow ssh

# 允许HTTP和HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 启用防火墙
sudo ufw enable

五、数据库部署

5.1 安装MySQL

# Ubuntu/Debian
sudo apt install mysql-server -y

# 启动MySQL服务
sudo systemctl start mysql

# 设置开机自启
sudo systemctl enable mysql

# 安全配置
sudo mysql_secure_installation

5.2 创建数据库和用户

# 登录MySQL
mysql -u root -p

# 创建数据库
CREATE DATABASE flask_blog;

# 创建用户并授权
CREATE USER 'flask_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON flask_blog.* TO 'flask_user'@'localhost';
FLUSH PRIVILEGES;

# 退出MySQL
EXIT;

六、Web服务器配置(Nginx)

6.1 安装Nginx

# Ubuntu/Debian
sudo apt install nginx -y

# 启动Nginx
sudo systemctl start nginx

# 设置开机自启
sudo systemctl enable nginx

6.2 配置Nginx

# 创建配置文件
sudo nano /etc/nginx/sites-available/flask_blog

配置内容:

server {
    listen 80;
    server_name your_domain.com;

    location / {
        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;
    }

    location /static/ {
        alias /var/www/flask_blog/app/static/;
        expires 30d;
    }

    location /media/ {
        alias /var/www/flask_blog/app/media/;
        expires 30d;
    }
}

6.3 启用配置

# 创建软链接
sudo ln -s /etc/nginx/sites-available/flask_blog /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重启Nginx
sudo systemctl restart nginx

七、应用服务器配置(Gunicorn)

7.1 安装Gunicorn

# 进入项目目录
cd /var/www/flask_blog

# 激活虚拟环境
source venv/bin/activate

# 安装Gunicorn
pip install gunicorn

7.2 测试Gunicorn

# 使用Gunicorn运行应用
gunicorn --workers 3 --bind 127.0.0.1:8000 wsgi:app

八、系统服务配置

8.1 创建系统服务文件

sudo nano /etc/systemd/system/flask_blog.service

配置内容:

[Unit]
Description=Flask Blog Application
After=network.target

[Service]
User=flask_user
Group=www-data
WorkingDirectory=/var/www/flask_blog
Environment="PATH=/var/www/flask_blog/venv/bin"
ExecStart=/var/www/flask_blog/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 wsgi:app
Restart=always

[Install]
WantedBy=multi-user.target

8.2 启用系统服务

# 重新加载系统服务
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start flask_blog

# 设置开机自启
sudo systemctl enable flask_blog

# 查看服务状态
sudo systemctl status flask_blog

九、HTTPS配置

9.1 安装Certbot

# Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx -y

# CentOS/RHEL
sudo yum install epel-release -y
sudo yum install certbot python3-certbot-nginx -y

9.2 获取SSL证书

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

9.3 配置自动续期

# 测试自动续期
sudo certbot renew --dry-run

# 查看定时任务
sudo crontab -l

十、CI/CD自动化部署

10.1 创建GitHub Actions配置

# .github/workflows/deploy.yml
name: Flask Blog CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.8", "3.9", "3.10"]

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
        pip install pytest pytest-cov flake8
    - name: Lint with flake8
      run: |
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
    - name: Run tests
      run: |
        pytest --cov=app

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    
    steps:
    - name: Deploy to Production
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.PROD_HOST }}
        username: ${{ secrets.PROD_USER }}
        key: ${{ secrets.PROD_SSH_KEY }}
        script: |
          cd /var/www/flask_blog
          git pull origin main
          source venv/bin/activate
          pip install -r requirements.txt
          flask db upgrade
          sudo systemctl restart flask_blog

10.2 设置GitHub Secrets

  1. 进入GitHub仓库
  2. 点击"Settings" -> "Secrets and variables" -> "Actions"
  3. 添加以下Secrets:
    • PROD_HOST:服务器IP地址
    • PROD_USER:部署用户
    • PROD_SSH_KEY:SSH私钥

十一、项目维护与监控

11.1 日志查看

# 查看应用日志
sudo journalctl -u flask_blog

# 实时查看日志
sudo journalctl -u flask_blog -f

# 查看Nginx访问日志
sudo tail -f /var/log/nginx/access.log

# 查看Nginx错误日志
sudo tail -f /var/log/nginx/error.log

11.2 性能监控

# 安装htop
sudo apt install htop -y

# 运行htop
top

# 查看内存使用情况
free -h

# 查看磁盘使用情况
df -h

11.3 定期备份

# 备份数据库
mysqldump -u flask_user -p flask_blog > flask_blog_backup.sql

# 备份项目文件
tar -czf flask_blog_project.tar.gz /var/www/flask_blog

十二、常见问题与解决方案

12.1 应用无法启动

  • 检查应用日志:sudo journalctl -u flask_blog
  • 检查端口是否被占用:netstat -tuln | grep 8000
  • 检查配置文件是否正确

12.2 502 Bad Gateway

  • 检查Gunicorn服务是否运行:sudo systemctl status flask_blog
  • 检查Nginx配置是否正确:sudo nginx -t
  • 检查防火墙设置

12.3 数据库连接错误

  • 检查数据库服务是否运行:sudo systemctl status mysql
  • 检查数据库配置信息
  • 检查数据库用户权限

12.4 静态文件无法访问

  • 检查Nginx配置中的静态文件路径
  • 检查文件权限:sudo chown -R flask_user:www-data /var/www/flask_blog/app/static/

十三、总结

通过本集课程,我们学习了Python项目部署的完整流程,包括:

  • 服务器环境准备
  • 数据库部署与配置
  • Web服务器(Nginx)配置
  • 应用服务器(Gunicorn)配置
  • 系统服务管理
  • HTTPS证书配置
  • CI/CD自动化部署
  • 项目维护与监控

项目部署是软件开发的重要环节,掌握正确的部署方法可以确保应用程序在生产环境中稳定运行。希望通过本集的实战演练,您能够熟练掌握Python项目的部署技能。

下一节课,我们将开始学习机器学习的基础知识,进入Python的高级应用领域。

« 上一篇 持续集成 下一篇 » 机器学习概念