這是我第一篇正式的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的方式可以,請看。
我先說我不是用Arch,我只是很喜歡這個迷因XD
現行架構
我們先從這個blog server的架構開始解說起,以下是架構簡圖與預算。
目前使用的架構一切以低價格為目標,一台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都很方便。
Steps
現在我會用現行的架構來解釋自己是怎麼架設網站的, 我認為可以把整個架構差分成以下幾個小篇章,以免單篇閱讀量過大造成大家身體不適。
- Ghost介紹以及架構解說
- 在Route53註冊域名(Domain Name)與架設VPC(Virtual Private Cloud)
- 啟EC2
- 設定Route 53 Hosted Zone與Elastic IP與安裝Ghost
- 用Health Check + SNS建立警告系統與使用Lifecycle Manager定期創造Snapshot