一切從搭建博客開始談起

問題描述

靜態博客託管在github上誠然是一件很是不錯的事情,可是github在國內訪問速度很慢,並且常常由於違反國內的政策被牆而致使沒法訪問,因此在國內找一個相似github的代碼託管兼靜態頁面託管平臺並採用雙託管方式彷佛是個不錯的解決方案。php

解決方案

國內有個叫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舉例說明如何一步一步解決這個問題。html

國內代碼以及靜態網頁託管平臺-coding.net

訪問 http://www.coding.net註冊帳號,記得帳號名最好和github的帳號名保持一致(不一致其實也沒問題);git

  1. 新建並上傳一個SSH公鑰,操做過程和github相似;github

  2. 建立Coding Pages,具體流程能夠參考官方文檔web

  3. 綁定自定義的網址,若是是主域名訪問,好比figotan.org,記得www和非www都須要綁定一下,不然非www的方式,好比http://figotan.org會報404錯誤;shell

  4. 在瀏覽器裏訪問http://figotan.coding.me試試看效果api

DNSPod

採用DNSPod提供的智能域名解析服務,能夠按國內網絡供應商(電信,聯通,移動,教育網),地域(國內,國外),搜索引擎(谷歌,百度,搜搜,有道,必應,搜狗,奇虎)等維度對線路類型作域名解析。這樣,一個域名能夠針對不一樣的用戶羣體提供不一樣的空間與之提供服務。國內的用戶訪問國內的空間,國外的用戶訪問國外的空間。
下面是具體的操做步驟和注意的問題:瀏覽器

  1. 註冊帳號並添加域名;緩存

  2. 添加coding.net的空間地址,具體配置以下圖: 安全

  3. 去域名供應商處改寫NS紀錄,我用的狗爹提供的域名服務,具體修改操做以下圖:

  4. 刷新本機dns緩存並在瀏覽器測試效果
    $ sudo dscacheutil -flushcache

$ sudo killall -HUP mDNSResponder

  1. 查看博客的域名解析信息
    $ 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的流程

詳細流程以下:

  1. 從github獲取代碼
    git clone git@github.com:figofuture/figofuture.github.io.git

  2. 進入代碼所在的目錄
    cd figofuture.github.io

  3. 本地master分支跟蹤github遠程分支
    git branch --set-upstream-to=origin/master master

  4. 拉取master最新的代碼
    git pull

  5. 添加coding.net遠程分支
    git remote add coding-origin git@git.coding.net:figotan/figotan

  6. 新建本地分支coding-pages
    git checkout -b coding-pages

  7. 拉取coding.net遠程分支代碼到本地coding-pages分支
    git pull coding-origin coding-pages

  8. 本地coding-pages分支跟蹤遠程分支
    git branch --set-upstream-to=coding-origin/coding-pages coding-pages

  9. 解決衝突

  10. 提交本地修改
    git commit -a -m "xxxxx"

  11. 推送本地coding-pages到coding遠程coding-pages分支
    git push coding-origin coding-pages

  12. 切換到master分支
    git checkout master

  13. 合併coding-pages分支的修改到master分支
    git merge --no-ff coding-pages

  14. 提交master分支到github
    git push origin master

平常編寫博客以及同步的流程

之後能夠拿其中某一個本地分支(coding-pages)作基準修改,推送到這個本地分支跟蹤的遠程分支(coding),而後同步到本地另外一個分支(master),並推送到另外一個分支跟蹤的遠程分支(github),這樣,就作到了國內和國外博客內容的同步更新。
具體的操做流程以下:

  1. 切換到coding-pages分支,並編寫博客/上傳圖片/修改代碼
    git checkout coding-pages

  2. 提交併推送到coding遠程分支
    git commit -a -m "update"

git push coding-origin coding-pages

  1. 切換到master分支,合併coding-pages分支的改動到master分支
    git checkout master

git merge --no-ff coding-pages

  1. 推送master內容到github,同步完成
    git push origin master

自動化部署方案

若是以上方法你以爲麻煩,其實還有一種自動化的repo同步方案,詳見利用webhook自動同步不一樣repo之間的代碼
這裏筆者作了一些整理和注意的坑,以下:

  1. 註冊openshift

  2. 添加一個應用,根據熟悉的語言選擇平臺,這裏選PHP5.4,設置域名和應用名。也可使用OpenShift提供的客戶端工具(rhc)來建立應用,具體的使用能夠參考OpenShift的官方文檔

  3. 本地生成ssh公鑰私鑰,將公鑰導入註冊的應用;

  4. ssh訪問應用;

  5. 在openshift的應用上生成ssh公鑰私鑰,注意~/.ssh/下無寫權限,因此將公鑰私鑰生成到$OPENSHIFT_DATA_DIR目錄下;

  6. 將公鑰分別導入到githubcoding的帳戶下;

  7. 從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

  1. 跟蹤並獲取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'

  1. 添加github遠程代碼倉庫
    git remote add gh-origin git@github.com:figofuture/figofuture.github.io.git

  2. 編寫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

  1. 在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

解決 Github Pages 禁止百度爬蟲的方法與可行性分析

利用 CDN 解決百度爬蟲被 Github Pages 拒絕的問題

解決 Github Pages 禁止百度爬蟲的方法2--從gitcafe遷移到coding.net

GitHub 實時同步到 GitCafe,並解決百度沒法抓取 GitHub Pages 問題

知乎上各類解決方案的彙總

借問原文何處有,鼠標點擊 http://www.figotan.org/2016/03/29/how-to...

相關文章
相關標籤/搜索