linux 2013.10.16 02:03

Taking a web page's screenshot on CLI only environment

 모종(=알바)의 이유로, 백엔드 단에서 특정 URL을 받으면, 그 URL에 해당하는 웹 페이지의 스크린 샷을 찍어서 돌려줘야 하는 작업을 하게 되었다. 처음엔 불가능할 줄 알았는데(+그냥 보라고! 왜 이걸 서버를 시켜!), 언제나 방법은 있더라. 

 wkhtmltoimage가 바로 그것이다. 이 프로그램은 CLI 환경에서 특정 URL을 jpg나 png로 저장할 수 있도록 해준다(자매품으로 wkhtmltopdf 같은 것도 있다). X Server를 통해 웹 페이지를 Graphically Rendering한 다음, 이에 대한 스크린샷을 만드는 것이다(라고 삽질 결과 예상해본다). 그러나 순수한 CLI 환경에선 X Server 같은걸 키우질 않는다. 이걸 어찌해야 할까? 오늘 이 포스트에서 정리할 내용은 이에 대한 해답을 찾는 삽질 과정이다.

 갑님이 제공해주신 서버가 CentOS인 관계로 오늘 설명은 CentOS 6.2 기준으로 한다. 난 우분투가 좋은데......

Part 1. Install wkhtmltoimage

먼저 wkhtmltoimage를 설치한다. yum은 아니고, wget으로 tarball을 받는다.

[root@xx html]# wget http://wkhtmltopdf.googlecode.com/files/wkhtmltoimage-0.11.0_rc1-static-i386.tar.bz2

[root@xx html]# tar xvf wkhtmltoimage-0.11.0_rc1-static-i386.tar.bz2

의외로, 압축을 푼 결과는 컴파일해야하는 소스가 아닌 바이너리이다. 편하네(물론 제대로 실행이 안 되면 안 편하겠지만). 그 다음 wkhtmltoimage를 /usr/bin으로 옮겨준다(취향). 권한 설정도 잊지말고 하자.

[root@xx wkhtmltoimage-0.11.0_rc1-static-i386]# mv wkhtmltoimage-i386 /usr/bin/wkhtmltoimage

[root@xx bin]# chmod a+x /usr/bin/wkhtmltoimage

그리고 사용법 대로 한번 써본다.

[root@xx html]# wkhtmltoimage www.google.co.kr google.jpg

Loading page (1/2)

Rendering (2/2)                                                    

QPixmap: Cannot create a QPixmap when no GUI is being used   ] 25%

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

Segmentation fault

 wow... segfault... 물론, 이래서 되면 삽질이라고 안 했겠지. wkhtmltoimage는 X 환경을 필요로 하는 것이었다. 정말 CLI만 되는 환경에서 그래픽 렌더링이 될줄 믿고있던 내가 바보지.

Part 2. Install Xvfb

 그런데, Only CLI 환경에서 X Window를 깔아서 풀 그래픽을 보는 건 영 미덥지 않다. 그리고 역시 나 말고도 이런 생각을 한 사람은 있었다. 그래서 우린 X Window 대신 CLI 환경에서 X Window Desktop을 가상으로 만들어주는 Xvfb라는 것을 설치하기로 한다.

[root@xx html]# yum -y install Xvfb (대소문자 구분 주의!)

그리고 역시 구글링을 통해 Xvfb의 사용법을 알아내서 한번 가상의 X Window를 만들어 본다.

[root@xx html]# Xvfb :1 -screen 0 1024x768x24

대충 '1번 (가상)Display에 1024x768, 24bit짜리 가상 스크린을 만든다' 라는 뜻이다.

[root@xx html]# Xvfb :1 -screen 0 1024x768x24

Could not init font path element unix/:7100, removing from list!

역시 공짜는 없지. font path를 보아 하니 X Font Server 관련 문제임을 유추할 수 있다. X Window 환경에 대해 자세히 파본 적은 없지만 언뜻 어깨너머 본 바로는 X Window의 구성요소 중엔 폰트 렌더링을 담당하는 Font Server가 있단 소릴 들은 적이 있어서.

Part 3. Install & Run xfs

 문답무용

[root@xx html]# yum -y install xfs

xfs가 설치되었다. xfs 구동

[root@xx html]# xfs&

[1] 12116

[root@xx html]# xfs notice: ignoring font path element /usr/share/X11/fonts/100dpi:unscaled (unreadable)

xfs notice: ignoring font path element /usr/share/X11/fonts/Type1 (unreadable)

xfs notice: ignoring font path element /usr/share/fonts/default/Type1 (unreadable)

뭐라 잡설이 많지만, 어쨌든 구동 된다. 정말? 하는 생각이 들면 ps aux | grep xfs

Part 4. Ace!

 이제 웬만한 건 대충 해결 본 것 같으니, 다시 Xvfb를 구동한다.

[root@xx html]# Xvfb :1 -screen 0 1024x768x24&

[2] 12118

잡설 없이 돌아간다. 그리고 그동안 삽질하며 알아낸 wkhtmltoimage 옵션을 지정해서 다시 써본다.

[root@xx html]# wkhtmltoimage --use-xserver www.google.com google.jpg

wkhtmltoimage: cannot connect to X server

???? X server 켰잖아. 스크린 만들었잖아. 근데 왜?? 하면서 삽질하는건 내 몫이고, 이거 보는 사람들은 내 삽질의 결과를 이용하겠지

[root@xx html]# export DISPLAY=:1

--use-xserver를 할 때, 환경 변수의 DISPLAY 변수를 보는 것 같다. 추가해주자.

[root@xx html]# wkhtmltoimage --use-xserver www.google.com google.jpg

Loading page (1/2)

Rendering (2/2)                                                    

Done

넵. 끝

Part 5. Result, Future Research

한글 폰트가 깨져있는 구글 스크린샷 보내드렸습니다...

 xfs에 한글폰트를 어떻게 조지면 해결될 것 같지만, 그건 귀찮으니 알아서 방법을 찾아보시길.. 사실 필자도 아직 방법을 안 찾아봤다. 귀찮아서.. 어쨌든 되는걸 확인한 다음이면 그날은 흥미가 확 떨어진다. php등에서 응용하려면 exec()를 써주면서 귀찮은 권한문제에 대해 생각해보자. 여기까지.

Part 6. 소감

재밌었다. 신기했다.

Appendix. 한글 폰트 설치

 해결 방법은 의외로 간단했다.

[root@xx html]# yum -y install fonts-korean

[root@xx html]# fc-cache

[root@xx html]# yum groupinstall -y korean-support -x xorg-x11-server-Xorg

다시 스크린샷을 찍어보면 한글이 잘 표시될 것이다.

신고

'linux' 카테고리의 다른 글

Linux VFS kernel(1)  (0) 2014.12.08
Ports below 1024 can be opened only by root.  (0) 2014.03.24
Taking a web page's screenshot on CLI only environment  (0) 2013.10.16
[Ubuntu] vsftpd umask  (0) 2013.07.26
Tunneling SSH over HTTP(S)  (0) 2012.12.10
Setting Ubuntu Server 12.04 on VMWare  (0) 2012.12.07


티스토리 툴바