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,会自动识别虚拟环境的依赖路径。
- 修正pythonpath为正确路径:
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模块,将日志写入文件,方便排查问题。
- 在app.ini中添加uWSGI日志配置:
5. uWSGI多进程与Playwright冲突
- 原因:uWSGI开启5个进程,Playwright同步API在多进程环境下可能出现资源竞争或初始化异常。
- 解决办法:
- 先将app.ini中
processes = 5改为processes = 1,测试单进程是否能正常运行。 - 若单进程正常,可考虑为每个进程单独初始化Playwright,或改用Playwright异步API配合Flask异步支持。
- 先将app.ini中
内容的提问来源于stack exchange,提问作者Farrokh Rostami Kia
相关产品推荐
相关产品推荐

