Daphne + Supervisor 多进程部署配置

Daphne + Supervisor 多进程部署配置文档

系统环境

  • 服务器配置: 4核CPU / 8G内存 / 100G存储
  • Python环境: /project/environment/bin/
  • 项目目录: /project/yto_publish
  • 日志目录: /project/logs/

1. Supervisor配置文件

创建配置文件 /etc/supervisor/conf.d/daphne.conf:

[program:daphne]
directory=/project/yto_publish
command=/project/environment/bin/daphne -b 0.0.0.0 -p 800%(process_num)s --proxy-headers --access-log - --application-close-timeout 10 --ping-interval 20 --ping-timeout 30 yto_publish.asgi:application
autostart=true
autorestart=true
numprocs=6
process_name=daphne_%(process_num)s
stdout_logfile=/project/logs/daphne_%(process_num)s.log
redirect_stderr=true

配置说明

  • numprocs=6: 启动6个进程,充分利用4核CPU
  • 端口范围: 8000-8005 (800%(process_num)s,process_num从0开始)
  • 进程名: daphne_0, daphne_1, daphne_2, daphne_3, daphne_4, daphne_5
  • 日志文件: 每个进程独立日志文件

2. 部署步骤

2.1 创建日志目录

mkdir -p /project/logs
chown -R www-data:www-data /project/logs

2.2 重新加载Supervisor配置

# 停止现有进程
sudo supervisorctl stop daphne:*

# 重新读取配置
sudo supervisorctl reread

# 更新配置
sudo supervisorctl update

# 启动所有进程
sudo supervisorctl start daphne:*

2.3 验证部署

# 查看进程状态
sudo supervisorctl status

# 预期输出:
# daphne:daphne_0    RUNNING
# daphne:daphne_1    RUNNING  
# daphne:daphne_2    RUNNING
# daphne:daphne_3    RUNNING
# daphne:daphne_4    RUNNING
# daphne:daphne_5    RUNNING

# 检查端口监听
netstat -tlnp | grep daphne
# 应显示 8000, 8001, 8002, 8003, 8004, 8005 端口

3. Nginx负载均衡配置

upstream daphne_backend {
    server 127.0.0.1:8000 weight=1 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8001 weight=1 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8002 weight=1 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8003 weight=1 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8004 weight=1 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8005 weight=1 max_fails=3 fail_timeout=30s;
    keepalive 32;
}

server {
    listen 80;
    server_name your-domain.com;
    
    client_max_body_size 100M;
    client_body_timeout 60s;
    client_header_timeout 60s;
    
    location / {
        proxy_pass http://daphne_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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;
        proxy_connect_timeout 30s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
        proxy_buffering off;
    }
}

4. 系统优化配置

4.1 系统限制优化 /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536
* soft nproc 32768
* hard nproc 32768

4.2 内核参数优化 /etc/sysctl.conf

# 网络优化
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 32768
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_tw_buckets = 400000

# 内存优化(8G内存)
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

应用配置:

sudo sysctl -p

5. 常用管理命令

5.1 进程管理

# 查看所有进程状态
sudo supervisorctl status

# 启动所有daphne进程
sudo supervisorctl start daphne:*

# 停止所有daphne进程
sudo supervisorctl stop daphne:*

# 重启所有daphne进程
sudo supervisorctl restart daphne:*

# 重启单个进程
sudo supervisorctl restart daphne:daphne_0

5.2 日志查看

# 查看实时日志
sudo supervisorctl tail -f daphne:daphne_0

# 查看所有日志文件
ls -la /project/logs/daphne_*.log

# 查看特定进程日志
tail -f /project/logs/daphne_0.log

5.3 故障排查

# 检查端口占用
netstat -tlnp | grep 800

# 检查进程运行情况
ps aux | grep daphne

# 检查防火墙
sudo ufw status

# 测试连接
curl http://localhost:8000/
curl http://localhost:8001/

6. 性能监控

6.1 资源使用监控

# 查看CPU和内存使用
htop

# 查看网络连接
ss -tuln | grep 800

6.2 预期性能指标

  • 并发连接数: 每个进程约1000个连接
  • 内存使用: 每个进程约800MB-1.2GB
  • 总内存使用: 不超过7GB
  • CPU利用率: 充分利用4核CPU

7. 注意事项

  1. 端口冲突: 确保8000-8005端口未被其他服务占用
  2. 日志轮转: 定期清理日志文件,防止磁盘空间不足
  3. 进程监控: 定期检查进程状态,确保所有进程正常运行
  4. 负载均衡: 使用Nginx进行负载均衡,提高可用性
  5. 安全配置: 生产环境建议使用内网IP绑定,通过Nginx对外提供服务

8. 故障处理流程

8.1 进程异常退出

# 查看进程状态
sudo supervisorctl status

# 查看错误日志
sudo supervisorctl tail daphne:daphne_0

# 重启异常进程
sudo supervisorctl restart daphne:daphne_0

8.2 端口占用问题

# 查找占用进程
lsof -i :8000

# 强制杀死进程
kill -9 <PID>

# 重启服务
sudo supervisorctl restart daphne:*

8.3 内存不足

# 查看内存使用
free -h

# 查看进程内存占用
ps aux --sort=-%mem | head -10

# 重启服务释放内存
sudo supervisorctl restart daphne:*

9. 备份与恢复

9.1 配置文件备份

# 备份supervisor配置
cp /etc/supervisor/conf.d/daphne.conf /backup/daphne.conf.bak

# 备份nginx配置
cp /etc/nginx/sites-available/default /backup/nginx.conf.bak

9.2 日志备份

# 压缩并备份日志
tar -czf /backup/daphne_logs_$(date +%Y%m%d).tar.gz /project/logs/daphne_*.log

10. 升级维护

10.1 代码更新流程

# 1. 备份当前代码
cp -r /project/yto_publish /backup/yto_publish_$(date +%Y%m%d)

# 2. 更新代码
git pull origin main

# 3. 重启服务
sudo supervisorctl restart daphne:*

# 4. 验证服务
curl http://localhost:8000/health

10.2 依赖更新

# 更新Python依赖
/project/environment/bin/pip install -r requirements.txt

# 重启服务
sudo supervisorctl restart daphne:*

补充

2.3 完整操作流程

# 1. 修改配置文件后,重新加载配置
supervisorctl reread
supervisorctl update

# 2. 重启相关进程使新环境变量生效
supervisorctl restart daphne:*

# 3. 查看进程状态
supervisorctl status

2.4 重启supervisord本身

# 方法1:优雅关闭
supervisorctl shutdown
supervisord -c /etc/supervisord.conf

# 方法2:强制重启
pkill supervisord
supervisord -c /etc/supervisord.conf

# 方法3:系统服务方式
systemctl restart supervisord
posted @ 2025-08-01 15:04  春水鸿鹄  阅读(46)  评论(0)    收藏  举报