在DigitalOcean部署FastAPI后,Python RQ Worker启动失败求助
在DigitalOcean部署RQ Worker时执行
worker.work()崩溃的排查与解决方案 可能的原因及对应解决方法
1. 进程管理方式错误
你大概率是把RQ Worker和FastAPI放在同一个进程中启动了。worker.work()是阻塞式调用,会占用主进程,导致FastAPI无法处理请求,甚至被DigitalOcean的平台监控判定为异常进程而强制重启。
- 解决方法:将Worker和FastAPI拆分为两个独立的进程/服务:
- 如果用DigitalOcean App Platform:添加一个单独的Worker组件,专门运行RQ Worker的启动命令;
- 如果用Droplet:用
systemd或supervisor分别管理FastAPI和Worker进程,确保两者独立运行。
2. Redis连接配置缺失
虽然FastAPI能连接Redis,但Worker可能因为SSL配置或网络权限问题连接失败:
- DigitalOcean Redis默认要求SSL连接,你的代码里可能没显式开启SSL,导致Worker连接时出错崩溃。
- 解决方法:修改Redis连接代码,添加SSL参数:
conn = redis.Redis.from_url(url=REDIS_URL, ssl=True) - 额外检查:确认Worker所在服务的网络能访问Redis的私有IP(如果用了DigitalOcean Redis的私有网络),防火墙规则是否允许Redis端口(默认6379)的访问。
3. 依赖环境不一致
本地环境有爬虫所需的全部依赖,但服务器上缺失部分包,Worker执行任务时触发异常导致崩溃。
- 解决方法:
- 确保
requirements.txt包含所有依赖(包括爬虫用到的requests、selenium等); - 在服务器上手动运行Worker启动命令,查看具体报错(比如
ImportError),补充缺失的依赖。
- 确保
4. 资源被耗尽
DigitalOcean基础实例的内存/CPU有限,爬虫任务占用资源过高,导致Worker进程被系统的OOM Killer强制杀死。
- 排查方法:查看服务器系统日志(比如
dmesg命令)或DigitalOcean监控面板,确认是否有内存耗尽的记录; - 解决方法:升级实例规格,或优化爬虫代码减少资源占用(比如限制并发数、关闭浏览器不必要的功能)。
关于其他方案的补充说明
- FastAPI的
BackgroundTask确实仅适用于轻量短任务,进程重启或回收时任务会中断,不适合爬虫这类长时间任务,选择RQ/Celery是正确的方向。 - 关于Celery的顾虑:只要解决了上述进程分离、Redis连接、依赖、资源问题,Celery也能正常运行,它的功能更完善,适合复杂任务调度场景,不会出现和RQ相同的基础问题。
示例Worker启动代码
单独创建worker.py文件:
import os import redis from rq import Worker, Queue, Connection listen = ['high', 'default', 'low'] REDIS_URL = os.getenv('REDIS_URL') if __name__ == '__main__': with Connection(redis.from_url(REDIS_URL, ssl=True)): worker = Worker(map(Queue, listen)) worker.work()
启动命令:python worker.py,在DigitalOcean平台中单独配置这个命令作为Worker组件的启动指令。
内容的提问来源于stack exchange,提问作者leftandright04
相关产品推荐
相关产品推荐

