У меня есть скрипт узла, который преобразует веб-страницу в документ PDF. Пользователь вводит некоторый контент, а PHP создает страницу HTML, которая затем используется в скрипте узла (который запускает Puppeteer, используя слегка измененную версию пример сценария) преобразовать его в PDF.
Но когда я Exec в PHP команда для запуска скрипта узла завершается с ошибкой:
(node:14832) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome!
[0424/165455.239499:ERROR:icu_util.cc(133)] Invalid file descriptor to ICU data received.
[0424/165455.239717:FATAL:content_main_delegate.cc(53)] Check failed: false.
#0 0x55f27f255b0c base::debug::StackTrace::StackTrace()
#1 0x55f27f26e780 logging::LogMessage::~LogMessage()
#2 0x55f27d5f7d23 content::ContentMainDelegate::TerminateForFatalInitializationError()
#3 0x55f27ef90deb content::ContentMainRunnerImpl::Initialize()
#4 0x55f27ef9ab72 service_manager::Main()
#5 0x55f27ef8ff14 content::ContentMain()
#6 0x55f28309f9b9 headless::(anonymous namespace)::RunContentMain()
#7 0x55f28309fa42 headless::HeadlessBrowserMain()
#8 0x55f27ef97f9d headless::HeadlessShellMain()
#9 0x55f27d5f61ac ChromeMain
#10 0x7efcaad45c05 __libc_start_main
#11 0x55f27d5f602a _start
PHP работает с apache
пользователь. Однако, если я запускаю тот же скрипт со своим пользователем, он работает отлично. Когда я выполняю в терминале, используя su - apache -c 'node ...'
это снова выдает ошибку, описанную выше.
Что является причиной ошибки? Что-то связано с разрешениями пользователя apache? Я следовал всем инструкциям по устранению неполадок, но в данный момент мне не повезло.
Кажется, проблема связана с разрешениями файловой системы для хрома по умолчанию, используемого кукловодом:
используя ACL (моя группа nginx www-data
поменяй на свой на apache):
sudo setfacl -R -m g:www-data:rX node_modules/puppeteer/.local-chromium/
а также
sudo setfacl -dR -m g:www-data:rX node_modules/puppeteer/.local-chromium/
после установки разрешений ошибка ушла.
Я использовал пакетную версию Chromium, которая поставляется вместе с библиотекой Puppeteer (как установлено с помощью npm install puppeteer
).
Вместо того, чтобы использовать эту версию, я попытался установить Chromium для всей системы и дать сценарию узла путь к общесистемной установке Chromium. Это наконец работает, эта версия не имеет такой странной проблемы!
Чтобы выполнить Puppeteer, используя другой исполняемый файл:
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'],
headless: true,
executablePath: '/usr/bin/chromium-browser'
});
Я буду искать другие ответы, если есть другое решение вместо установки Chromium в системе.