如果有5個wordpress,html之類的不同類型的網站
從小規模網站開始慢慢做到大規模網站
請益兩種架構上有什麼優缺點,第二種架構除了省下多台主機費用之外,想不到還有什麼優點
一.
三台VPS
一台做nginx反向代理,一台用不同目錄去分網站,一台DB
二.
只用一台VPS
用Docker把各自服務切開,每個網站phpfpm、nginx各自獨立容器,個別去維護不互相干擾
從外洩來看:
兩者沒差, 因為你的應用程式都是 WP, 不管網站之間有沒有隔離開來, 我入侵任何網站, 拿到的程式都是官方給的 WP 原始碼, 毫無價值; 每個網站的差異處是在 DB 裡面...
但是你兩案後端的 DB, 都是連到同一台 DB Server 去, 我只要能從任何一個網站入侵, 橫向移動到 DB Server 之後提權到 root, 每個網站的資料我都可以拿到手, 不管從哪入侵都可辦到....
從災難來看:
方案二如果 Disk 掛掉, 連資料都一起掛; 方案一如果 DB 沒掛就沒事; 有人會覺得: 可是那 DB 磁碟也是有機會掛啊? 是的, 但這邊我們不只討論意外損害, 還包括人為的蓄意損害, 例如: 有人入侵網站主機之後, 功力不夠, 想盡辦法都無法取出你的 DB 資料, 一怒之下, 就下個 rm -rf / 指令, 這時候, 哪一個方案可以保住珍貴的 DB?
從效能上看:
方案二會遇到 DB vs PHP 互相競爭 CPU/RAM/IO 資源的問題. 舉例來說, 你該保留多少 RAM 給 DB 專用? 2GB? 4GB? 那萬一跑幾個月, 突然有個網站的 PHP 需要用 8GB RAM, 你該怎麼辦? (假設 VPS 預算固定不能加的話)
還有, 方案一為何還需要一台 Reverse Proxy? Nginx 本身就可以做到 Named Virtual Hosting, 只 Listen 一個 80/443 port 就可以接入多個網站;.....前面又套一個 RP 不是做兩次工?
方案二也是一樣, Nginx 前面不需要另外加 RP 就可以辦到. 除非你要把每個網站, 包成自己獨立的一個 Container 來部署, 才需要前面的 RP.
或者, 你圖中畫的第二層, 其實不是 Nginx, 而是只有 PHP-FPM, 那這樣就真的需要有一個獨立的 Reverse Proxy 擋在前面了.
理論上是, 如果他是自建這個架構, 而且沒有做 OS Hardening 的話....
不過, 透過適當配置 SELinux 和分隔 Web User 帳號, 可以預防此類事件發生; 或者用比較嚴格區隔用戶的 Panel 軟體, 如: Plesk, CloudLinux 的 CageFS 之類也可以阻止 (但我個人不推 CloudLinux)....
當然, 如果他能提權到 root 等級, 那以上就都沒有用了.....不過, 如果都可以到 root 等級, 那連方案二的 Docker/Container 也是沒有用的....
感謝大神分析
請教如果遇到效能瓶頸的時候,改成方案一比較容易解決是嗎
方案二每個網站都是獨立的Container,前面RP還有負責去自動要sl let's encrypt
方案一是從方案二角度去構思,只有前端RP有對外,然後轉發到後面主機,這樣後面的nginx有多此一舉嗎?
如果效能瓶頸指的是: 硬體規格上限的話, 方案一的擴充比較容易針對刀口上控制預算; 方案二就是不管誰慢, 通通都一起往上提升, 這樣容易造成規格上的浪費.
如果方案二後面是獨立 Container, 那就需要有一個 RP 在前面轉發; 這樣的話, 獨立 Container 裡面可以不需要跑 Nginx, 只要跑 PHP-FPM 就夠了
簡單畫一下你的架構:
Nginx(RP)->Nginx(Web)+PHP-FPM(php)->DB
這樣 Nginx 會跑兩層, 要處理兩次 HTTP Request
其實你可以:
Nginx(RP+Web)->PHP-FPM(php)->DB
這樣只會通過一次 Nginx, 就處理完 HTTP(S) 的部分
第二種好處, 就是你程式跟設定檔, 可能都yaml或dockerfile化了,
在自己本機或其他可能測試環境上也能快速佈署一套