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