I use Ubuntu on regular basis btw

這是我第一篇正式的Blog,我有想到很多題材可以寫,不過我覺得既然自己從零開始架了一個server來做blog,有什麼比記錄自己怎麼架blog server來得更合適呢?

先來介紹一下blogging的環境,這一整個版面是用Ghost做出來的,背後的Web Server是使用Nginx,硬體部分是使用AWS的EC2以及Route53。先來介紹一下blogging的環境,這一整個版面是用Ghost做出來的,背後的Web Server是使用Nginx,硬體部分是使用AWS的EC2以及Route53。

整理

  • Blog平台: Ghost
  • 官網
  • Web Server: Nginx
  • Hardware: AWS EC2
  • DNS Server: Route 53

Why Ghost?

Ghost是一個從2013年就釋出的項目,用JaraScript平台的node.js做編寫,以nginx作為webserver。

為什麼用Ghost...........我完全只是因為他看起來超炫炮,官網做的很美,該有的功能都有,甚至還可以用markdown來做blogging,編輯的環境很像是Jupyter Notebook一樣,一塊一塊的,想插入什麼就加入什麼。

想插入什麼就加入什麼

但以我到目前的體驗下來,我覺得缺點也還是有XD

缺點例如主題的選擇跟排版的選擇都不夠自由,主題挑來挑去我都找不到自己滿意的,但是可以再付費買,或是自己做

另外,我認為對草稿做versioning應該會是很棒的功能,畢竟有的時候手一滑就會造成悲劇,可惜Ghost目前還沒有內建這個功能,有一個外掛SQLite的方式可以,請看

來源自:https://twitter.com/ostechnix/status/1392390052022423554?lang=eu

我先說我不是用Arch,我只是很喜歡這個迷因XD

現行架構

我們先從這個blog server的架構開始解說起,以下是架構簡圖與預算。

這是目前的架構,當然如果隨著流量變高,一台instance頂不住的時候就該改架構了
目前的架構的價格試算,與Ghost Pro的Basic Plan的25美金還要便宜一點

目前使用的架構一切以低價格為目標,一台EC2就包辦Web Server與Database,連資料都存在EBS root volume裡面。當然如果這一台機器被弄掛了或是塞住了,整個網站就進不去了,所以我用了一個SNS服務來負責告訴我,https://wugurdriller.com:443/這個endpoint是否送request之後的回覆的status code是200,以此來做Health Check的依據。如果我的Health Check沒有通過的話,SNS會馬上寄一封email到我自己的信箱,警告我機器出事了,我就可以在最短的時間內解決問題。

另外,如果發生了不可預期的事情造成硬碟損壞,或是我想復原某個文章內容,我可以藉由EBS Snapshot來做還原。我設定了一個Snapshot Policy在EBS LifeCycle Manager,設定每天固定時間做一個Snapshot存在S3裡面,這樣子可以確保自己辛苦打的文章還有幾個備份。不過如果我想要復原自己一個小時前的文章內容,我可以用scheduled job寫shell script固定trigger,用mysqldump的指令把整個database存成.sql檔案,這樣在某種程度上也可以解決Ghost沒有versioning功能的問題。

未來架構

在現行的架構上,如果網站的流量越來越大,就很容易在訪問網站的時候出現Gateway Timeout,造成連線逾時,沒辦法訪問網站。因此我們可以使用Load Balancer去分擔流量,那麼每一台EC2的負荷就可以更低。

另外,我們也可以把MySQL的服務從EC2當中拿出來,直接改用RDS服務,並且打開Multi AZ的設定,讓一台MySQL做Standby Instance,這樣就可以保持High Availability。更甚者,如果我們發現,MySQL的Query執行速度偏慢時,我們可以選擇在不同的AZ架設Read Replica增加Query讀的效能。不過我不認為像是blog這種服務需要用到非常複雜的Query,這值得好好觀察。

當然,我們依然可以把EBS做Snapshot備份,畢竟並不是blog之中所有的東西都是存在MySQL,例如圖片跟Ghost的外掛插件都在EC2之中,因此還是需要備份的。

不過像這種Web Server,每次更新文章時可能都需要排一個job去把圖片或是javascript去做同步,可能可以用rsync或是把snapshot直接覆蓋上另一台的EBS。

另外,在安裝Ghost時,會需要用到acme.sh做自動化的加密憑證。但是在Ghost內建的cli,ghost setup的程序中憑證只針對你提供的域名做憑證,像是Wildcard Certificate這種可以對所有的子域名(Sub domain)做憑證是要多做設定的。ghost setup在ssl裡面的選擇看起來不夠彈性,而且我們要對不同的web server做同樣的設定的憑證,想一想就覺得超麻煩。

因此如果是多台機器的話我不會選擇ghost setup ssl,我會用Amazon Certificate Manager(ACM),申請一個Wildcard Certificate,或是就一個單純的Certificate。放進Application Load Balancer(ALB)中,讓這個ALB連到2台web server。這樣就可以不用對兩台機器分別做ghost setup ssl設定。甚至未來想要多申請一個Wildcard Certificate都很方便。

未來可以使用的架構,但此圖並未增設Read Replica

Steps

現在我會用現行的架構來解釋自己是怎麼架設網站的, 我認為可以把整個架構差分成以下幾個小篇章,以免單篇閱讀量過大造成大家身體不適。

  1. Ghost介紹以及架構解說
  2. 在Route53註冊域名(Domain Name)與架設VPC(Virtual Private Cloud)
  3. 啟EC2
  4. 設定Route 53 Hosted Zone與Elastic IP與安裝Ghost
  5. 用Health Check + SNS建立警告系統與使用Lifecycle Manager定期創造Snapshot
Widget is loading comments...