1.調整文件描述符
# 查看當前系統文件描述符限制
ulimit -n# 永久修改文件描述符限制
# 編輯 /etc/security/limits.conf 文件,添加以下內容
* soft nofile 65535
* hard nofile 65535# 編輯 /etc/sysctl.conf 文件,添加以下內容
fs.file-max = 65535
2.調整內核參數
vim /etc/sysctl.conf
net.core.somaxconn = 65535 # 最大連接隊列長度
net.core.netdev_max_backlog = 65535 # 網絡設備最大隊列長度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN 隊列長度
net.ipv4.tcp_max_tw_buckets= 65535 #TIME_WAIT狀態的連接的最大數量
net.ipv4.tcp_tw_reuse = 1 # 允許重用 TIME_WAIT 連接
net.ipv4.tcp_tw_recycle = 1 # 快速回收 TIME_WAIT 連接
net.ipv4.tcp_fin_timeout = 30 # FIN 超時時間
fs.file-max = 2097152 #系統支持的最大文件描述符數
3.nginx配置優化
1.worker_processes
worker_processes directive指定nginx worker進程的數量。
worker_processes 1;
# lscpu命令來找出CPU的核數。
2.accept_mutex
accept_mutex參數的意義:當一個新連接到達時,如果激活了accept_mutex,那么多個Worker將以串行方式來處理,其中有一個Worker會被喚醒,其他的Worker繼續保持休眠狀態;如果沒有激活accept_mutex,那么所有的Worker都會被喚醒,不過只有一個Worker能獲取新連接,其它的Worker會重新進入休眠狀態。
events {accept_mutex on;}
3.accept_mutex_delay
當accept_mutex功能啟用后,只有一個持有mutex鎖的worker進程會接受并處理請求,其他worker進程等待。accept_mutex_delay指定的時間就是這些worker進程的等待時間,過了等待時間下一個worker進程便取得mutex鎖,處理請求。accept_mutex_delay在events模塊中指定,默認的值為500ms。
events {accept_mutex_delay 500ms;}
4.worker_connections
worker_connections的默認值是512,它在events模塊中。它指定了一個worker進程在同一時間可以處理的最大請求數。
events {worker_connections 512;}
5.worker_rlimit_nofile
worker_rlimit_nofile directive,可以用來設置系統可用的文件描述符。這與ulimit設置可用文件描述符的作用是一樣的。如果它們都設置了可用文件描述符,那么worker_rlimit_nofile會覆蓋ulimit的設置。
worker_rlimit_nofile 20960;
6.multi_accept
multi_accept可以讓nginx worker進程盡可能多地接受請求。它的作用是讓worker進程一次性地接受監聽隊列里的所有請求,然后處理。如果multi_accept的值設為off,那么worker進程必須一個一個地接受監聽隊列里的請求。
events {multi_accept on;}
7.use
指定事件模型,epoll適用于Linux,能提高性能.
events {use epoll;}
8.sendfile
當一個程序需要傳輸文件時,Linux內核首先將文件數據緩沖,然后將文件數據傳送給程序緩沖,最后程序將文件數據傳輸到目的地。Sendfile方法是一種數據傳輸的更高效的方法,數據在內核中的文件描述符之間傳輸,而不需要將數據傳輸給程序緩沖。這種方法的結果是改善了對操作系統資源的利用。
我們可以用sendfile directive來啟用sendfile方法,在http,server,location三個模塊都可以定義。
http {sendfile on ;}
9.TCP_NODELAY
禁用Nagle算法,減少延遲
http {tcp_nodelay on;}
10.TCP_CORK
減少網絡包的數量,提高傳輸效率
http {tcp_nopush on;}
11.keepalive_timeout
長連接超時時間,單位秒
http {# 連接和請求超時設置keepalive_timeout 65; # 長連接超時時間,單位秒client_body_timeout 60; # 讀取客戶端請求主體的超時時間client_header_timeout 60; # 讀取客戶端請求頭的超時時間send_timeout 60; # 向客戶端發送響應的超時時間
}
12.client_body_timeout 60
讀取客戶端請求主體的超時時間
http {# 連接和請求超時設置keepalive_timeout 65; # 長連接超時時間,單位秒client_body_timeout 60; # 讀取客戶端請求主體的超時時間client_header_timeout 60; # 讀取客戶端請求頭的超時時間send_timeout 60; # 向客戶端發送響應的超時時間
}
13.client_header_timeout 60
讀取客戶端請求頭的超時時間
http {# 連接和請求超時設置keepalive_timeout 65; # 長連接超時時間,單位秒client_body_timeout 60; # 讀取客戶端請求主體的超時時間client_header_timeout 60; # 讀取客戶端請求頭的超時時間send_timeout 60; # 向客戶端發送響應的超時時間
}
14.send_timeout 60
向客戶端發送響應的超時時間
http {# 連接和請求超時設置keepalive_timeout 65; # 長連接超時時間,單位秒client_body_timeout 60; # 讀取客戶端請求主體的超時時間client_header_timeout 60; # 讀取客戶端請求頭的超時時間send_timeout 60; # 向客戶端發送響應的超時時間
}
15.client_max_body_size
允許客戶端請求的最大大小,超過此大小會返回413錯誤
http{client_max_body_size 10m;
}
16.Gzip壓縮配置
gzip壓縮功能主要用于在服務器端對響應內容進行壓縮,然后將壓縮后的數據發送給客戶端(如瀏覽器),客戶端收到后會自動解壓縮并使用。
http{# Gzip壓縮配置gzip on; # 開啟Gzip壓縮gzip_vary on; # 根據客戶端是否接受Gzip來決定是否壓縮gzip_comp_level 6; # 壓縮級別,1-9,6是速度和壓縮率的平衡點gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 需要壓縮的MIME類型
}
17.worker_cpu_affinity
將每個 worker 子進程與我們的 cpu 物理核心綁定。
worker_cpu_affinity 0001 0010 0100 1000; # 4個物理核心,4個worker子進程
18.worker_priority
指定 worker 子進程的 nice 值,以調整運行 Nginx 的優先級,通常設定為負值,以優先調用 Nginx 。
worker_priority -10; # 120-10=110,110就是最終的優先級
Linux 默認進程的優先級值是120,值越小越優先;nice 定范圍為 -20 到 +19 。
[備注] 應用的默認優先級值是120加上 nice 值等于它最終的值,這個值越小,優先級越高。
19.worker_shutdown_timeout
指定 worker 子進程優雅退出時的超時時間。
worker_shutdown_timeout 5s;
timer_resolution
worker 子進程內部使用的計時器精度,調整時間間隔越大,系統調用越少,有利于性能提升;反之,系統調用越多,性能下降。