Nginx+PHP环境下Selenium脚本仅命令行可用,浏览器调用失败求助
解决Nginx+PHP环境下Selenium脚本仅命令行可运行的问题
核心原因
命令行执行脚本用的是当前用户的权限和环境变量,而Nginx/PHP-FPM运行时依赖**www-data(或nginx、apache)**这类受限系统用户,权限不足、环境变量缺失会导致Selenium无法正常启动Chrome。
排查与解决步骤
1. 先捕获脚本错误信息
当前PHP代码没有捕获Python脚本的错误输出,修改exec.php把错误重定向到标准输出,方便定位问题:
$selenium = 'python3 /var/www/html/selenium/test.py 2>&1'; echo shell_exec($selenium);
重新通过浏览器访问页面,就能看到具体的错误提示(比如找不到Chrome、权限不足等)。
2. 调整Python脚本的Chrome启动参数
给ChromeOptions补充适配受限用户环境的必要参数,修改test.py:
#!/usr/bin/env python3 from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--no-sandbox') # 非特权用户必须关闭沙箱模式 options.add_argument('--disable-dev-shm-usage') # 解决/dev/shm临时空间不足问题 options.binary_location = '/usr/bin/google-chrome' # 替换为你的Chrome实际路径(用`which google-chrome`命令查看) # 若chromedriver不在系统PATH中,指定其绝对路径 driver = webdriver.Chrome(executable_path='/usr/bin/chromedriver', options=options) driver.get('http://localhost/info.php') print(driver.title) driver.quit()
3. 修复文件与目录权限
确保PHP运行用户能访问脚本和Chrome相关资源:
# 给Python脚本添加执行权限 chmod +x /var/www/html/selenium/test.py # 递归设置脚本目录的所属用户为www-data chown -R www-data:www-data /var/www/html/selenium/ # 确保Chrome二进制文件可执行 chmod +x /usr/bin/google-chrome
4. 验证受限用户环境
切换到www-data用户手动执行脚本,复现浏览器访问时的运行环境:
# 切换到www-data用户(若提示shell不存在,指定bash) su -s /bin/bash www-data # 执行Python脚本 python3 /var/www/html/selenium/test.py
如果这里出现报错,就是环境配置问题,根据错误提示进一步调整(比如安装缺失依赖、补充环境变量等)。
内容的提问来源于stack exchange,提问作者Lyov
相关产品推荐
相关产品推荐

