iT邦幫忙

2

VPS Web Server多網站的架構

如果有5個wordpress,html之類的不同類型的網站
從小規模網站開始慢慢做到大規模網站
請益兩種架構上有什麼優缺點,第二種架構除了省下多台主機費用之外,想不到還有什麼優點

一.
三台VPS
一台做nginx反向代理,一台用不同目錄去分網站,一台DB
https://ithelp.ithome.com.tw/upload/images/20211013/20106446R06ZyqlNTg.jpg

二.
只用一台VPS
用Docker把各自服務切開,每個網站phpfpm、nginx各自獨立容器,個別去維護不互相干擾
https://ithelp.ithome.com.tw/upload/images/20211013/20106446R6LmIgEiyh.jpg

10
raytracy
iT邦大神 1 級 ‧ 2021-10-13 13:28:38
最佳解答

從外洩來看:
兩者沒差, 因為你的應用程式都是 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 擋在前面了.

看更多先前的回應...收起先前的回應...
黃彥儒 iT邦高手 1 級 ‧ 2021-10-13 13:39:41 檢舉

想請教,如果單一網站因為某些因素被入侵,目標是改主題掛廣告或是改PHP碼之類的,那麼第一個方案橫向移動到其他網站的難易度是不是比後者還要容易?

raytracy iT邦大神 1 級 ‧ 2021-10-13 13:45:15 檢舉

理論上是, 如果他是自建這個架構, 而且沒有做 OS Hardening 的話....

不過, 透過適當配置 SELinux 和分隔 Web User 帳號, 可以預防此類事件發生; 或者用比較嚴格區隔用戶的 Panel 軟體, 如: Plesk, CloudLinux 的 CageFS 之類也可以阻止 (但我個人不推 CloudLinux)....

當然, 如果他能提權到 root 等級, 那以上就都沒有用了.....不過, 如果都可以到 root 等級, 那連方案二的 Docker/Container 也是沒有用的....

感謝大神分析
請教如果遇到效能瓶頸的時候,改成方案一比較容易解決是嗎
方案二每個網站都是獨立的Container,前面RP還有負責去自動要sl let's encrypt
方案一是從方案二角度去構思,只有前端RP有對外,然後轉發到後面主機,這樣後面的nginx有多此一舉嗎?

raytracy iT邦大神 1 級 ‧ 2021-10-15 11:08:37 檢舉

如果效能瓶頸指的是: 硬體規格上限的話, 方案一的擴充比較容易針對刀口上控制預算; 方案二就是不管誰慢, 通通都一起往上提升, 這樣容易造成規格上的浪費.

如果方案二後面是獨立 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) 的部分

0
黃彥儒
iT邦高手 1 級 ‧ 2021-10-13 12:01:02

後面的安全性比較高,Docker裡面一般來說就算出包也只是同一個Docker裡面被看光光

1
雷N
iT邦新手 2 級 ‧ 2021-10-13 13:14:58

第二種好處, 就是你程式跟設定檔, 可能都yaml或dockerfile化了,
在自己本機或其他可能測試環境上也能快速佈署一套

我要發表回答

立即登入回答