第198集:Python项目服务器部署

课程目标

  • 了解服务器部署的基本概念
  • 掌握Linux服务器的基本操作
  • 学会配置Web服务器(Nginx)
  • 掌握应用服务器(Gunicorn/uWSGI)的配置
  • 学会部署Python Web应用
  • 了解数据库的服务器部署

一、服务器部署基础

1.1 什么是服务器部署?

服务器部署是将开发完成的Python应用程序安装到服务器上,使其能够被用户访问的过程。

1.2 部署的基本流程

  1. 选择服务器环境
  2. 配置服务器基础环境
  3. 部署应用程序
  4. 配置Web服务器和应用服务器
  5. 配置数据库
  6. 测试和监控

1.3 常用的服务器架构

用户 → 防火墙 → Web服务器(Nginx/Apache)→ 应用服务器(Gunicorn/uWSGI)→ Python应用 → 数据库

二、Linux服务器基础

2.1 Linux服务器的选择

  • Ubuntu Server: 最受欢迎的Linux服务器发行版,易于使用和维护
  • CentOS/RHEL: 企业级Linux发行版,稳定性好
  • Debian: 稳定、安全的Linux发行版

2.2 连接Linux服务器

# 使用SSH连接服务器
ssh username@server_ip_address

2.3 基本Linux命令

# 更新系统包
apt update && apt upgrade -y

# 创建用户
sudo adduser username

# 授予sudo权限
sudo usermod -aG sudo username

# 查看文件和目录
ls -la

# 创建目录
mkdir directory_name

# 查看进程
ps aux

# 查看端口占用
netstat -tuln

三、配置Python环境

3.1 安装Python

# Ubuntu 20.04及以上
sudo apt install python3 python3-pip python3-venv

# 检查Python版本
python3 --version
pip3 --version

3.2 创建虚拟环境

# 创建虚拟环境
python3 -m venv myenv

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

# 退出虚拟环境
deactivate

3.3 安装依赖

# 激活虚拟环境后
pip install -r requirements.txt

四、Web服务器配置(Nginx)

4.1 安装Nginx

# 安装Nginx
sudo apt install nginx

# 启动Nginx
sudo systemctl start nginx

# 设置开机自启
sudo systemctl enable nginx

# 检查Nginx状态
sudo systemctl status nginx

4.2 配置Nginx作为反向代理

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

配置内容:

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 /path/to/your/app/static/;
        expires 30d;
    }

    location /media/ {
        alias /path/to/your/app/media/;
        expires 30d;
    }
}

4.3 启用配置

# 启用配置
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重启Nginx
sudo systemctl restart nginx

五、应用服务器配置

5.1 Gunicorn(推荐用于Flask/Django)

# 安装Gunicorn
pip install gunicorn

# 基本运行
cd /path/to/your/app
gunicorn --bind 0.0.0.0:8000 wsgi:app  # Flask应用
# 或
gunicorn --bind 0.0.0.0:8000 myproject.wsgi  # Django应用

5.2 uWSGI(另一种选择)

# 安装uWSGI
pip install uwsgi

# 基本运行
uwsgi --http :8000 --module wsgi:app  # Flask应用

5.3 使用systemd管理应用

# 创建服务文件
sudo nano /etc/systemd/system/myapp.service

服务文件内容:

[Unit]
Description=My Python Application
After=network.target

[Service]
User=yourusername
Group=www-data
WorkingDirectory=/path/to/your/app
Environment="PATH=/path/to/your/app/myenv/bin"
ExecStart=/path/to/your/app/myenv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 wsgi:app
Restart=always

[Install]
WantedBy=multi-user.target

启用服务:

# 启用服务
sudo systemctl enable myapp

# 启动服务
sudo systemctl start myapp

# 查看服务状态
sudo systemctl status myapp

六、数据库部署

6.1 MySQL的部署

# 安装MySQL
sudo apt install mysql-server

