简介:本文详细解析了如何将Python程序部署到云服务器的完整流程,涵盖环境准备、依赖管理、服务化配置及安全优化等关键环节,为开发者提供可落地的技术方案。
选择云服务器时需重点考虑:
在部署前需完成:
pip freeze > requirements.txt生成依赖清单pytest执行单元测试,确保代码覆盖率>80%gunicorn --bind 0.0.0.0:8000 app:app进行本地服务化测试
# 更新软件包索引sudo apt update && sudo apt upgrade -y# 安装系统依赖sudo apt install -y python3-pip python3-venv nginx git# 创建专用用户(安全最佳实践)sudo adduser deployusersudo usermod -aG sudo deployuser
# 创建项目目录sudo mkdir /opt/myapp && sudo chown deployuser:deployuser /opt/myapp# 作为deployuser操作cd /opt/myapppython3 -m venv venvsource venv/bin/activatepip install --upgrade pippip install -r requirements.txt
[mysqld]max_connections = 200innodb_buffer_pool_size = 1G
QueuePool,设置pool_size=10, max_overflow=20
# 作为deployuser操作cd /opt/myappgit clone https://github.com/yourrepo/myapp.gitcd myappgit checkout v1.0.0 # 指定稳定版本
/etc/systemd/system/myapp.service:[Service]
User=deployuser
Group=www-data
WorkingDirectory=/opt/myapp/myapp
Environment=”PATH=/opt/myapp/venv/bin”
ExecStart=/opt/myapp/venv/bin/gunicorn —workers 3 —bind unix:myapp.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
2. Nginx配置示例:```nginxserver {listen 80;server_name yourdomain.com;location / {include proxy_params;proxy_pass http://unix:/opt/myapp/myapp.sock;}location /static/ {alias /opt/myapp/myapp/static/;}}
# Dockerfile示例FROM python:3.9-slimWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD ["gunicorn", "--bind", "0.0.0.0:8000", "wsgi:app"]
构建与运行命令:
docker build -t myapp .docker run -d -p 8000:8000 --name myapp myapp
# 配置logging模块示例import loggingfrom logging.handlers import RotatingFileHandlerhandler = RotatingFileHandler('/var/log/myapp/app.log',maxBytes=10*1024*1024,backupCount=5)handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))logger = logging.getLogger(__name__)logger.addHandler(handler)logger.setLevel(logging.INFO)
REQUEST_COUNT = Counter(‘app_requests_total’, ‘Total HTTP Requests’)
@app.route(‘/metrics’)
def metrics():
return Response(generate_latest(), mimetype=”text/plain”)
if name == ‘main‘:
start_http_server(8001)
app.run()
## 五、安全加固最佳实践### 5.1 防火墙配置```bash# 使用UFW简化管理sudo ufw allow 22/tcpsudo ufw allow 80/tcpsudo ufw allow 443/tcpsudo ufw enable
.env文件:
DB_PASSWORD=encrypted_valueSECRET_KEY=base64_encoded_key
# 每周安全更新0 3 * * 1 sudo apt update && sudo apt upgrade -y# 日志轮转配置/var/log/myapp/*.log {weeklymissingokrotate 4compressdelaycompressnotifemptycreate 640 deployuser adm}
# 查找占用端口的进程sudo lsof -i :8000# 强制终止进程sudo kill -9 <PID>
# 生成依赖树分析pip install pipdeptreepipdeptree --reverse --package gunicorn# 使用虚拟环境隔离python -m venv --clear venv
# 使用cProfile进行性能分析import cProfiledef profile_function():# 待分析的代码passcProfile.run('profile_function()', sort='cumtime')
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2- name: Install dependenciesrun: pip install -r requirements.txt- name: Deploy to serveruses: appleboy/ssh-action@masterwith:host: ${{ secrets.SERVER_IP }}username: deployuserkey: ${{ secrets.SSH_KEY }}script: |cd /opt/myappgit pullsource venv/bin/activatepip install -r requirements.txtsudo systemctl restart myapp
2. **蓝绿部署**:使用Nginx配置多个后端服务```nginxupstream myapp {server 127.0.0.1:8000 weight=1; # 当前版本server 127.0.0.1:8001 weight=0; # 新版本}
通过以上系统化的部署方案,开发者可以构建出高可用、易维护的云上Python应用。实际部署时建议先在测试环境验证完整流程,再逐步迁移到生产环境。定期回顾监控数据,持续优化部署架构,是保障服务稳定性的关键。