使用Supervisor时Celery任务中Selenium无法连接Chrome问题
解决方案
你的问题核心是Supervisor管理的Celery Worker进程缺少图形化运行环境或权限配置,导致Chrome无法正常启动。以下是针对性的解决步骤:
1. 强制启用Chrome无头模式
Supervisor运行的进程默认没有桌面会话,必须让Chrome以无头模式启动。修改任务代码,添加无头参数:
@shared_task(bind=True) def task_one(self): options = Options() # Chrome 96+推荐使用新版无头模式参数 options.add_argument("--headless=new") options.add_argument("--start-maximized") options.add_argument('--no-sandbox') options.add_argument("--disable-dev-shm-usage") # 显式指定Chrome二进制文件路径,避免环境变量查找失败 options.binary_location = '/usr/bin/google-chrome' driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, 20) action = ActionChains(driver) driver.get('https://somewhere.com') # 业务逻辑代码 # 务必关闭driver,避免进程泄漏 driver.quit()
2. 调整Supervisor配置的环境变量与权限
编辑你的Supervisor配置文件(通常位于/etc/supervisor/conf.d/目录下),确保:
- 使用与手动启动Celery时相同的用户(避免权限差异)
- 配置必要的环境变量,确保Chrome能找到依赖
示例配置:
[program:celery_worker] command=/path/to/your/venv/bin/celery -A your_django_project worker --loglevel=info directory=/path/to/your/django/project user=your_login_user # 替换为你手动启动Celery时使用的用户 autostart=true autorestart=true stdout_logfile=/var/log/celery/worker.log stderr_logfile=/var/log/celery/worker_error.log environment=PATH="/path/to/your/venv/bin",DISPLAY=":0"
如果服务器无图形环境,可安装Xvfb模拟虚拟桌面,修改Supervisor启动命令:
command=/usr/bin/Xvfb :0 -screen 0 1024x768x16 & /path/to/your/venv/bin/celery -A your_django_project worker --loglevel=info
3. 添加Chrome稳定性参数
在ChromeOptions中补充以下参数,提升无桌面环境下的启动稳定性:
options.add_argument("--disable-gpu") options.add_argument("--window-size=1920x1080") options.add_argument("--disable-extensions") options.add_argument("--disable-plugins")
4. 验证ChromeDriver与Chrome版本匹配
运行以下命令检查版本是否一致:
chromedriver --version google-chrome --version
若版本不匹配,下载对应版本的ChromeDriver替换即可。
5. 检查Chrome启动权限
切换到Supervisor配置的用户,手动尝试启动Chrome:
su your_login_user google-chrome --headless=new --no-sandbox --disable-dev-shm-usage https://somewhere.com
若启动失败,排查该用户是否有Chrome执行权限,或缺失依赖库(如libnss3、libxss1等)。
内容的提问来源于stack exchange,提问作者Saeed Ramezani
相关产品推荐
相关产品推荐

