Nginx 調整效能 (持續更新)
BUBU 因公司的站台有對外服務之前都是用系統預設的方式進行運行,後面因系統改版出現異常的問題或者連線過慢,跟 ChatGPT
詢問後在某次停機時順便調整參數來測試,後面觀察之前發生的問題已沒有在發生,本篇記錄怎麼做調整處理
2024.08.09 這個參數的規格是 CPU:8核、RAM:16G 承載 5000 人
2024.09.19 更新 TCP 優化參數及支援 HTTP/3
運行環境
環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式
- 系統環境: Debian 12
- Web 服務: Nginx 1.27
- PHP 服務: PHP 8.3
設定過程
系統調整
調整作業系統對於文件限制
- 調整文件描述符限制以支持高並發連接
vim /etc/security/limits.conf
# 對於所有用戶設置文件描述符限制
* soft nofile 100000
* hard nofile 100000
# 對於所有用戶設置進程數限制
* soft nproc 65535
* hard nproc 65535
# 對於所有用戶設置內存鎖定限制(可選)
* soft memlock 16384
* hard memlock 16384
# 對於所有用戶設置核心文件大小限制
* soft core 0
* hard core 0
# 對於所有用戶設置最大文件大小限制
* soft fsize 1000000 # 1GB
* hard fsize 2000000 # 2GB
# 特定用戶的設置(www-data 用於 Nginx 和 PHP-FPM,用戶名根據實際情況調整)
www-data soft nofile 100000
www-data hard nofile 100000
www-data soft nproc 65535
www-data hard nproc 65535
www-data soft memlock 16384
www-data hard memlock 16384
www-data soft core 0
www-data hard core 0
www-data soft fsize 1000000
www-data hard fsize 2000000
# 對於 Node.js 應用運行用戶(用戶名根據實際情況調整)
nodejs soft nofile 100000
nodejs hard nofile 100000
nodejs soft nproc 65535
nodejs hard nproc 65535
nodejs soft memlock 16384
nodejs hard memlock 16384
nodejs soft core 0
nodejs hard core 0
nodejs soft fsize 1000000
nodejs hard fsize 2000000
- 確保 PAM 應用這些限制
vim /etc/pam.d/common-session
session required pam_limits.so
vim /etc/pam.d/common-session-noninteractive
session required pam_limits.so
網路優化(KVM)
調整網路優化
- 網路優化參數
vim /etc/sysctl.conf
# 增加允許的端口範圍
# 設置本地使用的端口範圍,允許更多的並發連接
net.ipv4.ip_local_port_range = 1024 65535
# 增加TCP接收和發送緩衝區的大小
# net.core.rmem_max 和 net.core.wmem_max: 設置TCP接收和發送緩衝區的最大值,提高網絡吞吐量。
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# 增加TCP隊列的最大長度
# 增加系統允許的最大TCP連接數
net.core.somaxconn = 65535
# 優化TCP參數
# 定義了系統在未收到客戶端確認的情況下,為每個監聽端口保留的最大初始 SYN 請求隊列長度。
net.ipv4.tcp_max_syn_backlog = 4096
# 設置系統對於主動關閉連接的一方,保持在 FIN-WAIT-2 狀態的時間。
net.ipv4.tcp_fin_timeout = 15
# 禁用TCP時間戳(提高性能)
# TCP 時間戳用于防止序列號重複和計算 RTT(往返時間),但會增加每個 TCP 包的開銷。
net.ipv4.tcp_timestamps = 0
# 快速回收TIME-WAIT sockets
# 允許在新的連接中重用處於 TIME-WAIT 狀態的套接字。
net.ipv4.tcp_tw_reuse = 1
# 啟用SYN cookies,防止SYN泛洪攻擊
# 啟用 SYN cookies,當 SYN 請求佔滿隊列時,系統會啟用 SYN cookies 機制,防止 SYN 泛洪攻擊。
net.ipv4.tcp_syncookies = 1
# 增加網路設備接收隊列的大小
# 定義了網絡接口接收隊列的最大長度,當內核無法及時處理接收到的數據包時,這些數據包會暫存在隊列中。
net.core.netdev_max_backlog = 5000
# 啟用 TCP 壅塞演算法 - BBR
# 設置 TCP 擁塞控制算法。bbr 是由 Google 開發的新型算法,能提高網絡吞吐量並降低延遲。
net.ipv4.tcp_congestion_control = bbr
# 設置網絡設備的默認排隊規則(隊列算法)。fq(Fair Queuing)適合與 BBR 一起使用。
net.core.default_qdisc = fq
# TCP Fast Open(TFO)允許在 TCP 三次握手期間傳輸數據,減少連接建立的延遲
net.ipv4.tcp_fastopen = 3
記憶體優化(KVM)
調整記憶體優化
- 系統內存優化
vim /etc/sysctl.conf
# 增加共享憶記體大小,根據實際憶記體大小進行調整建議是實際記憶體一半
# 定義單個共享記憶體段可以分配的最大大小(以位元組為單位)。
kernel.shmmax = 8589934592 # 8GB
# 定義整個系統可使用的共享記憶體總頁數。
kernel.shmall = 2097152 # 2GB
# 減少 swappiness,以便盡量使用物理憶記體而非交換分區
# 控制系統交換(Swap)記憶體的傾向,取值範圍為0-100。
vm.swappiness = 10
# 禁用文件系統訪問時間記錄
# 為限制快取儲存的百分比閥值,當快取超過此值時,系統會阻止(Block)任何寫入行為,直到記憶體中的快取被寫入到硬碟
vm.dirty_ratio = 10
# 為 Linux 中用來保存做為快取的百分比(不同發行版可能預設有不同的比例),超過此值時會觸發從記憶體寫入硬碟的動作
vm.dirty_background_ratio = 5
# 調整文件系統緩存的回寫間隔
# 定義 dirty data 在內存中停留的最長時間(以百分之一秒為單位);
vm.dirty_expire_centisecs = 12000
# 設置後台進程(pdflush)檢查 dirty data 並將其寫入磁盤的時間間隔(以百分之一秒為單位)。
vm.dirty_writeback_centisecs = 500
- 以上更改完後套用參數
sudo sysctl -p
在 PVE 的 LXC 設定
BUBU 因線上的服務都習慣用 LXC
方式建置,但以上的參數可能在 LXC
有些參數會失效,但建議修改 客機 的設定檔以下是設定部份
- 要修改參數請先把該 客機 先關機,設定檔位置
vim /etc/pve/lxc/xxx.conf
lxc.mount.auto: proc:rw
lxc.mount.auto: sys:rw
lxc.mount.auto: cgroup:mixed
lxc.sysctl.net.ipv4.ip_local_port_range = 1024 65535
lxc.sysctl.net.core.rmem_max = 16777216
lxc.sysctl.net.core.wmem_max = 16777216
lxc.sysctl.net.core.rmem_default = 262144
lxc.sysctl.net.core.wmem_default = 262144
lxc.sysctl.net.core.somaxconn = 65535
lxc.sysctl.net.ipv4.tcp_max_syn_backlog = 4096
lxc.sysctl.net.ipv4.tcp_fin_timeout = 15
lxc.sysctl.net.ipv4.tcp_timestamps = 0
lxc.sysctl.net.ipv4.tcp_tw_reuse = 1
lxc.sysctl.net.ipv4.tcp_syncookies = 1
lxc.sysctl.net.core.netdev_max_backlog = 5000
lxc.sysctl.net.ipv4.tcp_congestion_control = bbr
lxc.sysctl.net.core.default_qdisc = fq
lxc.sysctl.net.ipv4.tcp_fastopen = 3
lxc.sysctl.kernel.shmmax = 8589934592
lxc.sysctl.kernel.shmall = 2097152
lxc.sysctl.vm.swappiness = 10
lxc.sysctl.vm.dirty_ratio = 10
lxc.sysctl.vm.dirty_background_ratio = 5
lxc.sysctl.vm.dirty_expire_centisecs = 12000
lxc.sysctl.vm.dirty_writeback_centisecs = 500
設定 PHP-FPM 優化
- 調整
PHP-FPM
設定vim /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s|^pm.max_children = 5.*$|pm.max_children = 200|" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s|^pm.start_servers = 2.*$|pm.start_servers = 20|" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s|^pm.min_spare_servers = 1.*$|pm.min_spare_servers = 10|" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s|^pm.max_spare_servers = 3.*$|pm.max_spare_servers = 30|" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s|^;pm.max_requests = 500.*$|pm.max_requests = 2000|" /etc/php/8.3/fpm/pool.d/www.conf
- 參數說明
- pm = dynamic:動態調整進程數量,適應請求負載變化。
- pm.max_children = 200:設置進程數量上限,防止內存耗盡。
- pm.start_servers = 20:在啟動時創建足夠的進程以快速響應請求。
- pm.min_spare_servers = 10 和 pm.max_spare_servers = 30:維持適當數量的空閒進程,以平衡響應速度和資源使用。
- pm.max_requests = 2000:防止長時間運行的進程引發內存洩漏,確保系統穩定性。
設定 Nginx 優化
- Nginx 全域設定
vim /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 8192;
multi_accept on;
use epoll;
}
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_min_length 1000;
gzip_proxied any;
gzip_disable "msie6";
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;