Gunicorn+Nginx部署Flask时SeleniumBase Driver初始化失败
Gunicorn+Nginx部署Flask时,SeleniumBase UC模式Chrome无法连接的解决方案
问题核心诊断
这个问题的本质是Gunicorn多进程环境与SeleniumBase UC模式的端口绑定冲突,再加上生产环境下的权限、环境变量传递问题:
- Gunicorn默认多worker模式下,每个worker都会尝试启动Chrome并绑定9222端口,导致端口占用冲突,触发
cannot connect to chrome at 127.0.0.1:9222错误 - 运行Gunicorn的系统用户(如
www-data)权限不足,无法访问Chrome或Xvfb资源 - 生产环境中环境变量未正确传递,导致Chrome找不到必要的依赖路径
具体解决步骤
1. 调整Gunicorn配置,避免端口冲突
方案一:单Worker模式(适合低并发场景)
修改Gunicorn启动命令,强制使用1个worker,避免多进程抢占端口:
gunicorn -w 1 --threads 4 app:app
如果使用systemd管理Gunicorn,更新gunicorn.service的ExecStart行:
[Service] ExecStart=/usr/local/bin/gunicorn -w 1 --threads 4 app:app
方案二:动态分配UC端口(支持多Worker)
在SeleniumBase初始化时,根据Gunicorn的Worker ID动态分配不同的调试端口,避免冲突:
import os from seleniumbase import SB @app.route("/fetch", methods=["POST"]) def fetch_title(): data = request.json review_page_url = data.get('query') try: # 根据Worker ID分配端口,默认从9222开始 worker_id = int(os.environ.get('GUNICORN_WORKER_ID', 0)) uc_port = 9222 + worker_id with SB( uc=True, headless2=True, no_sandbox=True, disable_dev_shm_usage=True, xvfb=True, uc_port=uc_port ) as sb: sb.driver.get(review_page_url) title = sb.driver.title return {"title": title} except Exception as e: return {"error": str(e)}, 500
2. 确保Gunicorn的权限与环境变量正确
在gunicorn.service中添加必要的环境变量与权限配置:
[Service] User=www-data Group=www-data Environment="PATH=/usr/bin:/usr/local/bin" Environment="DISPLAY=:10" # 与Xvfb的显示编号对应 Environment="GUNICORN_WORKER_ID=%n" # 传递Worker ID给进程 WorkingDirectory=/path/to/your/flask/app ExecStart=/usr/local/bin/gunicorn -w 2 --threads 4 app:app Restart=always
同时提前启动Xvfb服务(或配置为开机自启):
# 临时启动 sudo Xvfb :10 -ac -screen 0 1280x1024x24 & # 配置为systemd服务(持久化) echo "[Unit] Description=Xvfb Virtual Display After=network.target [Service] ExecStart=/usr/bin/Xvfb :10 -ac -screen 0 1280x1024x24 Restart=always [Install] WantedBy=multi-user.target" | sudo tee /etc/systemd/system/xvfb.service sudo systemctl daemon-reload sudo systemctl enable --now xvfb.service
3. 验证Chrome的可用性
切换到Gunicorn运行的用户(如www-data),手动测试Chrome是否能正常启动:
sudo -u www-data google-chrome --headless=new --no-sandbox --disable-dev-shm-usage https://www.zillow.com
如果出现错误,检查Chrome是否安装完整,或是否有依赖缺失(如libnss3、libxss1等)。
验证方法
- 重启相关服务:
sudo systemctl restart xvfb sudo systemctl restart gunicorn sudo systemctl restart nginx
- 发送POST请求测试
/fetch端点,确认能正常返回页面标题。
内容的提问来源于stack exchange,提问作者BHAUTIK A. MANGUKIYA
相关产品推荐
相关产品推荐

