Skip to main content

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;

補充說明


備註





參考相關網頁