hexo搭建個人部落格心得

愛在南信發表於2019-02-20

什麼是hexo?

hexo是基於node.js做的一個靜態檔案生成工具。通過hexo可以將我們寫好的markdown檔案,生成視覺化的html頁面。對於程式設計師來說,寫技術部落格不需要花裡胡哨的排版,簡潔大方。詳情可以檢視github: https://github.com/hexojs/hexo

搭建過程

1.  安裝node.js執行環境
  這個可以自行百度,網上教程一堆。我是基於docker容器搭建的,不懂docker是什麼? 檢視我另外一篇文章,
  通俗易懂跟你說明白.地址: https://mojun.me/2016/11/08/6311f63b1e68870222ef526f2bda94f8/

  上dockerhub把node映象pull下來就行了. node分為很多版本,我使用基於alpine構建的,比較小巧實用,
  麻雀雖小五臟俱全,完全能應付這個部落格。

# 拉映象
docker pull node:lts-alpine

# 執行容器 掛載目錄 對映埠
docker run -it -v /home/hexo:/home/hexo -p 4000:4000 --name hexo-blog node:lts-alpine

# 進入容器

docker exec -it hexo-blog /bin/sh

#在/home/hexo目錄下:

npm install -g hexo-cli

#初始化hexo:

hexo init blog

# 啟動 服務

hexo s        # 此時就可以通過4000埠訪問了  

# 生成靜態檔案

hexo g -d     # 此時生成一個public目錄,把public目錄通過nginx/apache配置一下即可訪問

整體的流程還是挺簡單的。切換主題 等配置 網上有許多詳細教程,這裡就不提了。提一些在途中遇到的問題

遇到的坑

在搭建完畢後我想通過webhook鉤子,執行hexo s -g的這麼一個過程,能夠讓我新寫的文章重新生成出來,而不是每次手動去執行。webhook鉤子就是git倉庫(如github 碼雲)提供的一個功能,你設定git的某個"動作"(如當push的時候,當打tag的時候等等),會去呼叫你提供的一個公網能訪問http介面,從而實現你自己想要在這些動作之後的一些操作。

我採用nginx+php去做一個簡單介面,實現的功能內容如下:


# 1. 進入專案目錄,拉去最新程式碼

cd /home/hexo && git pull 

# 2. npm更新,防止你在push新的程式碼中新增依賴包

npm install

# 3. 生成靜態檔案

 hexo g -d
 

內容很簡單。

1. alpine中的crond有坑

以上shell指令碼很簡單。但是由於webhook有介面超時時間限制(碼雲 5s),所以介面要做成非同步的形式。因為上面的shell指令碼執行時間較長,大概在20s左右,所以只能非同步執行,同步介面超時。於是,自己把問題複雜化,但是同時也才踩到這個坑。

瞭解php的同學都知道,php不支援非同步。所以我想利用crond,定時去執行我的shell指令碼。首先介面把請求時間拿到,為了更準確的執行,我是延時1分鐘才執行指令碼,把定時任務寫進/etc/crontabs/root裡面。例如現在拿到時間是 2019-2-20 21:39:00 則 定時任務是 40 21 20 2 * /root/hexo.sh。但是到了時間shell不執行, ps檢視 crond程式正在執行,許可權也沒問題。 但是加入其它簡單任務,有時可以執行有時又不可以。。。網上查了好多沒找到原因, 後來網上也有提到在alpine中基於busybox的crond不穩定。行吧,以後能不用crond就不用…。 不過在實體物理機上centos7或者ubuntu倒是沒有問題。

後來發現是自己想多了,一個shell_exec後臺執行shell指令碼即可,沒那麼多亂七八糟的。


 shell_exec('/root/hexo.sh > /dev/null 2>&1 &')
 
 # 解釋
 
 1. /root/hexo.sh > /dev/null  #將指令碼標準輸出的內容定向輸入到一個不存在的裝置/dev/null(俗稱"黑洞")

 2. 2>&1 # 2代表標準錯誤 重定向到 &1(標準輸出)
 
 3. &   # 將任務排程到後臺執行。  常見在某個命令後面加 & 不佔用當前shell控制檯
 
 
2. 遷移csdn文章,python安裝pyquery失敗

我採用python3去遷移我csdn上的文章到新部落格地址。其中也是使用了python基於alpine做的映象,有一個lxml擴充套件一直裝不上。使用apk add lxml也裝不上,有報錯gcc,加上了gcc也沒用。 之後多番嘗試,apk add g++就好了。 所以,以後遇到這種問題,最好 gcc和g++都裝上,可能有些使用c++寫的,光用gcc編譯可能出錯。

要在docker容器pull程式碼,對映.ssh目錄即可

在docker容器假如沒有對映宿主機的.ssh目錄,執行git pull報錯,拉不到程式碼,所以確保容器apk add openssh和app add git之後,.ssh也要對映掛載過去即可。

3.hexo第三方評論外掛gitalk gitment

我在使用gitment的使用安裝各種配置之後,登入個人github會被報[object ProgressEvent]的錯。檢視很多原因,由於作者的伺服器好像不用了導致的,網上有各種解決方案,不過感覺太麻煩,直接換gitalk就好了,很順利網上搜尋詳細教程即可,很順利。

我的個人部落格:https://mojun.me

相關文章