前言
今年7月陰錯陽差的給自己買了一臺阿里雲伺服器,當時是想著自己折騰折騰後臺,看能否打通前端和後端之間的任督二脈。直到我發現我原來放在GitPage上的部落格訪問速度慢的實在不能忍,痛下決心之後,就把原來Jekyll搭建的部落格站點一口氣都遷移到了現在自己阿里雲的主機上了。原來的Jekyll部落格還在,還在GitPage上。換到了國內自己的阿里雲主機上,我就用了優雅的Ghost搭建我的新家了。
今年8月的時候,部落格上線了,網友們看見我這個部落格還不錯,讓我出一下搭建教程。雖然部落格上線,還沒有通過網路管理中心的稽核,還不知道之後會發生什麼。當時的我也對Ghost不是很熟,也不知道後期如何維護,所以想著先讓Ghost在伺服器上面跑一個月看看,有了心得體會之後在寫篇文章記錄一下搭建過程。
現在部落格也跑了一個多月了,日常維護都玩的轉了,於是就有了這一篇文章了。
目錄
- 1.Ghost簡介
- 2.搭建前準備清單
- 3.開始搭建
- 4.全站Https
- 5.管局備案 / 公安備案
- 6.CDN優化訪問速度
- 7.後期維護
一.Ghost簡介
Ghost 是一套基於 Node.js 構建的開源部落格平臺(Open source blogging platform),具有易用的書寫介面和體驗,部落格內容預設採用 Markdown 語法書寫,不過原生的不支援Markdown的表格和LaTeX,如果需要使用,需要在伺服器端安裝外掛。
Ghost目標是取代臃腫的 Wordpress,介面簡潔,專注寫作,支援線上預覽和線上寫作。
Ghost屬於動態部落格,頁面並不是像Hexo,Jekyll這類靜態部落格,在編譯的時候會生成所有頁面。Ghost有前臺和後臺。後臺負責寫作,釋出文章,系統配置,等等。
1. Ghost的優勢和劣勢
這裡有篇文章是這樣評論Ghost的優缺點的
優勢 技術上,採用NodeJs,在可預見的未來裡,無疑比PHP有更多優勢,併發能力遠超Wordpress,雖然NodeJs後期維護成本高,但是我們只是借它做部落格而已。 易用性上,專注寫作,評論,超炫皮膚,完美支援 MarkDown,沒有Wordpress那麼臃腫,迴歸到部落格最原始的狀態,傳遞文字最原始的力量。 使用上,便捷,隨時隨地編輯,比Hexo,Jekyll這類靜態部落格要書寫方便,特別是在不同電腦上寫作時。
劣勢 需要配套支援Node環境的虛擬機器,一般免費的很少支援,這時必須得掏腰包了。 後臺簡陋,許多功能還未完善,不過寫作這一塊沒啥大問題。
關於劣勢,我再說一點,Ghost沒有Hexo上面那麼豐富的外掛。
2. Ghost的亮點:
- 採用Mysql作為資料庫,通用快速上手,這裡也可以用其他資料庫比如Sqlite。
- Nginx作為反向代理,配置多個Ghost部落格,同時也能增加了網站的負載。
- 非常簡易化的Ubuntu的Node.js安裝方法,不用編譯打包。
- 安裝系統服務,開機重啟Ghost服務,免去日後以後操作。
- 採用Font Awesome作為社交按鈕,也可以自定義圖示。
- highlight.js 作為主題的程式碼高亮引擎
- 整合Disqus評論系統,建立屬於自己的Discuss圈
- 國外優秀免費Ghost主題資源分享
- 整合百度統計以及百度分享
二. 搭建前準備清單
- 一個可用的域名
- 一臺伺服器 ( 我買的阿里雲ECS ,伺服器系統安裝的是 CentOS 7.0 64位)
- Node v0.10.40(官方建議版本,注意,安裝Ghost中文版,只能安裝這個版本的Node,安裝高版本的會不識別,安裝其他版本的Ghost也一定要注意對準版本號)
- Nginx 1.80
- Mysql
- Ghost v0.7.4 full (zh)(中文漢化、支援七牛、又拍雲、阿里雲OSS儲存) 目前Ghost最新版是v0.11.1 (3.8mb zip),中文版最新版本號只到v0.7.4。
Ghost官網 ghost.org/
Ghost中文官網 www.ghostchina.com/
Ghost中文文件 docs.ghostchina.com/zh/
三. 開始搭建
1. 安裝Node
Ghost是基於Node.js構建的開源部落格平臺,所以我們首先搭建Node環境。
$ wget [http://nodejs.org/dist/v0.10.40/node-v0.10.40.tar.gz](http://nodejs.org/dist/v0.10.40/node-v0.10.40.tar.gz)
$ tar zxvf node-v0.10.40.tar.gz
$ cd node-v0.10.40
$ ./configure
$ make && make install複製程式碼
命令執行完畢之後,檢測一下環境是否配置成功。
$ node -v
v0.10.40複製程式碼
顯示node的版本號,即為安裝成功。
2. 安裝Nginx
Nginx是一款輕量級的Web伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。
首先在/etc/yum.repos.d/目錄下建立一個源配置檔案nginx.repo
$ vi /etc/yum.repos.d/nginx.repo複製程式碼
寫入以下內容:
[nginx]
name=nginx repo
baseurl=[http://nginx.org/packages/centos/](http://nginx.org/packages/centos/)$releasever/$basearch/
gpgcheck=0
enabled=1複製程式碼
儲存。
按i編輯,按Esc結束編輯,:x儲存修改並退出,:q!強制退出,放棄修改,:wq也是儲存並退出。
初始化好Nginx之後,繼續執行以下指令:
$ yum install nginx -y # 安裝
$ Nginx service nginx start # 啟動
$ Nginx chkconfig nginx on # 設定開機啟動Nginx複製程式碼
這樣Nginx就安裝成功了,在瀏覽器中輸入你的伺服器的IP地址就可以看到提示:“Welcome to Nginx!”
3. 配置Nginx
安裝好了nginx後,我們需要設定一個代理伺服器讓我們的部落格可以使用域名訪問。
$ cd /etc/nginx/conf.d複製程式碼
在這個目錄下建立一個配置檔案ghost.conf
$ vi /etc/nginx/conf.d/ghost.conf複製程式碼
貼上以下內容:
server {
listen 443;
server_name halfrost.com www.halfrost.com; #這裡寫你的域名或者ip地址
ssl on;
ssl_certificate /etc/letsencrypt/live/halfrost.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/halfrost.com/privkey.pem;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:2368;
}
}複製程式碼
中間有3行SSL的,是為了後面全站配置Https的,如果不需要Https,中間3行不需要加。
儲存退出,重啟nginx:
$ service nginx restart複製程式碼
Nginx 就配置完成了。
4. 安裝Mysql
Ghost 預設使用 sqlite3 資料庫,對於一般使用足夠了,但是內容多的話,就會拖慢整個系統,也就影響頁面開啟速度了,不想使用Mysql的朋友可以跳過這步。
CentOS7的yum源中預設好像是沒有mysql的。為了解決這個問題,我們要先下載mysql的repo源。
1.下載mysql的repo源
$ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm複製程式碼
2.安裝mysql-community-release-el7-5.noarch.rpm包
$ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm複製程式碼
安裝這個包後,會獲得兩個mysql的yum repo源:
/etc/yum.repos.d/mysql-community.repo,
/etc/yum.repos.d/mysql-community-source.repo。
3.安裝mysql
$ sudo yum install mysql-server複製程式碼
根據步驟安裝就可以了,不過安裝完成後,沒有密碼,需要重置密碼。
4.重置密碼
重置密碼前,首先要登入
$ mysql -u root複製程式碼
登入時有可能報這樣的錯:ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2),原因是/var/lib/mysql的訪問許可權問題。下面的命令把/var/lib/mysql的擁有者改為當前使用者:
$ sudo chown -R openscanner:openscanner /var/lib/mysql複製程式碼
然後,重啟服務:
$ service mysqld restart
$ chkconfig mysqld on # 設定開機啟動Mysql複製程式碼
5. 配置Mysql
輸入mysql_secure_installation配置Mysql:
$ Set root password? [Y/n] # 設定root密碼
$ anonymous users? [Y/n] # 刪除匿名使用者
$ Disallow root login remotely? [Y/n] # 禁止root使用者遠端登入
$ Remove test database and access to it? [Y/n] # 刪除預設的 test 資料庫
$ Reload privilege tables now? [Y/n] # 重新整理授權表使修改生效複製程式碼
為了避免資料庫存放的中文是亂碼,我們還需要設定Mysql的編碼:
$ vi /etc/my.cnf複製程式碼
貼上以下內容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci複製程式碼
儲存退出,重啟Mysql:
$ service mysqld restart複製程式碼
最後我們需要新建一個資料庫,用來存放部落格的資料:
$ mysql -u root -p # 輸入設定好的密碼
$ create database ghost; # 建立ghost資料庫
$ grant all privileges on ghost.* to 'ghost'@'%' identified by '123456'; # 新建一個使用者ghost,密碼為123456,這裡自己設定
$ flush privileges # 重新讀取許可權表中的資料到記憶體,不用重啟mysql就可以讓許可權生效複製程式碼
Mysql資料庫就安裝配置完成了。
6. 安裝Ghost
首先下載Ghost:
$ cd /var/www
$ wget [http://dl.ghostchina.com/Ghost-0.7.4-zh-full.zip](http://dl.ghostchina.com/Ghost-0.7.4-zh-full.zip)
$ unzip Ghost-0.7.4-zh-full.zip -d ghost
$ cd ghost複製程式碼
接著修改預設配置:
$ cp config.example.js config.js
$ vi config.js複製程式碼
Ghost有產品模式、開發模式和測試模式等多種執行模式,這裡我們需要在配置檔案中找到production模式:
config = {
// ### Production
// When running Ghost in the wild, use the production environment.
// Configure your URL and mail settings here
production: {
url: 'http://www.halfrost.com',
mail: {},
database: {
client: 'mysql',
connection: {
// filename: path.join(__dirname, '/content/data/ghost.db')
host:'127.0.0.1',
user:'ghost', #資料庫連線的使用者
password:'iloveghost', #之前資料庫建立的密碼
database:'ghost', #之前建立的資料庫名字
charset:'utf8'
},
debug: false
},
// 配置MySQL 資料庫
/*database: {
client: 'mysql',
connection: {
host : 'host',
user : 'user',
password : 'password',
database : 'database',
charset : 'utf8'
},
debug: false
},*/
server: {
host: '127.0.0.1',
port: '2368'
},
//Storage.Now,we can support `qiniu`,`upyun`, `aliyun oss`, `aliyun ace-storage` and `local-file-store`
// storage: {
// provider: 'local-file-store'
// }
// or
// 參考文件: http://www.ghostchina.com/qiniu-cdn-for-ghost/
storage: {
provider: 'qiniu',
bucketname: 'Mybucketname',
ACCESS_KEY: 'TZmRdasfdasfps5NDJEK4d*JsdgYGFFgWOsy5k_k0Zu',
SECRET_KEY: '7IsGSDDf1ef4HEsafsagLPDfs3gCkr$FERFe6ivfT',
root: '/Blog/',
prefix: 'https://odd2zeri30g.qnssl.com/'
}複製程式碼
storage這一項是配置雲端儲存的,支援七牛,又拍雲,阿里雲等等,具體設定需要檢視相應文件。如果只需要本地儲存,改成下面的樣子:
storage: {
provider: 'local-file-store'
}複製程式碼
儲存並退出,Ghost就配置完成了。
執行
$ npm start --production複製程式碼
啟動瀏覽器,輸入之前配置的域名或者IP,我們就可以看到建立好的Ghost部落格啦。 (Ctrl+C 中斷掉開發者模式)
7.部署Ghost
前面提到的啟動 Ghost 使用 npm start --production 命令。這是一個在開發模式下啟動和測試的不錯的選擇,但是通過這種命令列啟動的方式有個缺點,即當你關閉終端視窗或者從 SSH 斷開連線時,Ghost 就停止了。為了防止 Ghost 停止工作,我們得解決這個問題。
以下有幾種解決方案:
PM2(github.com/Unitech/pm2)
Forever (npmjs.org/package/for…)
Supervisor (supervisord.org/)
這裡我們使用PM2讓Ghost保持執行:
$ cd /var/www/ghost
$ npm install pm2 -g # 安裝PM2
$ NODE_ENV=production
$ pm2 start index.js --name "ghost"
$ pm2 startup centos pm2 save複製程式碼
如果npm安裝依賴的時候無法安裝,需要把映象換成淘寶的,再試試。
$ npm install -g cnpm --registry=[https://registry.npm.taobao.org](https://registry.npm.taobao.org/)
$ cnpm install pm2 -g
$ NODE_ENV=production pm2 start index.js --name "ghost"
$ pm2 startup centos
$ pm2 save複製程式碼
這樣一來,我們的Ghost部落格就可以保持執行啦,你可以使用以下指令來控制Ghost部落格:
pm2 start/stop/restart ghost複製程式碼
8. 初始化Ghost
現在所有準備工作都做好了,開啟你的瀏覽器,在瀏覽器中輸入 域名地址/ghost/,開始初始化使用者名稱,密碼,就可以開始愉快的Ghost之旅了。
四. 全站Https
Let's Encrypt是國外一個公共的免費SSL專案,由 Linux 基金會託管,它的來頭不小,由Mozilla、思科、Akamai、IdenTrust和EFF等組織發起,目的就是向網站自動簽發和管理免費證照,以便加速網際網路由HTTP過渡到HTTPS,目前Facebook等大公司開始加入贊助行列。
Let's Encrypt已經得了 IdenTrust 的交叉簽名,這意味著其證照現在已經可以被Mozilla、Google、Microsoft和Apple等主流的瀏覽器所信任,你只需要在Web 伺服器證照鏈中配置交叉簽名,瀏覽器客戶端會自動處理好其它的一切,Let's Encrypt安裝簡單,未來大規模採用可能性非常大。
Let's Encrypt官網:
1、官方網站:letsencrypt.org/
2、專案主頁:github.com/letsencrypt…
1、 安裝Let's Encrypt免費SSL準備
安裝Let's Encrypt指令碼依賴環境:(這一部分可以跳過,因為官方提供的Let's Encrypt指令碼會自動檢測並安裝)
# Debian
$ apt-get install git
# CentOS 6
$ yum install centos-release-SCL && yum update
$ yum install python27
$ scl enable python27 bash
$ yum install python27-python-devel python27-python-setuptools python27-python-tools python27-python-virtualenv
$ yum install augeas-libs dialog gcc libffi-devel openssl-devel python-devel
$ yum install python-argparse
# CentOS 7
$ yum install -y git python27
$ yum install -y augeas-libs dialog gcc libffi-devel openssl-devel python-devel
$ yum install python-argparse複製程式碼
檢視自己的VPS主機到底是安裝了哪個作業系統版本,可以執行命令:cat /etc/issue 或者 cat /etc/redhat-release。
2. 獲取Let's Encrypt免費SSL證照
獲取Let's Encrypt免費SSL證照很簡單,你只需要執行以下命令,就會自動在你的VPS上生成SSL證照和私鑰。
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto複製程式碼
經過測試,上述程式碼對於Debian系統支援最好,可以完成自動檢測並安裝相應的軟體。如果你是使用其它的Linux系統,Redhat或CentOS 6可能需要配置EPEL軟體源,Python需要2.7版本以上。
執行上述命令後,會彈出對話方塊,同意使用者協議。
接著會提示讓你關閉Nginx或者Apache。
Let's Encrypt需要用到80和443埠,所以你需要關閉那些佔用這兩個埠的應用。
當你看以下內容時,就表明你的Let's Encrypt免費SSL證照獲取成功了。
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/freehao123.org/fullchain.pem. Your cert will
expire on 2016-03-09. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.
- If like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le複製程式碼
見下圖:
到此,證照就申請結束了。
3. 配置SSL證照
接下來要配置一下本地的Nginx,在Nginx的config檔案裡面加入ssl的配置,配置在上面配置Nginx的時候已經寫過了。
4.指令碼自動獲取SSL證照
免費申請的SSL證照是每3個月就會過期,如果每次都要手動去申請證照,有點麻煩,而且一旦忘記了,SSL證照就過期了。
利用指令碼快速獲取Let's Encrypt SSL證照,呼叫 acme_tiny.py 認證、獲取、更新證照,不需要額外的依賴。
下載專案到本地
$ wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf
$ wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh
$ chmod +x letsencrypt.sh複製程式碼
配置檔案。只需要修改 DOMAIN_KEY DOMAIN_DIR DOMAINS 為你自己的資訊
ACCOUNT_KEY="letsencrypt-account.key"
DOMAIN_KEY="freehao123.com.key"
DOMAIN_DIR="/var/www/freehao123.com"
DOMAINS="DNS:freehao123.com,DNS:www.freehao123.com"複製程式碼
執行過程中會自動生成需要的 key 檔案。執行:
./letsencrypt.sh letsencrypt.conf複製程式碼
注意需要已經繫結域名到 /var/www/www.freehao123.com 目錄,即通過 freehao123.com www.freehao123.com 可以訪問到 /var/www/freehao123.com目錄,用於域名的驗證。
正常按照上面的操作即可成功獲取到Let's Encrypt SSL證照,不過經過測試最大的問題就是“DNS query timed out”,由於域名DNS解析的問題導致無法驗證域名從而獲取SSL證照不成功。
Traceback (most recent call last):
File "/tmp/acme_tiny.py", line 198, in
main(sys.argv[1:])
File "/tmp/acme_tiny.py", line 194, in main
signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
File "/tmp/acme_tiny.py", line 149, in get_crt
domain, challenge_status))
ValueError: hkh.freehao123.info challenge did not pass: {u'status': u'invalid', u'validationRecord': [{u'url': u'http://hkh.freehao123.info/.well-known/acme-challenge/sikHlqvbN4MrWkScgr1oZ9RX-lR1l__Z7FWVLhlYR0Q', u'hostname': u'hkh.freehao123.info', u'addressUsed': u'', u'port': u'80', u'addressesResolved': None}], u'https://acme-v01.api.letsencrypt.org/acme/challenge/5m1su6O5MmJYlGzCJnEUAnvhweAJwECBhEcvsQi5B2Q/1408863', u'token': u'sikHlqvbN4MrWkScgr1oZ9RX-lR1l__Z7FWVLhlYR0Q', u'error': {u'type': u'urn:acme:error:connection', u'detail': u'DNS query timed out'}, u'type': u'http-01'}複製程式碼
如果遇到這種情況,請加上VPN再試一次了。
配置好了自動獲取SSL證照的指令碼以後,就不用擔心自己的SSL證照會過期啦。
到這裡,訪問你部落格網站對應的443埠就是https了。
五. 管局備案 / 公安備案
進行到這一步,其實網站已經“上線”,並且可以成功訪問了。不過正常訪問80埠會出現以下的介面。
但是如果配置好了Https,正常訪問443埠是沒問題的。
我猜想這裡應該可以把80埠的所有請求都轉發到443,那不就可以避開80埠的請求了?不過我沒有這麼嘗試。
想讓我們辛辛苦苦搭建的部落格能以正常的方式訪問到,那麼需要申請管局的備案。我在阿里雲買的伺服器,申請備案有直達連結,很方便。
申請過程需要先填寫個人資訊,申請地要寫身份證所在地。個別地方有特殊規定,比如上海和北京,如果有居住證,可以寫居住證的所在地。然後還要上傳手持身份證圖片,和一些需要親手簽字的掃描件。
這些提交好了之後,會給你郵寄一塊幕布,需要你拍照再次上傳備案。
之後就是等待了,一般備案從提交到稽核通過大概10個工作日左右。如果覺得慢,還可以電話諮詢稽核進度。
當管局備案通過之後,會給你發郵件,裡面還有一個公安備案。我看很多教程沒有說要公安備案。也許是新出的。點郵件裡面的連結,繼續進行公安備案。
公安備案也是需要填寫個人資訊。這裡全部提交完全之後提交就好了,沒有管局的備案麻煩,只需要等待稽核通過即可。
當這兩個備案都完美通過之後,就可以算是備案通過,網站可以正常上線了。上線前,記得需要在網站頁尾處加上備案號。這些說明在備案通過的郵件裡面有詳細的說明,把郵件裡面說到的事情都做一遍,就OK了。
六. CDN優化訪問速度
網站上線以後,訪問速度會比伺服器在國外的GitPage訪問快一點。但是如果網站圖片很多,或者文章圖片質量很高,很多,訪問速度還是會隨之下降。
這是我們需要加入CDN來加速。
這裡我用的七牛的CDN雲服務。申請一個正好,建立好自己的倉庫,就可以把需要快取到CDN的資源都上傳進去。圖片,視訊,音樂都可以放進去。部落格裡面引用的就是七牛上面這些資源的外鏈。
這裡需要提醒注意的一點是,七牛記得設定好防盜鏈和流量提醒,否則別人會偷偷的從你這裡盜走好多流量,到月底,我們就白白花掉了好多冤枉錢了。
由於之前全站設定了Https,所以七牛這裡的圖片也需要用https的,https的流量比http的免費流量少很多。
設定好了以後,我跑了一個分,對比之前放在GitPage上的部落格訪問速度。
七. 後期維護
這裡的維護基本上指的是部落格更新和釋出以及Ghost配置的更改。
在自己的github上把所有的Ghost的配置都放在倉庫裡面,並把自己伺服器的SSH Key加入到Github的key裡面去。
git clone 一份到本地,每次在本地更改了,除錯好之後,就先push一份到遠端。然後登陸到伺服器上,把最新的程式碼pull下來,應用就好了。pull完之後只要執行
$ service nginx restart
$ pm2 restart ghost複製程式碼
執行這兩句就可以了。
平時還可能會出現一些https的問題,遇到了就Google查詢錯誤程式碼就可以了。
這裡說一個https不相容百度分享的問題。
這裡有一份修改好的分享程式碼Github地址github.com/hrwhisper/b…
static 解壓後丟到站點根目錄下即可。
然後對應的百度分享程式碼中,把bdimg.share.baidu.com/改為 /
.src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
改為
.src='/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];複製程式碼
這樣就可以了。如果想知道具體是怎麼實現了,就看看作者這篇文章
解決百度分享不支援https的還有一個辦法是利用七牛的映象儲存
看了下從百度分享獲取的程式碼,裡面主要載入了這個:bdimg.share.baidu.com/static/api/… 訪問了一下確實不支援 HTTPS。利用七牛的映象儲存,或者自己利用伺服器的Nginx反向代理一下就可以支援https了。
具體實現可以看這篇文章
最後
經過我們自己辛辛苦苦一路踩坑過來,搭建出來的部落格,一定會好好珍惜。這是我們程式設計師自己的家,讓我們用一篇篇的用心的部落格來裝飾我們的新家吧。
參考連結:
安裝Ghost & 開始嘗試
「搭建Ghost部落格」經典教程
如何搭建一個Ghost平臺的部落格
How To Create a Blog with Ghost and Nginx on Ubuntu 14.04
免費SSL證照Let’s Encrypt安裝使用教程:Apache和Nginx配置SSL
手把手教你搭建一個屬於自己的Ghost部落格