본문 바로가기

개발/PHP 라라벨

Centos 7 에서 browsershot 사용하기

browsershot 은 html 을 pdf 로 저장하기 위한 라이브러리이다.

그런데 왜 라라벨에서 browsershot 사용하기가 아니라 centos 에서 사용하기라고 제목을 붙였냐면 mac 에서는 매우 간단한 설정만 거치면 사용이 가능한 것에 비해 리눅스에서는 뭐가 안되도 참 잘 안됐다. ㅠ_ㅠ

 

그래서 다음에 또 리눅스에서 laravel + browsershot 을 사용할 일이 생길까봐 기록해 둔다.

 


  • 파일을 write 하는데 내가 설정한 경로에 안쓰여질때

Browsershot은 렌더링된 html 내용을 파일로 쓰고 pdf 로 변환하는 방식으로 구현되어 있었다.

그런데 html 을 파일로 쓸때부터 문제가 생겼다.

Browsershot.php 파일 내에서 file_put_contents 를 하는데 /tmp/systemd-private-xxx 폴더내에 써지는 것이다. (실제 내가 설정한 path 는 /tmp)

이건 아파치의 보안을 위한 것으로 보인다.

 

설정을 바꿔주면 내가 원하는 위치에 파일을 쓸 수 있다.

 

vim /usr/lib/systemd/system/httpd.service

PrivateTmp=false 변경

systemctl daemon-reload

apachectl restart

 


  • laravel 에서 Browsershot 호출
$pdfStream = Browsershot::html($html)
    ->setOption('landscape', false)
    ->setIncludePath('$PATH:/usr/local/bin:/opt/homebrew/bin'.':/usr/local/lib/node/bin')
    ->setOption('timeout', 200000)  // Puppeteer의 타임아웃 설정
    ->setOption('args', ['--no-sandbox', '--disable-setuid-sandbox'])  // Chrome 실행 옵션 추가
    ->setOption('debug', true)
    ->pdf();

ssh 에서 아파치 계정으로 browsershot 실행

sudo -u apache -s

$PATH:/usr/local/bin:/opt/homebrew/bin:/usr/local/lib/node/bin:/root/.nvm/versions/node/v17.9.0/bin/ NODE_PATH=`npm root -g` node '/web/pharmacist/vendor/spatie/browsershot/src/../bin/browser.cjs' '{"url":"file:\/\/\/tmp\/1200951517-0172934001705629309\/index.html","action":"pdf","options":{"args":["--no-sandbox","--disable-setuid-sandbox"],"viewport":{"width":800,"height":600},"displayHeaderFooter":false,"landscape":false,"timeout":200000,"debug":true}}'

 

다음과 같은 오류 발생

Error: Could not find Chrome (ver. 119.0.6045.105). This can occur if either
 1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome`) or
 2. your cache path is incorrectly configured (which is: /usr/share/httpd/.cache/puppeteer).
For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.
    at ChromeLauncher.resolveExecutablePath (/usr/local/lib/node/lib/node_modules/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:278:27)
    at ChromeLauncher.executablePath (/usr/local/lib/node/lib/node_modules/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js:209:25)
    at ChromeLauncher.computeLaunchArguments (/usr/local/lib/node/lib/node_modules/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js:103:37)
    at async ChromeLauncher.launch (/usr/local/lib/node/lib/node_modules/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:69:28)
    at async callChrome (/web/pharmacist/vendor/spatie/browsershot/bin/browser.cjs:91:23)
{"requestsList":[],"consoleMessages":[],"failedRequests":[],"redirectHistory":[],"pageErrors":[],"exception":"Error: Could not find Chrome (ver. 119.0.6045.105). This can occur if either\n 1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome`) or\n 2. your cache path is incorrectly configured (which is: /usr/share/httpd/.cache/puppeteer).\nFor (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration."}

 

해결방법 (올바른지는 모르겠다.)

 

chrome 설치

PATH=$PATH:/usr/local/lib/node/bin /usr/local/lib/node/bin/npx  puppeteer browsers install chrome

 

폴더 생성

mkdir /usr/share/httpd/.cache/puppeteer

chown -R apache:apache .cache/

 

pdf 생성이 잘된다.

 

생각보다 오래 걸릴 수도 있을 거 같아서 pdf 생성은 큐로 처리해야 할거 같다.