第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服务器的标准远程连接工具
- Xshell、Putty: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.py3.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, modelswsgi.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 -y4.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_installation5.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 nginx6.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 gunicorn7.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.target8.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 -y9.2 获取SSL证书
sudo certbot --nginx -d your_domain.com -d www.your_domain.com9.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_blog10.2 设置GitHub Secrets
- 进入GitHub仓库
- 点击"Settings" -> "Secrets and variables" -> "Actions"
- 添加以下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.log11.2 性能监控
# 安装htop
sudo apt install htop -y
# 运行htop
top
# 查看内存使用情况
free -h
# 查看磁盘使用情况
df -h11.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的高级应用领域。