一些防止 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 個週末和很多個晚上呢,該來好好休息一下了~

(›´ω`‹ )