본문 바로가기
개발(Development)/JS(자바스크립트)

node.js puppeteer 리눅스VM 실행 불가 해결 방법(CentOS, 우분투): Failed to launch the browser process

by 카레유 2021. 1. 24.

AWS, GCP, Azure 와 같은 클라우드 VM환경에서 puppeteer 패키지(모듈)을 사용하면 에러가 발생하는 경우가 많다.

(내 컴퓨터 개발환경에선 잘 되는데, 우분투나 CentOS 환경의 클라우드에 배포하면 안 될 가능성이 높다.)

 

원인과 해결책을 정리해본다.

 

# 해결책1: 기본 모듈 설치

1. puppeteer 설치

: sudo npm install puppeteer

(참고) puppeteer를 설치하면 자동으로 Chromium 브라우저가 다운로드 된다.

 

2. puppeteer-core

: sudo npm install puppeteer-core

 

 

그러나, 설치한 이후에도 아래와 같은 에러 메시지가 뜨는 경우가 많을 것이다.

Failed to launch the browser process! 

error while loading shared libraries: cannot open shared object file: No such file or directory

(node:7460) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
/dev/node_modules/puppeteer/.local-chromium/linux-818858/chrome-linux/chrome: error while 
loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory
TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md
    at onClose (/dev/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:193:20
)
    at Interface.<anonymous> (/dev/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRu
nner.js:183:68)
    at Interface.emit (events.js:327:22)
    at Interface.close (readline.js:424:8)
    at Socket.onend (readline.js:202:10)
    at Socket.emit (events.js:327:22)
    at endReadableNT (internal/streams/readable.js:1327:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:7460) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing
 inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). 
To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see
 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:7460) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejec
tions that are not handled will terminate the Node.js process with a non-zero exit code.

 

# 원인

브라우저 구동에 실패하는 이유는!

puppeteer 구동에 필요한 것들이 충분히 설치되지 않았기 때문일 가능성이 가장 높다.

 

puppeteer는 내부적으로 (눈에 보이진 않지만) 실제 GUI 환경의 브라우저(Chromium)를 구동해서, 웹페지에 접속하고 클릭도 수행하는 패키지다.(headless browser라고 표현한다)

 

근데 node.js를 구동한 환경에 GUI브라우저를 구동할 라이브러리가 설치되어 있지 않다면?

 

Yes!

 

puppeteer의 브라우저를 실행될수 없게 된다!!!

 

다시 에러 로그를 보면, 무슨말인지 알 수 있을 것이다.

Error: Failed to launch the browser process!

error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory

 

"브라우저를 실행하는데 실패했어요~

왜냐하면 브라우저를 실행하는데 필요한 라이브러리를 찾을 수가 없기 때문이에요!"

 

해결책은?

 

필요한 라이브러리를 설치해주면 된다.

 

# 해결책 2: 필요 라이브러리 설치

: 필요한 라이브러리 종류는 아래와 같다. (OS계열에 따라 다르다)

 

1. 데비안/우분투(ubuntu)

설치 명령어: sudo apt-get install 패키지명

ca-certificates
fonts-liberation
libappindicator3-1
libasound2
libatk-bridge2.0-0
libatk1.0-0
libc6
libcairo2
libcups2
libdbus-1-3
libexpat1
libfontconfig1
libgbm1
libgcc1
libglib2.0-0
libgtk-3-0
libnspr4
libnss3
libpango-1.0-0
libpangocairo-1.0-0
libstdc++6
libx11-6
libx11-xcb1
libxcb1
libxcomposite1
libxcursor1
libxdamage1
libxext6
libxfixes3
libxi6
libxrandr2
libxrender1
libxss1
libxtst6
lsb-release
wget
xdg-utils

 

2. CentOS

설치 명령어: sudo yum install  패키지명

alsa-lib.x86_64
atk.x86_64
cups-libs.x86_64
GConf2.x86_64
gtk3.x86_64
ipa-gothic-fonts
libXcomposite.x86_64
libXcursor.x86_64
libXdamage.x86_64
libXext.x86_64
libXi.x86_64
libXrandr.x86_64
libXScrnSaver.x86_64
libXtst.x86_64
pango.x86_64
xorg-x11-fonts-100dpi
xorg-x11-fonts-75dpi
xorg-x11-fonts-cyrillic
xorg-x11-fonts-misc
xorg-x11-fonts-Type1
xorg-x11-utils

 

혹시 제가 설치한 명령어가 궁금하신 분들을 위해...(Ubuntu 18.04.5 LTS)

sudo apt-get install gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget libgbm1

 

 

해결 완료!!!

 

가... 아닌 경우가 있을 수 있다.

 

아마 이런 에러 로그가 떴을 가능성이 있다.

Error: Failed to launch the browser process! Running as root without --no-sandbox is not supported.

Error: Failed to launch the browser process! Running as root without --no-sandbox is not supported

 

# 해결책 3: sandbox 플래그 설정

원인 : 크롬은 샌드박스를 통해 웹콘텐츠의 신뢰성을 검사(?)하는데, 이 때문에 리눅스 환경에서 puppeteer 사용이 안 될 때가 있다.

해결: 일차적으로는 아래와 같이 sandbox관련 플래그를 설정해주면 된다..(node.js 자바스크립트 코드)

const browser = await puppeteer.launch({
	args: ['--no-sandbox', '--disable-setuid-sandbox']
});

 

이 부분에 대한 상세 설정은 아래 문서를 참조하면 좋을듯 하다.

github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#setting-up-chrome-linux-sandbox

 

 

이제 진짜 해결 완료!!!

 

이제 리눅스 환경의 VM에서도 puppeeteer를 사용할 수 있게 되었을 것이다.

 

혹시나 node.js 14.0.0 버전을 사용하고 있다면,

버그로 인해 puppeteer사용이 불가하다고 하니, 14.1.0 이상으로 업그레이드 해야 한다.

 

그리고 공식문서에 따르면 라이브러리 설치 후, 아래 명령어도 실행해주는게 좋다고 한다.

데비안(우분투) : sudo apt-get update

Cent OS : sudo yum update nss -y

 

이 글이 도움이 되는 분들이 있으면 좋겠다.


혹시 애플 실리콘칩이 탑재된 M1 맥북에서 Puppeteer / Chromium 실행이 안된다면, 아래 글을 참고해보자.

[Puppeteer] M1 맥북 Chromium Error: Failed to launch the browser process 해결 방법

 

 

댓글