# 安全配置
sudo mysql_secure_installation

# 登录MySQL
sudo mysql

# 创建数据库和用户
CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;

6.2 PostgreSQL的部署

# 安装PostgreSQL
sudo apt install postgresql postgresql-contrib

# 登录PostgreSQL
sudo -u postgres psql

# 创建数据库和用户
CREATE DATABASE mydatabase;
CREATE USER myuser WITH PASSWORD 'mypassword';
ALTER ROLE myuser SET client_encoding TO 'utf8';
ALTER ROLE myuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myuser SET timezone TO 'Asia/Shanghai';
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;

七、部署Python Web应用

7.1 部署前的准备

  1. 确保应用能够在本地正常运行
  2. 创建requirements.txt文件
  3. 配置环境变量
  4. 准备静态文件和媒体文件

7.2 部署流程

# 1. 更新系统
sudo apt update && sudo apt upgrade -y

# 2. 安装必要的软件
sudo apt install nginx python3-pip python3-venv git

# 3. 创建项目目录
sudo mkdir -p /var/www/myapp
cd /var/www/myapp

# 4. 克隆项目代码
git clone https://github.com/yourusername/myapp.git .

# 5. 创建虚拟环境
python3 -m venv venv

# 6. 激活虚拟环境并安装依赖
source venv/bin/activate
pip install -r requirements.txt

# 7. 配置环境变量
cp .env.example .env
# 编辑.env文件配置数据库等信息

# 8. 运行数据库迁移(如果需要)
python manage.py migrate  # Django
# 或 flask db upgrade  # Flask

# 9. 收集静态文件(Django)
python manage.py collectstatic

# 10. 配置Gunicorn/systemd服务
# 参考前面的systemd配置

# 11. 配置Nginx
# 参考前面的Nginx配置

# 12. 重启服务
sudo systemctl restart myapp
sudo systemctl restart nginx

八、HTTPS配置

8.1 安装Certbot

# 安装Certbot
sudo apt install certbot python3-certbot-nginx

# 获取SSL证书
sudo certbot --nginx -d your_domain.com

# 自动更新证书
sudo certbot renew --dry-run

8.2 配置HTTPS

Certbot会自动更新Nginx配置,启用HTTPS。

九、监控和维护

9.1 日志管理

# 查看Nginx日志
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

# 查看应用日志
sudo journalctl -u myapp -f

9.2 进程监控

# 查看运行的进程
top
htop

# 查看端口占用
netstat -tuln
ss -tuln

9.3 定期备份

# 备份数据库
mysqldump -u myuser -p mydatabase > mydatabase_backup.sql
pg_dump -U myuser mydatabase > mydatabase_backup.sql

# 备份项目文件
tar -czf myapp_backup.tar.gz /var/www/myapp

十、常见问题和解决方案

10.1 502 Bad Gateway错误

  • 检查应用服务器是否在运行
  • 检查应用服务器的监听端口
  • 检查防火墙设置

10.2 静态文件无法访问

  • 检查Nginx的静态文件配置
  • 检查静态文件的权限
  • 检查静态文件的路径

10.3 数据库连接错误

  • 检查数据库是否在运行
  • 检查数据库用户名和密码
  • 检查数据库的权限设置
  • 检查数据库的监听地址

10.4 应用运行缓慢

  • 增加应用服务器的workers数量
  • 优化数据库查询
  • 使用缓存
  • 增加服务器资源

十一、总结

Python项目的服务器部署是一个复杂但重要的过程,通过本节课的学习,您应该掌握了:

  • Linux服务器的基本操作
  • Nginx Web服务器的配置
  • Gunicorn应用服务器的配置
  • Python Web应用的部署流程
  • 数据库的服务器部署
  • 监控和维护的基本方法

下一节课,我们将学习Python项目的持续集成。

« 上一篇 打包发布 下一篇 » 持续集成