潮潮的Ghost + AWS EC2 部署

說要開始寫blog說了好久,本來想在wordpress.com下手,但是免費版的會出現廣告,付費版又有客製化限制。後來工作關係開始接觸自架wordpress,theme的修改和plugin也研究的差不多(花了好多時間),正當著手建站之際正好就看到了Ghost這個blog系統,簡潔的版面讓愛慕虛榮務實的我一眼就愛上,花了幾天研究一下就決定是他了!
ghost

歸納了一些我選擇的原因:

  • 美:不管前後台都美,支援RWD,預設的theme就已經很漂亮。
  • 發文預設支援markdown:markdown上手的話真的很方便。
  • 使用node.js:對於應付大量請求效能更好,雖然目前本站根本沒啥請求...
  • 簡潔:wordpress雖然有很多套件可以兜,不過單純寫blog不太需要那麼多功能,整體操作體驗和Medium很像。
  • 安裝快速:雖然各大空間主機都有支援wordpress免安裝懶人包,但是從頭裝到尾的程序上ghost還是簡便很多。
  • 簡單的來說,wordpress強大,ghost單純。

藉由這次機會也順便申請了AWS EC2免費一年的主機來玩玩看,分享一下安裝心得

Ghost (v1.6.1) 環境需求


  • 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

AWS ec2主機建立


AWS提供一年免費的服務,其中ec2可使用t2.micro的規格750小時,並且可使用30GB的EBS空間。
1.註冊完AWS帳號登入後,右側的地區記得選Tokyo
2.SERVCIE > EC2 >Instance > Lunch Instance
3.挑選Amazon Machine Image:這裡可以選兩種方式,最快的是到AWS Marketplace找到bitnami打包的ghost,馬上可建站;或者是在Quick Start挑選Ubuntu Server 16.04LTS,自己從頭安裝。兩種我都試過了,從頭安裝其實不會太麻煩。
4.接下來步驟可參考AWS上的啟動Linux機器10分鐘教學,主機要選擇t2.micro,另外在選擇Key Pair的地方要注意一定要選擇創建新的key或者原本在ec2主控台的Key Pairs下自行建立的key,預設ssh連線主機都使用金鑰連線。創建好的private key不要亂丟要收好。
ec2 key
5.依照上面的步驟完成主機建置,我們這裡選擇ubuntu16.4主機的預設登入user id是ubuntu

Ghost安裝


以下步驟參照ghost官方production環境建置

Create User

創建自己想要的帳號,如果想要用預設的id ubuntu,那這部分可以略過

$ adduser <user>

賦予sudo權限

$ usermod -aG sudo <user>
$ su - <user>     //登入user下繼續其他操作

更新ubuntu內的package

應該是使用apt-get之前的好習慣

$ sudo apt-get update
$ sudo apt-get upgrade

安裝Nginx

$ sudo apt-get install nginx

如果主機ufw防火牆有開啟,要允許nginx服務通過,可以使用ufw status查詢是否啟動,但這裡我就直接在ec2上的Security Groups設定安防火牆,不想使用ufw的可跳過

$ sudo ufw allow 'Nginx Full'

安裝mysql

輸入以下指令後並依照指引設定root的密碼

$ sudo apt-get install mysql-server

安裝node.js

先將node 6的apt repository匯入後再安裝

$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash 
$ sudo apt-get install nodejs

安裝ghost

var/www/下建立ghost資料夾,執行ghost install

$ mkdir /var/www/ghost
$ cd /var/www/ghost
$ ghost install

這裡就會發現ghost超貼心,除了安裝程式外,還可以幫你把mysql、nginx設定檔全部搞定!

其他設定


資料夾權限設定

我自己的習慣是建立一個群組,把user和web server使用的www-data加入,ghost本身會產生一個id 叫ghost,也可以ㄧ併加入。

$ sudo groupadd -r webgroup
$ sudo usermod -a -G webgroup <user>
$ sudo usermod -a -G webagroup www-data
$ sudo usermod -a -G webgroup ghost

接下來把/var/www/ghost資料夾權限id:group設定為user:webadmin

$sudo chown -R <user>:webgroup /var/www/ghost/
$sudo chmod -R 775 /var/www/ghost/

vsftpd設定

安裝vsftpd

$sudo apt-gate install vsftpd

修改vsftpd設定檔

$sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup
$sudo vi /etc/vsftpd.conf

將設定調整為以下,如果裡面沒有的要自己加上去

# Uncomment this to enable any form of FTP write command.
write_enable=YES
# Uncomment this to allow local users to log in.
local_enable=YES

#以下自己新增的,將ftp設定為passive mode
pasv_enable=YES
pasv_min_port=13000
pasv_max_port=13100
port_enable=YES
pasv_address=[public dns from the amazon EC2 instance]
pasv_addr_resolve=YES

這裡設定為passive mode的原因,主要是因為ftp溝通和傳輸通常是不同port。
active mode ftp 來說,client端發送請求到port 21,server端則由port 20發起傳送data的請求,這種情況如果在client端有防火牆的狀況,就有可能不會通,而passive mode可以解決這個問題,詳細可參考主動式與被動式FTP比較

防火牆設定

回到aws ec2的控制台,NETWORK & SECURITY > Security Groups 下,找到這台ec2主機所套用安全規定的group id(或是去Instance裡面找),設定inbound role,把80、20、21、passivemode的那些port打開:
-----2017-08-20---10.51.30
完成後應該就可以開心地使用了。
記得如果使用ftp,模式要記得改為passive被動模式。