問題描述
靜態博客托管在github上誠然是一件非常不錯的事情,但是github在國內訪問速度很慢,而且經常因為違反國內的政策被墻而導致無法訪問,所以在國內找一個類似github的代碼托管兼靜態頁面托管平臺并采用雙托管方式似乎是個不錯的解決方案。
解決方案
國內有個叫gitcafe的代碼托管平臺提供了類似github的服務,不過gitcafe已經整合到coding.net,所以國內選擇了coding.net作為代碼和靜態網頁的托管。
國內的靜態網頁托管問題解決了,但是coding.net有自己的默認域名和綁定域名的方式,如何與github綁定的域名共存呢?也就是對于國內的用戶讓他們訪問coding.net托管的網頁;對于海外的用戶,讓他們訪問github托管的網頁,而且用戶在瀏覽器上敲下的網址要都是同一個。其實采用CDN的方式可以解決這個問題,但是免費靠譜的CDN資源非常難找,而且也有諸多限制,這里采用了免費的DNSPod服務,可以將國內的dns請求解析到國內的服務器(coding.net),國外的dns請求解析到國外的服務器(github.com),有效的解決了問題。
下面拿本人的博客http://www.figotan.org舉例說明如何一步一步解決這個問題。
國內代碼以及靜態網頁托管平臺-coding.net
訪問 http://www.coding.net注冊賬號,記得賬號名最好和github的賬號名保持一致(不一致其實也沒問題);
- 新建并上傳一個SSH公鑰,操作過程和github類似;
- 創建Coding Pages,具體流程可以參考官方文檔;
- 綁定自定義的網址,如果是主域名訪問,比如figotan.org,記得www和非www都需要綁定一下,否則非www的方式,比如http://figotan.org會報404錯誤;
- 在瀏覽器里訪問http://figotan.coding.me試試看效果
DNSPod
采用DNSPod提供的智能域名解析服務,可以按國內網絡供應商(電信,聯通,移動,教育網),地域(國內,國外),搜索引擎(谷歌,百度,搜搜,有道,必應,搜狗,奇虎)等維度對線路類型做域名解析。這樣,一個域名可以針對不同的用戶群體提供不同的空間與之提供服務。國內的用戶訪問國內的空間,國外的用戶訪問國外的空間。
下面是具體的操作步驟和注意的問題:
- 注冊賬號并添加域名;
-
添加coding.net的空間地址,具體配置如下圖:
- 去域名供應商處改寫NS紀錄,我用的狗爹提供的域名服務,具體修改操作如下圖:
- 刷新本機dns緩存并在瀏覽器測試效果
$ sudo dscacheutil -flushcache
$ sudo killall -HUP mDNSResponder
- 查看博客的域名解析信息
$ dig www.figotan.org +nostats +nocomments +nocmd
配置域名
配置域名紀錄的時候需要了解如下一些概念,也需要注意一些問題和坑,避免出現無法訪問域名的問題。
關于Host(主機)
主機記錄就是域名前綴
Host(主機) | 用法 |
---|---|
www | 解析后的域名為 www.figotan.org |
@ | 直接解析主域名 figotan.org |
* | 泛解析,匹配其他所有子域名 *.figotan.org |
關于Resord Type(記錄類型)
要指向空間商提供的 IP 地址,選擇「類型 A」,要指向一個域名,選擇「類型 CNAME」
Resord Type(記錄類型) | 用法 | Points To(記錄值) |
---|---|---|
A(Host) | 地址記錄,用來指定域名的IPv4地址(如:8.8.8.8),如果需要將域名指向一個IP地址,就需要添加A記錄 | 填寫您服務器 IP,如果您不知道,請咨詢您的空間商 |
AAAA(IPv6 Host) | 用來指定主機名(或域名)對應的IPv6地址(例如:ff06:0:0:0:0:0:0:c3)記錄 | 不常用。解析到 IPv6 的地址 |
CNAME(Alias) | 如果需要將域名指向另一個域名,再由另一個域名提供ip地址,就需要添加CNAME記錄 | 填寫空間商給您提供的域名,例如:figotan.org |
MX(Mail Exchanger) | 如果需要設置郵箱,讓郵箱能收到郵件,就需要添加MX記錄 | 填寫您郵件服務器的IP地址或企業郵局給您提供的域名,如果您不知道,請咨詢您的郵件服務提供商 |
TXT(Text) | 在這里可以填寫任何東西,長度限制255。絕大多數的TXT記錄是用來做SPF記錄(反垃圾郵件) | 一般用于 Google、QQ等企業郵箱的反垃圾郵件設置 |
SRV(Service) | 記錄了哪臺計算機提供了哪個服務。格式為:服務的名字、點、協議的類型,例如:_xmpp-server._tcp | 不常用。格式為:優先級、空格、權重、空格、端口、空格、主機名,記錄生成后會自動在域名后面補一個“.”,這是正常現象。例如:5 0 5269 xmpp-server.l.google.com. |
NS(Name Server) | 域名服務器記錄,如果需要把子域名交給其他DNS服務商解析,就需要添加NS記錄 | 不常用。系統默認添加的兩個NS記錄請不要修改。NS向下授權,填寫dns域名,例如:f1g1ns1.dnspod.net |
關于TTL
即 Time To Live,緩存的生存時間。指地方dns緩存您域名記錄信息的時間,緩存失效后會再次到DNSPod獲取記錄值。
TTL | 用法 |
---|---|
600(10分鐘) | 建議正常情況下使用 600 |
60(1分鐘) | 如果您經常修改IP,修改記錄一分鐘即可生效。長期使用 60,解析速度會略受影響 |
3600(1小時) | 如果您IP極少變動(一年幾次),建議選擇 3600,解析速度快。如果要修改IP,提前一天改為 60,即可快速生效 |
部署內容
之前的博客是放在github,所以首先從github獲取博客最新的代碼到本地
第一次從github遷移到雙git的流程
詳細流程如下:
- 從github獲取代碼
git clone git@github.com:figofuture/figofuture.github.io.git
- 進入代碼所在的目錄
cd figofuture.github.io
- 本地master分支跟蹤github遠程分支
git branch --set-upstream-to=origin/master master
- 拉取master最新的代碼
git pull
- 添加coding.net遠程分支
git remote add coding-origin git@git.coding.net:figotan/figotan
- 新建本地分支coding-pages
git checkout -b coding-pages
- 拉取coding.net遠程分支代碼到本地coding-pages分支
git pull coding-origin coding-pages
- 本地coding-pages分支跟蹤遠程分支
git branch --set-upstream-to=coding-origin/coding-pages coding-pages
- 解決沖突
- 提交本地修改
git commit -a -m "xxxxx"
- 推送本地coding-pages到coding遠程coding-pages分支
git push coding-origin coding-pages
- 切換到master分支
git checkout master
- 合并coding-pages分支的修改到master分支
git merge --no-ff coding-pages
- 提交master分支到github
git push origin master
日常編寫博客以及同步的流程
以后可以拿其中某一個本地分支(coding-pages)做基準修改,推送到這個本地分支跟蹤的遠程分支(coding),然后同步到本地另一個分支(master),并推送到另一個分支跟蹤的遠程分支(github),這樣,就做到了國內和國外博客內容的同步更新。
具體的操作流程如下:
- 切換到coding-pages分支,并編寫博客/上傳圖片/修改代碼
git checkout coding-pages
- 提交并推送到coding遠程分支
git commit -a -m "update"
git push coding-origin coding-pages
- 切換到master分支,合并coding-pages分支的改動到master分支
git checkout master
git merge --no-ff coding-pages
- 推送master內容到github,同步完成
git push origin master
自動化部署方案
如果以上方法你覺得麻煩,其實還有一種自動化的repo同步方案,詳見利用webhook自動同步不同repo之間的代碼
這里筆者做了一些整理和注意的坑,如下:
- 注冊openshift;
- 添加一個應用,根據熟悉的語言選擇平臺,這里選PHP5.4,設置域名和應用名。也可以使用OpenShift提供的客戶端工具(rhc)來創建應用,具體的使用可以參考OpenShift的官方文檔;
- 本地生成ssh公鑰私鑰,將公鑰導入注冊的應用;
- ssh訪問應用;
- 在openshift的應用上生成ssh公鑰私鑰,注意~/.ssh/下無寫權限,所以將公鑰私鑰生成到$OPENSHIFT_DATA_DIR目錄下;
- 將公鑰分別導入到github和coding的賬戶下;
- 從coding簽出最新的代碼
cd $OPENSHIFT_DATA_DIR
ssh-agent bash -c 'ssh-add /var/lib/openshift/[openshift分配的名字]/app-root/data/.ssh/id_rsa; git clone git@git.coding.net:figotan/figotan.git'
cd figotan
- 跟蹤并獲取coding上最新的代碼
git branch --set-upstream-to=coding-origin/coding-pages coding-pages
ssh-agent bash -c 'ssh-add /var/lib/openshift/[openshift分配的名字]/app-root/data/.ssh/id_rsa; git pull origin coding-pages'
- 添加github遠程代碼倉庫
git remote add gh-origin git@github.com:figofuture/figofuture.github.io.git
- 編寫php api接口并部署
安裝OpenShift客戶端工具rhc,rhc是用ruby編寫,所以安裝前請先安裝ruby的開發環境sudo gem install rhc
輸入OpenShift用戶名和密碼rhc setup
獲取應用對應的git地址rhc app show [前面步驟申請的openshift應用名稱]
簽出代碼git clone [申請openshift應用分配的git repo地址]
示例參考
<?php
if( $_GET['key'] == 'KEY' ) {
echo shell_exec('cd $OPENSHIFT_DATA_DIR/figotan;ssh-agent bash -c "ssh-add /var/lib/openshift/[openshift分配的名字]/app-root/data/.ssh/id_rsa; git pull origin coding-pages";ssh-agent bash -c "ssh-add /var/lib/openshift/[openshift分配的名字]/app-root/data/.ssh/id_rsa; git push gh-origin coding-pages:master"');
}
else {
header('HTTP/1.1 400 Bad Request');
echo <<<HTML
// Fallback
HTML;
}
提交推送后OpenShift自動部署 git commit && git push
- 在coding.net項目中設置webhook,記得把KEY設置成一串隨機的字符串,為了一定的安全性考慮。記得上面步驟中php api源碼里的KEY和webhook中的KEY內容一定要一致。
注意的坑
- 因為在openshift里用戶主目錄下的.ssh只讀不可寫,所以只能在其他地方生成ssh公鑰私鑰,推薦在$OPENSHIFT_DATA_DIR目錄下,這樣,用git獲取github或者coding上的代碼就需要采用如下這種形式:
ssh-agent bash -c 'ssh-add /var/lib/openshift/[openshift分配的名字]/app-root/data/.ssh/id_rsa; [需要使用ssh方式執行的命令]'
- 從coding觸發webhook有一定的失敗幾率,如果失敗,可以手動觸發一遍,有兩個辦法:
- 在瀏覽器里直接訪問webhook的網址
- 登陸到coding的web后臺,在項目的webhook設置的地方點擊測試按鈕,在發送紀錄可以跟蹤到發送狀態
參考資料
感謝網絡上各路英雄的幫助:
Jekyll自建博客同時托管至 Github 與 Gitcafe
解決 Github Pages 禁止百度爬蟲的方法與可行性分析
利用 CDN 解決百度爬蟲被 Github Pages 拒絕的問題
解決 Github Pages 禁止百度爬蟲的方法2--從gitcafe遷移到coding.net
GitHub 實時同步到 GitCafe,并解決百度無法抓取 GitHub Pages 問題
原文請猛戳http://www.figotan.org/2016/03/29/how-to-speed-up-your-blog-using-duplex-git-pages/