一些防止 Linux 伺服器爆炸的設定
2025-03-25
閒聊
關於上次提到我的其中一個網站被 Cloudflare ban 掉了,結果兜兜轉轉還是回到 self-managed 伺服器的方案,然而幾年前用的 Digital Ocean 的每月 4TB 流量如今已經應付不了網站的流量了,試了幾間公司,暫定先用 OVH 嘗試看看
OS 和硬件的選擇
OVH 只有 CentOS 7 所以我選了 Rocky Linux、一個 Red Hat 的下游,我購買的新加坡 AMD VPS 有 4 個 vCPU 和 4GB RAM,每月只要 $11,超級便宜!!!就是亞洲伺服器每月超過 2TB 頻寬後會限速至 10mbps,這個之後再解決,大不了多開幾個伺服器做 load balancing~
關閉 SELinux
除了搬伺服器,我這次還把所有 containerize 所有的 service,但在 SELinux 的管理下使用 docker 有很多奇怪的問題,所以我便決定關掉它,反正我也不會安裝其他程序所以應該還好
檢查 SELinux 是否開啟
> sestatus
SELinux status: disabled
暫時關閉 SELinux,重啟後會重設
> setenforce 0
永久關閉設定,修改檔案
> nano /etc/selinux/config
把 SELINUX
設為 disabled
,重啟後便會自動生效
...
# SELINUX=enforcing
SELINUX=disabled
設定 Firewalld
OVH 的防火牆只有一個字「爛!」而且是爛死了,擋不擋得掉完全像是看心情的,還不能阻擋 internal IP,有點難想像這個年代連這些基本功能也做不好,而且那個破 UI 也沒比它的防火牆好,我也懶得再它的網頁糾纏,最後還是得靠系統防火牆
安裝並啟動 firewalld,不會立即擋掉 ssh 所以可以放心 enable
> sudo yum install firewalld
> systemctl enable --now firewalld
建立 zone 並設定條件只開放 http, https, ssh
> sudo firewall-cmd --set-default-zone=drop
> sudo firewall-cmd --zone=drop --add-service=http --permanent
> sudo firewall-cmd --zone=drop --add-service=https --permanent
> sudo firewall-cmd --zone=drop --add-service=ssh --permanent
然後我會給自己的 IP 開放全部 port
> sudo firewall-cmd --zone=drop --add-rich-rule='rule family="ipv4" source address="x.x.x.x/32" accept' --permanent
重新載入並套用設定
> sudo firewall-cmd --reload
> sudo firewall-cmd --list-all
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: eth0
sources:
services: http https ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="x.x.x.x/32" accept
啟動 Swap 和 kernel panic
如果像我一樣只有 4GB RAM,還要在 VPS 這類 shared CPU 的環境的話,即使你的 service 很穩定、使用很少資源,也有機率 (而且不低) 莫明其妙地突然飆升到 100%,然後你的 watchdog 便會開始搞事,最後輕則重啟,更嚴重的是卡死在這個狀況直至某天被發現…
Swap
所以為了防止這樣我會直接設定 8GB swap
> sudo fallocate -l 8G /swapfile
> sudo chmod 600 /swapfile
> sudo mkswap /swapfile
> sudo swapon /swapfile
檢查是否生效
> sudo swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 8G 1G -2
> free -h
total used free shared buff/cache available
Mem: 3.5Gi 2.1Gi 281Mi 11Mi 1.3Gi 1.3Gi
Swap: 8.0Gi 1.0Gi 7.0Gi
設定較低的 swappiness 讓系統更優先使用 RAM
> sudo nano /etc/sysctl.conf
# Add this line
vm.swappiness=10
設定 fstab
> sudo cp /etc/fstab /etc/fstab.bak
> echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Kernel.panic
另外一個設定是 kernel.panic
,在系統出現嚴重錯誤的時候 3 秒後將會自動重啟,這設定能減少卡死的情況 (希望?)
> sudo nano /etc/sysctl.conf
...
kernel.panic = 3
重啟後檢查一下是否 3
> cat /proc/sys/kernel/panic
後記
大概就是這樣吧,這個項目已經很久沒有做過大改動了,而且還一次過搬了 DNS、資料庫、伺服器呢… 說真的實在不好受,還好不是客戶的項目,至少不會收到電話,但壓力還是有的,而且這樣改一次就花了 2 個週末和很多個晚上呢,該來好好休息一下了~
(›´ω`‹ )