跳到主內容

Nginx 調整效能 (持續更新)

  BUBU 因公司的站台有對外服務之前都是用系統預設的方式進行運行,後面因系統改版出現異常的問題或者連線過慢,跟 ChatGPT 詢問後在某次停機時順便調整參數來測試,後面觀察之前發生的問題已沒有在發生,本篇記錄怎麼做調整處理

2024.08.09 這個參數的規格是 CPU:8核、RAM:16G

運行環境


  環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式

  • 系統環境: Debian 12
  • Web 服務: Nginx 1.27
  • PHP 服務: PHP 8.1

設定過程


系統調整

  調整作業系統對於文件限制

  • 調整文件描述符限制以支持高並發連接 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 = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144

# 增加TCP隊列的最大長度
net.core.somaxconn = 65535

# 增加未完成連接的隊列長度
net.ipv4.tcp_max_syn_backlog = 4096

# 禁用TCP時間戳(提高性能)
net.ipv4.tcp_timestamps = 0

# 快速回收TIME-WAIT sockets
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

# 啟用SYN cookies,防止SYN泛洪攻擊
net.ipv4.tcp_syncookies = 1

# 增加網路設備接收隊列的大小
net.core.netdev_max_backlog = 5000
記憶體優化(KVM)

  調整記憶體優化

  • 系統內存優化 vim /etc/sysctl.conf
# 增加共享憶記體大小,根據實際憶記體大小進行調整
kernel.shmmax = 8589934592  # 8GB
kernel.shmall = 2097152     # 2GB

# 減少 swappiness,以便盡量使用物理憶記體而非交換分區
vm.swappiness = 10

# 禁用文件系統訪問時間記錄
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

# 調整文件系統緩存的回寫間隔
vm.dirty_expire_centisecs = 12000
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.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_timestamps = 0
lxc.sysctl.net.ipv4.tcp_tw_recycle = 1
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.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.1/fpm/pool.d/www.conf
sed -i "s|^pm.max_children = 5.*$|pm.max_children = 200|" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s|^pm.start_servers = 2.*$|pm.start_servers = 20|" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s|^pm.min_spare_servers = 1.*$|pm.min_spare_servers = 10|" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s|^pm.max_spare_servers = 3.*$|pm.max_spare_servers = 30|" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s|^;pm.max_requests = 500.*$|pm.max_requests = 2000|" /etc/php/8.1/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
events {
	multi_accept on;
    use epoll;  # 在Linux上使用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;

補充說明


備註





參考相關網頁