将 Python 项目部署到云服务器是一个系统化的过程,下面以主流方案(Linux 云服务器 + Nginx + Gunicorn + systemd)为例,分步骤说明。你可以根据项目规模选择简化或进阶方案。
✅ 一、前期准备
1. 选择云服务器
- 推荐:阿里云 ECS / 腾讯云 CVM / AWS EC2 / DigitalOcean Droplet
- 操作系统:Ubuntu 20.04+ 或 CentOS 7+/Rocky Linux 9+
- 最小配置建议:2 核 CPU / 2GB 内存(开发测试可更低)
2. 本地打包依赖(可选但推荐)
在项目根目录创建 requirements.txt:
pip freeze > requirements.txt
确保包含所有生产依赖(如 gunicorn, psycopg2-binary 等)。
💡 提示:避免将虚拟环境直接上传,而是通过
requirements.txt在服务器重新安装。
🚀 二、部署步骤(以 Ubuntu 22.04 为例)
步骤 1:连接并更新系统
ssh user@your-server-ip
sudo apt update && sudo apt upgrade -y
步骤 2:安装基础工具
# Python 3.10+(通常系统已预装)
python3 --version
# pip & virtualenv
sudo apt install python3-pip python3-venv git -y
# Nginx
sudo apt install nginx -y
# Gunicorn(WSGI 服务器)
sudo apt install gunicorn -y
步骤 3:上传项目代码
方式一:Git 克隆(推荐)
cd /var/www/your-project
git clone https://github.com/your-repo.git .
方式二:SCP 传输
scp -r ./project/* user@server:/var/www/your-project/
步骤 4:创建虚拟环境并安装依赖
cd /var/www/your-project
python3 -m venv venv
source venv/bin/activate
# 升级 pip
pip install --upgrade pip
# 安装依赖
pip install -r requirements.txt
步骤 5:配置环境变量(关键!)
创建 .env 文件或使用 systemd 环境变量:
cat > .env << EOF
DEBUG=False
SECRET_KEY=your-secret-key-here
DATABASE_URL=postgres://user:pass@localhost/dbname
EOF
⚠️ 切勿硬编码敏感信息!建议使用密钥管理服务(如 AWS Secrets Manager)或 CI/CD 注入。
步骤 6:启动应用(临时测试)
gunicorn --bind 0.0.0.0:8000 your_project.wsgi:application
# 替换为你的实际 WSGI 入口,例如 myapp.wsgi:application
浏览器访问 http://your-server-ip:8000 验证是否正常。
✅ 若成功 → 继续;否则检查日志:
gunicorn --log-level debug ... # 查看错误详情
🔒 三、生产级部署(推荐流程)
方案 A:使用 systemd 管理服务(稳定可靠)
1. 创建服务文件
sudo nano /etc/systemd/system/myapp.service
内容示例:
[Unit]
Description=My Python App
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/your-project
Environment="PATH=/var/www/your-project/venv/bin"
ExecStart=/var/www/your-project/venv/bin/gunicorn
--workers 3
--bind unix:/var/www/your-project/myapp.sock
myapp.wsgi:application
Restart=always
[Install]
WantedBy=multi-user.target
2. 设置权限与启动
sudo chmod 644 /etc/systemd/system/myapp.service
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp # 开机自启
sudo systemctl status myapp # 查看状态
✅ 优点:自动重启、日志集成(
journalctl -u myapp)、无端口暴露风险。
方案 B:反向X_X + HTTPS(Nginx)
1. 配置 Nginx 站点
sudo nano /etc/nginx/sites-available/myapp
server {
listen 80;
server_name your-domain.com www.your-domain.com;
location / {
include proxy_params;
proxy_pass http://unix:/var/www/your-project/myapp.sock;
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/your-project/static/;
}
}
启用站点:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
2. 申请 SSL 证书(Let’s Encrypt)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your-domain.com
自动配置 HTTPS 并定期续期。
🛡️ 四、安全加固建议
| 措施 | 操作 |
|---|---|
| 防火墙 | ufw allow 'Nginx Full', ufw allow SSH, ufw enable |
| 限制 root 登录 | 修改 /etc/ssh/sshd_config,禁用密码认证,仅用密钥 |
| 数据库隔离 | 不开放 DB 端口(如 5432),仅允许本地或内网访问 |
| 定期更新 | sudo apt upgrade -y + 监控依赖漏洞(pip-audit) |
| 日志审计 | journalctl -u myapp -f + 集中日志(ELK/Loki) |
🔄 五、持续集成(CI/CD)进阶
- GitHub Actions:自动测试 → 构建镜像 → 部署到服务器(SSH + rsync 或 Docker)
- Docker 部署(适合微服务):
FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myapp.wsgi:application"]配合
docker-compose或 Kubernetes 管理。
❓ 常见问题排查
| 问题 | 解决方案 |
|---|---|
| 502 Bad Gateway | 检查 Gunicorn 是否运行:systemctl status myapp;socket 权限是否正确 |
| 数据库连接失败 | 确认 DATABASE_URL 正确;防火墙是否放行 DB 端口 |
| 静态文件不加载 | Nginx alias 路径是否匹配;collectstatic 是否执行 |
| 内存溢出 | 调整 --workers 数量;增加 Swap 或升级实例 |
需要我根据你的具体技术栈(如 Django/FastAPI/Flask)、云厂商或是否需要容器化,提供定制化部署脚本吗?欢迎补充细节 😊
云服务器