寫在前面的話
博客和生活一樣,都是需要用心經營的,我把博客丟掉兩年多,總是對自己講,實在是太忙沒時間寫,可真的嗎?不是這樣,時間還是能夠擠出來的,懶惰纔是根本原因,人一旦變懶,會在方方面面表現出,會慢慢變成一種習慣。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.沒有考慮過這個問題;
全文結束,感謝您的耐心閱讀,有什麼問題,留言。