You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:20:47