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

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等)。


验证方法

  1. 重启相关服务:
sudo systemctl restart xvfb
sudo systemctl restart gunicorn
sudo systemctl restart nginx
  1. 发送POST请求测试/fetch端点,确认能正常返回页面标题。

内容的提问来源于stack exchange,提问作者BHAUTIK A. MANGUKIYA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:52:18