奋斗
努力

如何将Python项目部署到云服务器上?

云计算

将 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)、云厂商或是否需要容器化,提供定制化部署脚本吗?欢迎补充细节 😊

未经允许不得转载:云服务器 » 如何将Python项目部署到云服务器上?