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

Ubuntu下Flask应用systemctl运行时Playwright路由无响应排查

问题描述

服务器运行Ubuntu 22.04.1 LTS系统,基于Python 3.10的Flask应用在激活虚拟环境后通过WSGI运行正常,但关联Playwright的路由无法通过systemctl服务启动,无任何报错且无响应。


Playwright路由函数代码

#function that runs inside playwright route
try:
    from playwright.sync_api import sync_playwright
    import sys
    print('\n'.join(sys.path))

    with sync_playwright() as p:
        url = "https://www.wikipedia.org/"
        browser = p.chromium.launch(headless=True)
        Logger(f"opening {url} ...").info()
        context = browser.new_context()

        # Open new page
        page = context.new_page()
        page.goto(url)
        Logger(page.title(), 'is the title').log()

except BaseException as error:
    print('An exception occurred: {}'.format(error))

函数控制台日志

函数控制台日志

systemctl配置

[Unit]
Description=uWSGI instance to serve foo
After=network.target

[Service]
User=boo
Group=www-data
WorkingDirectory=/home/boo/foo
Environment="PATH=/home/boo/foo/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ExecStart=/home/boo/foo/bin/uwsgi --ini app.ini

[Install]
WantedBy=multi-user.target

app.ini配置

[uwsgi]
module = wsgi:app

master = true
processes = 5

pythonpath = /home/foo/boo/lib/python3.10/site-packages

socket = api-server.sock
chmod-socket = 660
vacuum = true

die-on-term = true

已安装依赖列表

attrs==22.1.0
certifi==2022.12.7
charset-normalizer==2.1.1
click==8.1.3
cssselect==1.2.0
exceptiongroup==1.0.4
Flask==2.2.2
greenlet==2.0.1
idna==3.4
iniconfig==1.1.1
itsdangerous==2.1.2
Jinja2==3.1.2
lxml==4.9.1
MarkupSafe==2.1.1
packaging==22.0
parsel==1.7.0
playwright==1.28.0
pluggy==1.0.0
pyee==9.0.4
pytest==7.2.0
requests==2.28.1
tomli==2.0.1
typing_extensions==4.4.0
urllib3==1.26.13
uWSGI==2.0.21
w3lib==2.1.1
Werkzeug==2.2.2

可能的问题原因及解决办法

1. Playwright浏览器依赖未安装或权限不足

  • 原因:手动激活虚拟环境运行时,Playwright会自动处理浏览器二进制文件下载,但systemctl以boo用户运行时,可能未在该用户环境下安装浏览器,或用户无权限访问二进制文件。
  • 解决办法:
    • 切换到boo用户,激活虚拟环境后执行:playwright install chromium,确保浏览器二进制文件安装到该用户的虚拟环境路径中。
    • 检查浏览器二进制文件所在目录权限,确保boo用户拥有读、执行权限。

2. uWSGI的pythonpath配置错误

  • 原因:app.ini中pythonpath = /home/foo/boo/lib/python3.10/site-packages路径与实际虚拟环境路径不符(systemctl配置的WorkingDirectory为/home/boo/foo,虚拟环境site-packages应在该目录下)。
  • 解决办法:
    • 修正pythonpath为正确路径:/home/boo/foo/lib/python3.10/site-packages。
    • 或直接删除pythonpath配置,因为ExecStart已调用虚拟环境下的uwsgi,会自动识别虚拟环境的依赖路径。

3. 无头浏览器缺少系统级依赖

  • 原因:Ubuntu下运行Chromium无头模式需要特定系统依赖包,手动运行时可能已安装,但systemctl环境下未满足依赖。
  • 解决办法:
    • 安装所需系统依赖:
      sudo apt install libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libasound2 libpangocairo-1.0-0
      

4. 日志未捕获导致无报错信息

  • 原因:代码中的print和自定义Logger输出在uWSGI的systemctl环境下不会显示到控制台,无法获取实际报错内容。
  • 解决办法:
    • 在app.ini中添加uWSGI日志配置:
      logto = /var/log/uwsgi/foo.log
      
    • 创建日志目录并设置权限:
      sudo mkdir -p /var/log/uwsgi && sudo chown boo:www-data /var/log/uwsgi
      
    • 替换代码中的print为标准logging模块,将日志写入文件,方便排查问题。

5. uWSGI多进程与Playwright冲突

  • 原因:uWSGI开启5个进程,Playwright同步API在多进程环境下可能出现资源竞争或初始化异常。
  • 解决办法:
    • 先将app.ini中processes = 5改为processes = 1,测试单进程是否能正常运行。
    • 若单进程正常,可考虑为每个进程单独初始化Playwright,或改用Playwright异步API配合Flask异步支持。

内容的提问来源于stack exchange,提问作者Farrokh Rostami Kia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:25:10