Nginx伺服器常用引數設定

Eric zhou發表於2023-12-22

Nginx作為一個高效能的Web伺服器和反向代理,它的效能可以透過調整底層作業系統的引數來進一步最佳化。以下是一些常見的作業系統級別的調整,通常針對Linux系統:

  1. File Descriptors Limit: 增加檔案描述符的數量可以允許Nginx開啟更多的連線。

    ulimit -n 2048 # 臨時設定,隻影響當前會話 # 要永久設定,在/etc/security/limits.conf中新增: * soft nofile 2048 * hard nofile 4096
  2. TCP/IP Stack Tuning: 最佳化核心引數以提高網路效能。

    • net.core.somaxconn:增加監聽服務的backlog佇列,允許更多等待接受的連線。
      sysctl -w net.core.somaxconn=4096
    • net.ipv4.tcp_max_syn_backlog:針對具有大量併發連線請求的系統,增加SYN佇列的長度。
      sysctl -w net.ipv4.tcp_max_syn_backlog=2048
    • net.ipv4.tcp_tw_reuse:允許重新使用處於TIME_WAIT狀態的socket用於新的TCP連線。
      sysctl -w net.ipv4.tcp_tw_reuse=1
    • net.ipv4.ip_local_port_range:擴大用於出站連線的本地埠範圍。
      sysctl -w net.ipv4.ip_local_port_range="1024 65535"
  3. Disable Swapping: 對於要求高效能的伺服器,通常建議禁用交換空間(swap),因為磁碟I/O速度遠低於記憶體。

    • 透過設定vm.swappiness引數為0來減少交換的使用。
      sysctl -w vm.swappiness=0
  4. File System Tuning: 對於檔案系統的調整,比如使用noatime掛載選項可以提高檔案系統效能,因為它防止了對檔案的訪問時間的更新。

    • /etc/fstab檔案中,可以給相關的掛載點新增noatime選項。
  5. Control Groups (cgroups): 在Linux上,你可以使用cgroups來限制Nginx程式可以使用的資源量。

這些是一些基本的調整,但是實際上可能還有更多的引數和設定可以調整,這取決於你的具體使用場景和系統架構。在進行任何調整之前,確保你瞭解每個引數的作用,並且對你的系統進行了備份。同時,建議在測試環境中先行測試這些更改,以確保它們不會對你的系統穩定性造成負面影響。

另外,要應用這些更改,可以使用sysctl命令,例如sysctl -w parameter=value來立即應用更改,或者修改/etc/sysctl.conf檔案並使用sysctl -p命令來應用並持久化這些設定。對於檔案描述符限制等設定,你可能需要修改/etc/security/limits.conf檔案或相關的服務啟動指令碼。

如果Nginx有大量埠被佔用,可以用以下指令分析埠的佔用情況

netstat -an | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

如果Nginx有大量TimeWait的埠,如何分析解決:

TIME_WAIT 是 TCP 連線在正常關閉後的一種狀態。這個狀態的存在對於網路的健康運作是必要的,因為它可以確保連線雙方都能正常接收到所有的資料包,並且確保舊連線的延遲資料包不會對新的連線產生干擾。

在 TIME_WAIT 狀態,作業系統會保持這個連線的埠號和其他資源一段時間(通常是2個最大報文生命週期(MSL))。這個時間段通常是60秒,但可以透過調整核心引數來修改。在這段時間內,埠號被認為是"正在使用"的,所以它不能被分配給新的TCP連線。如果伺服器頻繁地開啟和關閉連線,這可能會導致大量的埠處於 TIME_WAIT 狀態,這在高效能或高併發的伺服器上可能成為一個問題。

TIME_WAIT 狀態佔用的埠並不是“使用中”(active use)的埠,它們不再參與資料傳輸,但是這些埠不能立即被新的TCP連線使用。這可能導致埠資源的短暫耗盡,尤其是在高流量的伺服器上,如Web伺服器,可能需要快速回收和重新使用埠。

要減少 TIME_WAIT 狀態對埠資源的影響,你可以:

  1. 調整 TIME_WAIT 時間:

    • 透過減少 net.ipv4.tcp_fin_timeout 的值來減少 TIME_WAIT 狀態的持續時間。
    • 例如:sysctl -w net.ipv4.tcp_fin_timeout=30 可以將 TIME_WAIT 時間減少到30秒。
  2. 啟用埠複用:

    • 設定 net.ipv4.tcp_tw_reuse 為 1,允許系統在安全的情況下更快地複用 TIME_WAIT 狀態的埠。
    • 例如:sysctl -w net.ipv4.tcp_tw_reuse=1
  3. 增加本地埠範圍:

    • 透過擴大 net.ipv4.ip_local_port_range 的範圍,可以增加可用於出站連線的埠數量。
    • 例如:sysctl -w net.ipv4.ip_local_port_range="1024 65535"
  4. 使用長連線:

    • 配置服務和客戶端使用長連線(keep-alive),減少連線的頻繁建立和關閉。
  5. 負載均衡和反向代理:

    • 使用負載均衡器和反向代理來減少後端伺服器上的直接連線數量。
  6. 監控和分析:

    • 持續監控系統狀態,分析網路流量模式,以識別可能導致大量 TIME_WAIT 的行為並進行最佳化。

請注意,net.ipv4.tcp_tw_recycle 選項已在 Linux 4.12+ 核心中移除,因為它與網路地址轉換(NAT)不相容,可能導致連線問題。

在調整這些引數時,要注意它們可能對網路通訊的可靠性和效能有重大影響,任何更改都應該小心翼翼地進行,並在實施之前充分測試。

 

相關文章