将Python项目部署到云服务器是一个常见的需求。以下是详细的部署步骤和最佳实践:
1. 准备云服务器
选择云服务商
- 阿里云、腾讯云、华为云(国内)
- AWS、Google Cloud、Azure(国际)
基础配置
# 登录服务器后更新系统
sudo apt update && sudo apt upgrade -y
# 安装必要的软件
sudo apt install python3 python3-pip python3-venv nginx git -y
2. 项目准备
创建项目目录结构
/myproject/
├── app/
│ ├── __init__.py
│ └── main.py
├── requirements.txt
├── wsgi.py
└── config/
└── settings.py
生成requirements.txt
# 在本地开发环境中
pip freeze > requirements.txt
3. 部署Flask/Django应用示例
Flask应用部署
wsgi.py文件
import sys
sys.path.insert(0, '/path/to/your/project')
from app import app as application
if __name__ == "__main__":
application.run()
Django应用部署
settings.py配置
# 生产环境配置
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com', 'your-server-ip']
# 数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myproject',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
# 静态文件
STATIC_ROOT = '/path/to/your/project/staticfiles'
4. 使用Gunicorn部署
安装和配置Gunicorn
# 安装Gunicorn
pip install gunicorn
# 测试运行
gunicorn --bind 0.0.0.0:8000 wsgi:application
# 创建Gunicorn配置文件
cat > gunicorn.conf.py << 'EOF'
bind = "127.0.0.1:8000"
workers = 4
worker_class = "sync"
worker_connections = 1000
max_requests = 1000
max_requests_jitter = 100
timeout = 30
keepalive = 2
preload_app = True
EOF
5. Nginx反向X_X配置
Nginx配置文件
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/project/staticfiles/;
expires 30d;
}
location /media/ {
alias /path/to/your/project/media/;
expires 30d;
}
}
启用Nginx配置
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重启Nginx
sudo systemctl restart nginx
6. 使用Systemd管理服务
创建Gunicorn服务文件
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/path/to/your/project
Environment="PATH=/path/to/your/project/venv/bin"
ExecStart=/path/to/your/project/venv/bin/gunicorn --config gunicorn.conf.py wsgi:application
Restart=always
[Install]
WantedBy=multi-user.target
管理服务
# 启动服务
sudo systemctl start myproject
# 设置开机自启
sudo systemctl enable myproject
# 查看状态
sudo systemctl status myproject
# 重启服务
sudo systemctl restart myproject
7. 安全配置
防火墙设置
# 开放HTTP和HTTPS端口
sudo ufw allow 'Nginx Full'
# 或者指定端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
SSL证书(使用Let’s Encrypt)
# 安装Certbot
sudo apt install certbot python3-certbot-nginx
# 获取SSL证书
sudo certbot --nginx -d your-domain.com
# 自动续期测试
sudo certbot renew --dry-run
8. 数据库配置
PostgreSQL安装
# 安装PostgreSQL
sudo apt install postgresql postgresql-contrib
# 创建数据库和用户
sudo -u postgres psql
CREATE DATABASE myproject;
CREATE USER myuser WITH PASSWORD 'securepassword';
GRANT ALL PRIVILEGES ON DATABASE myproject TO myuser;
q
9. 自动化部署脚本
deploy.sh
#!/bin/bash
PROJECT_DIR="/path/to/your/project"
VENV_DIR="$PROJECT_DIR/venv"
echo "开始部署..."
# 拉取最新代码
cd $PROJECT_DIR
git pull origin main
# 激活虚拟环境
source $VENV_DIR/bin/activate
# 安装依赖
pip install -r requirements.txt
# 收集静态文件(Django)
python manage.py collectstatic --noinput
# 迁移数据库
python manage.py migrate
# 重启服务
sudo systemctl restart myproject
sudo systemctl restart nginx
echo "部署完成!"
10. 监控和日志
日志配置
# logging.conf
import logging
import logging.handlers
logger = logging.getLogger('myproject')
logger.setLevel(logging.INFO)
handler = logging.handlers.RotatingFileHandler(
'/var/log/myproject/app.log',
maxBytes=10*1024*1024, # 10MB
backupCount=5
)
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
handler.setFormatter(formatter)
logger.addHandler(handler)
最佳实践
- 使用虚拟环境:避免包冲突
- 环境变量:敏感信息不要硬编码
- 定期备份:数据库和重要文件
- 监控:设置错误监控和性能监控
- CI/CD:使用GitLab CI或GitHub Actions自动化部署
这样就可以成功将Python项目部署到云服务器上并保持稳定运行。
CLOUD技术博