puppeteer在centos6.x版本的嘗試

寫在前面的話

博客和生活一樣,都是需要用心經營的,我把博客丟掉兩年多,總是對自己講,實在是太忙沒時間寫,可真的嗎?不是這樣,時間還是能夠擠出來的,懶惰纔是根本原因,人一旦變懶,會在方方面面表現出,會慢慢變成一種習慣。2019年堅持鍛鍊一年,效果還算不錯,然後疫情來了,emmm....是時候拿出真正的技術啦!

爲什麼會寫這篇文章,實在是在實踐過程中躺了許多坑,幫助那些還在迷茫途中的小朋友指引下明燈,希望能夠幫到正在看文章的你。先把結論拋給大家,CentOS 6不支持安裝puppeteer。

 =================================== 可愛的分割線 ===================================

本機環境測試,macOS Catalina + node v12.16.1 + npm 6.13.4 安裝puppeteer構建可用的導出pdf服務,沒有問題,完全可用【在導出過程中發現pdf窗口viewport不對情況,可通過設置puppeteer.launch({defaultViewport: null})解決】

我們的重點是什麼?構建導出pdf服務,服務器環境CentOS 6.3 Final版本,不支持連接外網。所以初步方案是通過編寫shell腳本部署,編寫腳本前,需要校驗環境是否可行,是否能夠支持正常的導出pdf文件,所以我們選擇先手動嘗試安裝。

我們漫長虐心的實踐開始了。

1.先和廠內同學溝通,瞭解到CentOS 6不支持安裝puppeteer,具體卡在libxxxx.so包的安裝上,出於對事情的好奇,決定還是踐行一下。

2.下載Linux系統所需要的文件包,地址從哪裏來?可以看下本機mac安裝的node_modules文件中puppeteer代碼。

a.找到xxxx/node_modules/puppeteer/lib/BrowserFetcher.js文件 (當前使用[email protected]版本)

b.linux平臺下載地址

%s/chromium-browser-snapshots/Linux_x64/%d/%s.zip

其中

第一個%s替換爲DEFAULT_DOWNLOAD_HOST的值

%d替換爲版本號(node_modules/puppeteer-core/packages.json中查找)

最後的%s從函數archiveName中獲取,爲'chrome-linux'

整體最後的url爲 https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/722234/chrome-linux.zip

3.把chrome-linux.zip文件傳輸到服務器上(自行處理,我使用的是sz/rz命令)

4.unzip解壓縮,手動存儲到

/node_modules/puppeteer/.local-chromium/linux-722234/

.local-chromium/linux-722234/ 這兩層目錄爲手動創建,722234是版本號,步驟2中的%d值

不同平臺對應的目錄名稱不同,比如mac 就是mac-722234

5.寫一個簡單的測試腳本,如下,命名爲test.js

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.baidu.com');
    await page.screenshot({path: 'example.png'});
    await browser.close();
})();

6.node test,很不順利,會出現如下錯誤

xxxxPromiseRejectionWarning: Error: Failed to launch the browser process!
xxxx/node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux/chrome: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such xxxx

缺少Chrome程序正常運行的共享庫,通過命令查找源

repoquery --nvr --whatprovides libXss.so.1

結果爲:

libXScrnSaver-1.2.0-1.el6

此時,通過yum install libXScrnSaver* 安裝解決。

然後,再次node test,發現還有錯誤,這樣下去會比較煩躁,我們應該從根本上看看Chrome程序運行到底還缺少哪些文件

7.執行如下命令,首先進到Chrome程序目錄

> cd node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux
> ldd chrome | grep not

得到類似於如下內容的結果:

libatk-bridge-2.0.so.0 => not found
libatspi.so.0 => not found
libgtk-3.so.0 => not found
libgdk-3.so.0 => not found

重點來了,查找資料發現libatk-bridge-2.0.so.0在CentOS6.x環境不支持,必須升級到CentOS 7.x版本

原文地址

關鍵內容如圖:

來自官方聲明,翻譯爲人話就是,升級到CentOS7或者使用FF ESR

8.怎麼辦?不使用FF,可以升級CentOS到7.5,那就好辦了

解決方案:使用docker鏡像node 10.x + CentOS 7.5 環境,然後手動安裝chrome-linux,還是需要解決xxxx.so的各種問題,校驗。

成功導出example.png

 

 =================================== 可愛的分割線 ===================================

寫在末尾

前前後後花費幾天時間,包含部署,打鏡像,解決問題,安裝程序,調試環境,測試腳本,寫總結,關鍵這幾天是多餘出來的工作量,這是叫人不爽的地方。編寫puppeteer腳本本身,遇到viewport尺寸問題,pdf怎麼導出部分內容,如何去白邊,加層級,這些屬於工作本身,可以接受。最終掉坑到環境部署上,有些尷尬。

 

爲什麼沒提前發現問題呢?

1.對服務器基礎設備環境能力過於高估判斷;

2.沒有考慮過這個問題;

全文結束,感謝您的耐心閱讀,有什麼問題,留言。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章