前言
點選 我用 Ghost 搭建的部落格 檢視成品示例。
早就聽說 Ghost 的大名了,不過一直都是處於觀望狀態。主要是想等 Ghost 各方面再成熟一些,所以遲遲沒有行動。最近聽聞 Ghost 已經放出了 v1.0.0 版本,在這一里程碑版本中加入了全新的 Ghost-CLI,不論從維護還是配置都變得非常優雅簡捷。於是決定用心水了很久的 Ghost 給自己一個全新的開始。
這篇文章詳細的記錄了我在搭建部落格時的流程以及踩到的坑。文章寫得比較用心,真心希望可以給有同樣需求的讀者提供小小的幫助。
索引
- Ghost 簡介
- 準備工作
- 搭建環境
- Ghost 安裝與配置
- 全站 Https
- CDN 優化
- 總結
Ghost 簡介
Ghost 是一款非常出色的開源部落格平臺,無論是從架構、設計、易用性,它都要比 Wordpress 要好,介面簡潔,專注寫作,支援線上預覽,線上寫作,無論您是在哪裡,都可以去寫部落格,盡情的享受寫作帶來的快感。
Ghost 最早於 2012 年 11 月初在專案創始人 John O'Nolan 的 部落格文章 中提出。@John O'Nolan 曾任名 WordPress 的 UI 介面團隊副主任,他提出 Ghost 平臺的目的就是為了取締複雜臃腫的 WordPress。
Ghost 內容預設支援 Markdown 語法書寫。Markdown 是一種具有純文字格式語法的輕量級標記語言,它可以讓作者更專注於創作而不必為繁雜的格式分心。
Ghost 是動態部落格,頁面並非 Hexo、Jekyll 這類靜態部落格那樣在編譯時生成。Ghost 區分站點和控制檯(可以理解為前後臺),我們可以在控制檯進行站點配置,創作和釋出文章等工作。
Ghost 的優勢和劣勢
找到一篇 2015 年的 sf文章 裡面是這麼評論 Ghost 的優劣的:
優勢
- 技術上,採用 NodeJs,在可預見的未來裡,無疑比 PHP 有更多優勢,併發能力遠超 Wordpress,雖然 NodeJs 後期維護成本高,但是我們只是借它做部落格而已。
- 易用性上,專注寫作,評論,超炫皮膚,完美支援 Markdown,沒有 Wordpress 那麼臃腫,迴歸到部落格最原始的狀態,傳遞文字最原始的力量。
- 使用上,便捷,隨時隨地編輯,比 Hexo, Jekyll 這類靜態部落格要書寫方便,特別是在不同電腦上寫作時。
劣勢
- 需要配套支援 Node 環境的虛擬機器,一般免費的很少支援,這時必須得掏腰包了。
- 後臺簡陋,許多功能還未完善,不過寫作這一塊沒啥大問題。
不過畢竟是 2015 年時的點評,今日 Ghost 已經放出了 v1.0.0 版本,後臺功能該有的都有了,還有很多新穎的功能處於測試階段都放在後臺的 Labs 下供大家試用,不過外掛比較少這倒是真的。
Ghost v1.0.0 新特性
Ghost 在 v1.0.0 中新加入了 Ghost-CLI,它可以幫助我們安裝和配置 Ghost,使得 Ghost 之後的更新維護變得相當優雅簡捷。
例如升級 Ghost 只需要:
- 備份重要資料
ghost update
嘛~ 我們甚至不用去停止 Ghost 就直接可以更新了!
而且有了 Ghost-CLI 之後我們再也不需要使用 npm 命令去操作 ghost 咯,日常維護部落格的命令將會變得非常優雅(比如 ghost start
、ghost restart
等)~
補充一下,在之前的版本中,執行 Ghost 需要使用 npm start --production
命令。通過 npm 啟動不僅不夠優雅,而且還有一個致命缺點,即當你關閉終端視窗或者從 SSH 斷開連線時,Ghost 就停止了。為了防止 Ghost 停止工作,還需要另找解決方案。
在將來,v1.0.0 之後的版本與之前的版本相差將會越來越遠,牆裂建議大家用 v1.0.0 之後的 Ghost 版本搭建 Blog(通過 Ghost-CLI 安裝 Ghost 喲)。
而對於之前已經使用 Ghost 的前輩們,在此獻上 官方遷移指南。
- Ghost 官網 ghost.org/
- Ghost 官方文件 docs.ghost.org/docs/
- Ghost 中文官網 www.ghostchina.com/
- Ghost 中文文件 docs.ghostchina.com/zh/
準備工作
Ghost 官方推薦的配置:
For installing on production, we officially recommend the following stack & server setup:
- Ubuntu 16.04
- MySQL
- NGINX
- Systemd
- Node v6 installed via NodeSource
- At least 1GB memory (swap can be used)
- A non-root user for running ghost commands
Ubuntu 16.04 是唯一官方支援的作業系統。其他作業系統可能也可以執行 Ghost,但官方無法協助除錯或優化。
Digital Ocean(此連結是我的個人優惠連結,通過此連結進入 DO 註冊會拿到 10 刀)是官方推薦的伺服器提供商,推薦大家在 Digital Ocean 上面買 VPS 搭建部落格(相比於阿里雲等國內伺服器的優點在於訪問 80 埠無需備案,可以搭建 ss 實現科學上網等)。
新增交換記憶體
如果你的 VPS 系統的記憶體不足 1GB,可能會遇到錯誤。為了克服這個,執行下面的命令來配置更大量的交換記憶體:
dd if=/dev/zero of=/var/swap bs=1k count=1024k
mkswap /var/swap
swapon /var/swap
echo '/var/swap swap swap default 0 0' >> /etc/fstab
複製程式碼
搭建環境
1.建立並切換到新使用者
由於 Ghost 官方推薦我們不使用 root 使用者直接操作,所以這裡提供建立新使用者併為其配置許可權的命令:
$ adduser <user>
$ usermod -aG sudo <user>
$ su - <user>
複製程式碼
這是一個安全措施。如果 Ghost 遭到破壞,我們的系統將是安全的。
2.chkconfig
chkconfig 在 Linux 下管理服務/啟動項在各個系統執行級別中的設定,在 Linux 中系統有 7 個執行級別,分別是:
- 執行級別0:表示關機
- 執行級別1:表示單使用者模式
- 執行級別2:無網路連線的多使用者命令列模式
- 執行級別3:有網路連線的多使用者命令列模式
- 執行級別4:暫不可用
- 執行級別5:帶圖形介面的聯網多使用者模式
- 執行級別6:重新啟動
本文中我們只需要知道 chkconfig 可以幫助我們實現開啟自啟動就可以了。
$ sudo apt-get install sysv-rc-conf
$ sysv-rc-conf --list
$ alias chkconfig=sysv-rc-conf
$ chkconfig --list
複製程式碼
3.Node.js
Node.js 是用於通用程式設計的 JavaScript 平臺,允許使用者快速構建網路應用程式。通過利用前端和後端的 JavaScript,開發可以更一致,並在同一系統中進行設計。
安裝 Node.js
Ubuntu 16.04 在其預設儲存庫中包含一個 Node.js 版本,可用於輕鬆提供跨多個系統的一致體驗。
輸入以下命令,安裝 Node.js 和 npm,即 Node.js 包管理器。
$ sudo apt-get update
$ sudo apt-get install -y nodejs
$ sudo apt-get install npm
複製程式碼
Note: 由於與另一個包衝突,呼叫 Ubuntu 儲存庫中的可執行檔案預設為 nodejs 而不是 node。
解決方法:
$ ln -s /usr/bin/nodejs /usr/bin/node
複製程式碼
驗證安裝結果
$ node -v
複製程式碼
如果輸出 Node.js 的版本則說明安裝成功。
4.Nginx
Nginx 是一個免費的,開源的,高效能的 HTTP 伺服器和反向代理,以及一個 IMAP / POP3 代理伺服器。 Nginx 以其高效能,穩定性,豐富的功能集,簡單的配置和低資源消耗而聞名。在大多數情況下,它比 Apache 更加資源友好。
安裝 Nginx
輸入以下命令安裝 Nginx。
$ sudo apt-get update
$ sudo apt-get install nginx
複製程式碼
調整防火牆
UFW(Uncomplicated Firewall)是一個 iptables 的介面,旨在簡化配置防火牆的過程。雖然 iptables 是一個堅實而靈活的工具,但初學者很難學習如何使用它來正確配置防火牆。
Ubuntu 預設安裝了 UFW,下面的命令可以檢視防火牆的狀態。
$ sudo ufw status
複製程式碼
如果你沒有也不想開啟防火牆,則可以直接跳過此步驟,如果你想要開啟防火牆可以通過以下命令實現。
$ sudo ufw enable
複製程式碼
之後再次檢查防火牆狀態驗證是否成功開啟防火牆。
在我們測試 Nginx 之前,我們需要重新配置我們的防火牆軟體以允許訪問該服務。安裝時,Nginx 將自動在 UFW 註冊,我們可以用下面的操作來檢視。
$ sudo ufw app list
複製程式碼
不出意外會顯示:
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
...
複製程式碼
- Nginx Full:此配置檔案開啟埠 80(正常,未加密的Web流量)和埠 443(TLS / SSL加密流量)
- Nginx HTTP:此配置檔案僅開啟埠 80(正常,未加密的Web流量)
- Nginx HTTPS:此配置檔案僅開啟埠 443(TLS / SSL加密流量)
我們需要確保防火牆允許 HTTP 和 HTTPS 連線。
$ sudo ufw allow 'Nginx Full'
複製程式碼
Note: 如果你有在 VPS 上搭建 SS 進行科學上網,那麼需要
sudo ufw allow <ss port>
來允許科學上網,裡面的<ss port>
就是你之前配置 ss 的埠號。
驗證 Nginx 是否正常工作
最簡單有效的檢驗方式就是在瀏覽器中通過域名或者 IP 地址訪問你的 VPS,如果 Nginx 正常啟動則會開啟 Welcome to nginx 的歡迎頁面。
開啟自啟動 Nginx
$ chkconfig nginx on
複製程式碼
熟悉 Nginx 重要的檔案和目錄
我覺得我有必要在這裡列出 Nginx 比較重要的檔案和目錄,而你也應該花幾分鐘來熟悉一下它們。
內容:
/var/www/html
: Web 內容(預設情況下僅包含我們之前看到的預設 Nginx 頁面),可以通過更改 Nginx 配置檔案來更改。
伺服器配置:
/etc/nginx
: Nginx 配置目錄,所有 Nginx 配置檔案都在這裡了。/etc/nginx/nginx.conf
: 主要的 Nginx 配置檔案,對 Nginx 全域性配置進行更改。/etc/nginx/sites-available/
: 可以儲存每個站點“伺服器塊”的目錄。Nginx 不會使用此目錄中找到的配置檔案,除非它們連結到 sites-enabled 目錄(見下文)。通常,所有伺服器塊配置都在此目錄中完成,然後通過連結到另一個目錄來啟用。/etc/nginx/sites-enabled/
: 儲存啟用每個站點“伺服器塊”的目錄。通常,這些是通過連結到目錄中找到的配置檔案建立的 sites-available。/etc/nginx/snippets
: 此目錄包含 Nginx 配置中可以包含的配置片段。
伺服器日誌:
/var/log/nginx/access.log
: 對於您的 Web 伺服器的每個請求記錄都會儲存在此日誌檔案中,除非 Nginx 配置為其他方式。/var/log/nginx/error.log
: 任何 Nginx 錯誤都將記錄在此日誌中。
配置 Nginx
$ vi /etc/nginx/conf.d/ghost.conf
複製程式碼
配置內容可以參考我的:
server {
listen 80; # 如果你配置了 SSL 就用 443,否則就寫 80
server_name lision.me; #這裡寫你的域名或者ip地址
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:2368;
}
}
複製程式碼
5.MySql
MySQL 是一種開源資料庫管理系統,通常作為流行的 LAMP(Linux,Apache,MySQL,PHP / Python / Perl)堆疊的一部分安裝。它使用關聯式資料庫和 SQL(結構化查詢語言)來管理其資料。
安裝 MySql
安裝的步驟很簡單:更新軟體包索引,安裝 mysql-server 軟體包。
$ sudo apt-get update
$ sudo apt-get install mysql-server
複製程式碼
Note: 安裝過程中會要求你給 MySql 的 root 使用者配置密碼,配完請妥善儲存。
配置 MySQL
對於新安裝的 MySql,需要執行附帶的安全指令碼。這會更改一些不太安全的預設選項,例如遠端 root 登入和示例使用者。在舊版本的 MySQL 上,您還需要手動初始化資料目錄,但現在已經可以自動完成。
$ mysql_secure_installation
複製程式碼
Note: 執行安全指令碼需要 root 密碼,輸入密碼後配置各項。這裡推薦大家第一項選 1,後面的按 “Enter” 做預設選擇就好。
測試 MySql
輸入以下命令來檢視 MySql 的服務狀態:
$ systemctl status mysql.service
複製程式碼
結果正常會提示:
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
Active: active (running) since Thu 2017-10-19 14:27:24 CST; 7min ago
Main PID: 17694 (mysqld)
CGroup: /system.slice/mysql.service
└─17694 /usr/sbin/mysqld
複製程式碼
開機自啟動 MySql
$ chkconfig mysql on
複製程式碼
擴充套件配置
為了避免資料庫存放的中文是亂碼,我們還需要設定 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 mysql restart
複製程式碼
建立 Ghost 資料庫
以 root 身份登入 MySql,然後建立一個名為 ghost 的資料庫並驗證建立結果:
$ mysql -u root -p;
mysql> create database ghost;
mysql> show databases;
mysql> exit
複製程式碼
Ghost 安裝與配置
上文提到 Ghost v1.0.0 之後加入了 Ghost-CLI,用它來安裝維護 Ghost 可以更加優雅簡捷。
1.安裝 Ghost-CLI
$ sudo npm i -g ghost-cli
複製程式碼
安裝成功的話會提示一個安裝完畢的目錄結構(樹形圖)。
下一步我們需要建立一個資料夾,之前介紹過 Nginx 的重要檔案結構 /var/www/
就是我們將要建立資料夾的地方:
$ sudo mkdir -p /var/www/ghost
複製程式碼
Note: 在 /root 資料夾中安裝 Ghost 將無法正常工作,導致設定錯誤!
之後配置許可權:
# [user] 是我們在安裝階段建立的使用者
$ sudo chown [user]:[user] /var/www/ghost
複製程式碼
然後進入我們剛才建立的資料夾:
$ cd /var/www/ghost/
複製程式碼
Note: 請確保
/var/www/ghost/
這個檔案目錄是空的。
2.用 Ghost-CLI 安裝 Ghost
$ ghost install
複製程式碼
更多命令請查閱 Ghost-CLI 命令。
Node.js 版本不符
Node.js 的版本不符,我目前的 Ghost 由於是最新版本,需求的 Node.js 版本與我環境中的不符合。
解決辦法:使用 nvm 替換 Node.js 版本。
安裝 nvm
除了 apt 之外,安裝 Node.js 的另一種方法是使用一個專門設計的工具 nvm(Node.js Version Manager)。
通過使用 nvm,我們可以安裝多個獨立版本的 Node.js,這將允許我們更輕鬆地控制我們的環境。它可以讓我們按需訪問 Node.js 的最新版本,同時也可以使用應用程式可能依賴的先前版本。
$ sudo apt-get update
$ sudo apt-get install build-essential libssl-dev
複製程式碼
安裝必備軟體包後,可以從專案的 GitHub 頁面下拉 nvm 安裝指令碼。版本號可能不同,但一般來說,可以通過 curl 下載指令碼並執行:
$ curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh -o install_nvm.sh
$ bash install_nvm.sh
複製程式碼
要訪問 nvm 的功能,需要重新登出並登入,或者我們可以匯出 ~/.profile
檔案,以便當前的會話更新:
source ~/.profile
複製程式碼
現在有了 nvm,可以開始管理 Node.js 版本。
管理 Node.js 版本
要查詢可用於安裝的 Node.js 的版本,可以鍵入:
$ nvm ls-remote
複製程式碼
會 OutPut 出來茫茫多的 Node.js 可用版本:
...
v8.5.0
v8.6.0
v8.7.0
複製程式碼
按照剛才的錯誤提示安裝符合要求的 Node.js 版本,設定為預設版本並切換過去(我這裡是 4.8.4):
$ nvm install 4.8.4
$ nvm alias default 4.8.4
$ nvm use default
複製程式碼
驗證 Node.js 版本
$ node -v
複製程式碼
之後可以回到 /var/www/ghost/
目錄重新安裝 Ghost。
“two version of Node” 錯誤
如果提示 two version of Node
這個問題在 Ghost 的 Github 中有人提到了 throws two version of Node error,我在寫這篇文章的時候作者還沒有解決,不過回退到 Ghost-CLI v1.0.3 可以解決。
$ sudo npm i -g ghost-cli@1.0.3
複製程式碼
安裝過程中失敗怎麼辦
如果安裝錯誤,我們可以使用 ghost uninstall
指令來刪除它,然後重試。
3.配置 Ghost
如果上面在 /var/www/ghost/
目錄下執行 ghost install
成功的話,會讓你配置一些東西:
你可以根據需要進行簡單的配置。如果配置之後後悔了也不要緊,我們可以去檔案中進行配置:
$ vi config.production.json
複製程式碼
開啟之後就是我們的生產環境配置內容了。
Note: 對應於 production 環境還有一個檔案是 config.development.json 檔案,該檔案是配置開發環境的。我們如果拿 Ghost 作為部落格來寫就無需理會這個檔案了,它主要用於除錯 Ghost。
配置對照表
Name | Required | Description |
---|---|---|
url | only in production | Set the public URL for your blog |
admin | no | Set the protocol and hostname for your admin panel to be different. |
only in production | Add a mail service so that Ghost can send emails such as forgotten password and user invite emails | |
database | only in production | The type of database that Ghost uses. This is configured to sqlite3 by default and does not need editing |
server | no | Host and port, or socket for Ghost to listen on |
privacy | no | Disable the Ghost features listed in PRIVACY.md, e.g. update check, rpc ping, and google fonts |
paths | no | Customise Ghost's internal paths, e.g. to the content directory |
maintenance | no | Transform your blog into maintenance mode. |
referrerPolicy | no | Control the content attribute of the meta referrer tag. |
useMinFiles | no | Generate assets url with .min notation. |
storage | no | Set a custom storage adapter, read more here Using a custom storage module |
scheduling | no | Set a custom scheduling adapter, read more here Using a custom scheduling module |
logging | no | Configure logging for Ghost. |
spam | no | Configure spam settings. |
caching | no | Configure caching settings. |
配置內容
大家可以先參考我的配置來配(請無視我的 SPLATOON2 桌布),等以後熟悉了再去按照自己的需求對照上面的配置表進行深度配置。
{
"url": "http://lision.me/",
"server": {
"port": 2368,
"host": "127.0.0.1"
},
"database": {
"client": "mysql",
"connection": {
"host": "127.0.0.1",
"user": "root",
"password": "lision",
"database": "ghost",
"charset": "utf8"
}
},
"mail": {
"transport": "Direct"
},
"logging": {
"transports": [
"file",
"stdout"
]
},
"process": "systemd",
"paths": {
"contentPath": "/var/www/ghost/content"
}
}
複製程式碼
如果大家想按照自己的需求去做配置,建議大家去 官方配置文件。這裡面東西比較細,且不一定每個人都適用,考慮到篇幅原因這裡不過多介紹。
4.測試 Ghost
如果成功的安裝 Ghost 之後,我們就可以通過域名訪問到我們的部落格了,第一次進入部落格時會要求做一些簡單的配置。
配置完畢再次訪問域名就可以進入我們的部落格了,裡面已經預置了一些幫助你快速上手 Ghost 的文章。
我們可以通過域名後面接 /ghost/
來進入控制檯,這裡可以對部落格進行配置(主題等),也可以創作、管理文章,enjoy!
全站 Https
這一部分內容在 官方文件有提及。上面指明 CLI 可以通過 Let's Encrypt 生成一個免費的證照。CLI 還將生成第二個 NGINX 配置檔案,以通過埠 443 提供 https 流量。
Let's Encrypt
Let's Encrypt 提供瀏覽器免費接受的SSL證照!這是由非盈利性網際網路安全研究小組(ISRG)提供的。
獲取 Let's Encrypt 提供的 SSL 免費證照
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto
複製程式碼
執行之後會讓你輸入郵箱,並且選擇一些選項。我搭建部落格時選項分別是:
- 是否同意把一些郵件資訊共享
- 為哪些域名生成 SSL
- 是否把 Http 請求重定向到 Https
不知道會不會變,總之根據自己的需要一個接一個選完就可以了。
如果一切順利,會提示:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/lision.me/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/lision.me/privkey.pem
Your cert will expire on 2018-01-17. To obtain a new or tweaked
version of this certificate in the future, simply run
letsencrypt-auto again with the "certonly" option. To
non-interactively renew *all* of your certificates, run
"letsencrypt-auto renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
複製程式碼
指令碼自動獲取 SSL 證照
嘛~ SSL 是申請配置好了,但是很快就過期了(90 天),有什麼辦法能延長期限呢?
裡面有中文使用說明。
CDN 優化
CDN (content delivery network or content distribution network) 是代理伺服器及其資料中心的地理分散式網路。目標是相對於終端使用者在空間上分配服務,以提供高可用性和高效能服務。 CDN 服務於當今網際網路的大部分內容,包括網路物件(文字,圖形和指令碼),可下載物件(媒體檔案,軟體,文件),應用程式(電子商務,入口網站),直播流媒體,點播流媒體和社交網路。
如果我們的部落格有很多質量很高的圖片或者其他多媒體(比如教程視訊等)就會拖慢我們的網站訪問速度,這時可以通過 CDN 優化來加快我們的站點訪問速度。
我這裡使用了七牛 CDN 雲服務,因為考慮到七牛 CDN 對國內支援比較友好,加上它還自帶一些我比較需要的服務(比如圖片水印和原圖保護)。
- 申請七牛 CDN 賬號
- 建立儲存物件
- 配置圖片樣式(壓縮,水印,原圖保護)
- 上傳自己文章中用到的精選配圖
- 輸出外鏈
- 引入到自己的 Markdown 文章中
檢測網站載入速度
配置好 CDN 服務之後建議使用 Google PageSpeed Insights(支援模擬移動裝置測試)跑分,它不僅可以檢測你的站點開啟速度,還可以給你提供改善的建議。
總結
在浩瀚無垠的網際網路中,終於有了一個屬於我們自己的空間。
用心創作每一篇文章,是我對這個空間的溫柔。
參考文章
補充~ 我建了一個技術交流微信群,想在裡面認識更多的朋友!如果各位同學對文章有什麼疑問或者工作之中遇到一些小問題都可以在群裡找到我或者其他群友交流討論,期待你的加入喲~
Emmmmm..由於微信群人數過百導致不可以掃碼入群,所以請掃描上面的二維碼關注公眾號進群。