您好,登錄后才能下訂單哦!
Nginx配置參數優化
Nginx作為高性能web服務器,即使不特意調整配置參數也可以處理大量的并發請求。
以下的配置參數是借鑒網上的一些調優參數,僅作為參考,不見得適于你的線上業務。
worker進程
worker_processes
該參數表示啟動幾個工作進程,建議和本機CPU核數保持一致,每一核CPU處理一個進程。
worker_rlimit_nofile
它表示Nginx最大可用的文件描述符個數,需要配合系統的最大描述符,建議設置為102400。
還需要在系統里執行ulimit -n 102400才可以。
也可以直接修改配置文件/etc/security/limits.conf修改
增加:
#* soft nofile 655350 (去掉前面的#)
#* hard nofile 655350 (去掉前面的#)
worker_connections
該參數用來配置每個Nginx worker進程最大處理的連接數,這個參數也決定了該Nginx服務器最多能處理多少客戶端請求
(worker_processes * worker_connections),建議把該參數設置為10240,不建議太大。
http和tcp連接
use epoll
使用epoll模式的事件驅動模型,該模型為Linux系統下最優方式。
multi_accept on
使每個worker進程可以同時處理多個客戶端請求。
sendfile on
使用內核的FD文件傳輸功能,可以減少user mode和kernel mode的切換,從而提升服務器性能。
tcp_nopush on
當tcp_nopush設置為on時,會調用tcp_cork方法進行數據傳輸。
使用該方法會產生這樣的效果:當應用程序產生數據時,內核不會立馬封裝包,而是當數據量積累到一定量時才會封裝,然后傳輸。
tcp_nodelay on
不緩存data-sends(關閉 Nagle 算法),這個能夠提高高頻發送小數據報文的實時性。
(關于Nagle算法)
【假如需要頻繁的發送一些小包數據,比如說1個字節,以IPv4為例的話,則每個包都要附帶40字節的頭,
也就是說,總計41個字節的數據里,其中只有1個字節是我們需要的數據。
為了解決這個問題,出現了Nagle算法。
它規定:如果包的大小滿足MSS,那么可以立即發送,否則數據會被放到緩沖區,等到已經發送的包被確認了之后才能繼續發送。
通過這樣的規定,可以降低網絡里小包的數量,從而提升網絡性能。】
keepalive_timeout
定義長連接的超時時間,建議30s,太短或者太長都不一定合適,當然,最好是根據業務自身的情況來動態地調整該參數。
keepalive_requests
定義當客戶端和服務端處于長連接的情況下,每個客戶端最多可以請求多少次,可以設置很大,比如50000.
reset_timeout_connection on
設置為on的話,當客戶端不再向服務端發送請求時,允許服務端關閉該連接。
client_body_timeout
客戶端如果在該指定時間內沒有加載完body數據,則斷開連接,單位是秒,默認60,可以設置為10。
send_timeout
這個超時時間是發送響應的超時時間,即Nginx服務器向客戶端發送了數據包,但客戶端一直沒有去接收這個數據包。
如果某個連接超過send_timeout定義的超時時間,那么Nginx將會關閉這個連接。單位是秒,可以設置為3。
buffer和cache(以下配置都是針對單個請求)
client_body_buffer_size
當客戶端以POST方法提交一些數據到服務端時,會先寫入到client_body_buffer中,如果buffer寫滿會寫到臨時文件里,建議調整為128k。
client_max_body_size
瀏覽器在發送含有較大HTTP body的請求時,其頭部會有一個Content-Length字段,client_max_body_size是用來限制Content-Length所示值的大小的。
這個限制body的配置不用等Nginx接收完所有的HTTP包體,就可以告訴用戶請求過大不被接受。會返回413狀態碼。
例如,用戶試圖上傳一個1GB的文件,Nginx在收完包頭后,發現Content-Length超過client_max_body_size定義的值,
就直接發送413(Request Entity Too Large)響應給客戶端。
將該數值設置為0,則禁用限制,建議設置為10m。
client_header_buffer_size
設置客戶端header的buffer大小,建議4k。
large_client_header_buffers
對于比較大的header(超過client_header_buffer_size)將會使用該部分buffer,兩個數值,第一個是個數,第二個是每個buffer的大小。
建議設置為4 8k
open_file_cache
該參數會對以下信息進行緩存:
打開文件描述符的文件大小和修改時間信息;
存在的目錄信息;
搜索文件的錯誤信息(文件不存在無權限讀取等信息)。
格式:open_file_cache max=size inactive=time;
max設定緩存文件的數量,inactive設定經過多長時間文件沒被請求后刪除緩存。
建議設置 open_file_cache max=102400 inactive=20s;
open_file_cache_valid
指多長時間檢查一次緩存的有效信息。建議設置為30s。
open_file_cache_min_uses
open_file_cache指令中的inactive參數時間內文件的最少使用次數,
如,將該參數設置為1,則表示,如果文件在inactive時間內一次都沒被使用,它將被移除。
建議設置為2。
壓縮
對于純文本的內容,Nginx是可以使用gzip壓縮的。使用壓縮技術可以減少對帶寬的消耗。
由ngx_http_gzip_module模塊支持
配置如下:
gzip on; //開啟gzip功能
gzip_min_length 1024; //設置請求資源超過該數值才進行壓縮,單位字節
gzip_buffers 16 8k; //設置壓縮使用的buffer大小,第一個數字為數量,第二個為每個buffer的大小
gzip_comp_level 6; //設置壓縮級別,范圍1-9,9壓縮級別最高,也最耗費CPU資源
gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些類型的文件需要壓縮
gzip_disable "MSIE 6."; //IE6瀏覽器不啟用壓縮
測試:
curl -I -H "Accept-Encoding: gzip, deflate" http://www.aminglinux.com/1.css
日志
錯誤日志級別調高,比如crit級別,盡量少記錄無關緊要的日志。
對于訪問日志,如果不要求記錄日志,可以關閉,
靜態資源的訪問日志關閉
靜態文件過期
對于靜態文件,需要設置一個過期時間,這樣可以讓這些資源緩存到客戶端瀏覽器,
在緩存未失效前,客戶端不再向服務期請求相同的資源,從而節省帶寬和資源消耗。
配置示例如下:
location ~* ^.+.(gif|jpg|png|css|js)$
{
expires 1d; //1d表示1天,也可以用24h表示一天。
}
作為代理服務器
Nginx絕大多數情況下都是作為代理或者負載均衡的角色。
因為前面章節已經介紹過以下參數的含義,在這里只提供對應的配置參數:
http
{
proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
...;
server
{
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 2 4k;
proxy_busy_buffers_size 4k;
proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
proxy_max_temp_file_size 20M;
proxy_temp_file_write_size 8k;
location /
{
proxy_cache my_zone;
...;
}
}
}
SSL優化
適當減少worker_processes數量,因為ssl功能需要使用CPU的計算。
使用長連接,因為每次建立ssl會話,都會耗費一定的資源(加密、解密)
開啟ssl緩存,簡化服務端和客戶端的“握手”過程。
ssl_session_cache shared:SSL:10m; //緩存為10M
ssl_session_timeout 10m; //會話超時時間為10分鐘
調整Linux內核參數
作為高性能WEB服務器,只調整Nginx本身的參數是不行的,因為Nginx服務依賴于高性能的操作系統。
以下為常見的幾個Linux內核參數優化方法。
net.ipv4.tcp_max_tw_buckets
對于tcp連接,服務端和客戶端通信完后狀態變為timewait,假如某臺服務器非常忙,連接數特別多的話,那么這個timewait數量就會越來越大。
畢竟它也是會占用一定的資源,所以應該有一個最大值,當超過這個值,系統就會刪除最早的連接,這樣始終保持在一個數量級。
這個數值就是由net.ipv4.tcp_max_tw_buckets這個參數來決定的。
CentOS7系統,你可以使用sysctl -a |grep tw_buckets來查看它的值,默認為32768,
你可以適當把它調低,比如調整到8000,畢竟這個狀態的連接太多也是會消耗資源的。
但你不要把它調到幾十、幾百這樣,因為這種狀態的tcp連接也是有用的,
如果同樣的客戶端再次和服務端通信,就不用再次建立新的連接了,用這個舊的通道,省時省力。
net.ipv4.tcp_tw_recycle = 1
該參數的作用是快速回收timewait狀態的連接。上面雖然提到系統會自動刪除掉timewait狀態的連接,但如果把這樣的連接重新利用起來豈不是更好。
所以該參數設置為1就可以讓timewait狀態的連接快速回收,它需要和下面的參數配合一起使用。
net.ipv4.tcp_tw_reuse = 1
該參數設置為1,將timewait狀態的連接重新用于新的TCP連接,要結合上面的參數一起使用。
net.ipv4.tcp_syncookies = 1
tcp三次握手中,客戶端向服務端發起syn請求,服務端收到后,也會向客戶端發起syn請求同時連帶ack確認,
假如客戶端發送請求后直接斷開和服務端的連接,不接收服務端發起的這個請求,服務端會重試多次,
這個重試的過程會持續一段時間(通常高于30s),當這種狀態的連接數量非常大時,服務器會消耗很大的資源,從而造成癱瘓,
正常的連接進不來,這種惡意的半連接行為其實叫做syn flood***。
設置為1,是開啟SYN Cookies,開啟后可以避免發生上述的syn flood***。
開啟該參數后,服務端接收客戶端的ack后,再向客戶端發送ack+syn之前會要求client在短時間內回應一個序號,
如果客戶端不能提供序號或者提供的序號不對則認為該客戶端不合法,于是不會發ack+syn給客戶端,更涉及不到重試。
net.ipv4.tcp_max_syn_backlog
該參數定義系統能接受的最大半連接狀態的tcp連接數。客戶端向服務端發送了syn包,服務端收到后,會記錄一下,
該參數決定最多能記錄幾個這樣的連接。在CentOS7,默認是256,當有syn flood***時,這個數值太小則很容易導致服務器癱瘓,
實際上此時服務器并沒有消耗太多資源(cpu、內存等),所以可以適當調大它,比如調整到30000。
net.ipv4.tcp_syn_retries
該參數適用于客戶端,它定義發起syn的最大重試次數,默認為6,建議改為2。
net.ipv4.tcp_synack_retries
該參數適用于服務端,它定義發起syn+ack的最大重試次數,默認為5,建議改為2,可以適當預防syn flood。
net.ipv4.ip_local_port_range
該參數定義端口范圍,系統默認保留端口為1024及以下,以上部分為自定義端口。這個參數適用于客戶端,
當客戶端和服務端建立連接時,比如說訪問服務端的80端口,客戶端隨機開啟了一個端口和服務端發起連接,
這個參數定義隨機端口的范圍。默認為32768 61000,建議調整為1025 61000。
net.ipv4.tcp_fin_timeout
tcp連接的狀態中,客戶端上有一個是FIN-WAIT-2狀態,它是狀態變遷為timewait前一個狀態。
該參數定義不屬于任何進程的該連接狀態的超時時間,默認值為60,建議調整為6。
net.ipv4.tcp_keepalive_time
tcp連接狀態里,有一個是established狀態,只有在這個狀態下,客戶端和服務端才能通信。正常情況下,當通信完畢,
客戶端或服務端會告訴對方要關閉連接,此時狀態就會變為timewait,如果客戶端沒有告訴服務端,
并且服務端也沒有告訴客戶端關閉的話(例如,客戶端那邊斷網了),此時需要該參數來判定。
比如客戶端已經斷網了,但服務端上本次連接的狀態依然是established,服務端為了確認客戶端是否斷網,
就需要每隔一段時間去發一個探測包去確認一下看看對方是否在線。這個時間就由該參數決定。它的默認值為7200秒,建議設置為30秒。
net.ipv4.tcp_keepalive_intvl
該參數和上面的參數是一起的,服務端在規定時間內發起了探測,查看客戶端是否在線,如果客戶端并沒有確認,
此時服務端還不能認定為對方不在線,而是要嘗試多次。該參數定義重新發送探測的時間,即第一次發現對方有問題后,過多久再次發起探測。
默認值為75秒,可以改為3秒。
net.ipv4.tcp_keepalive_probes
第10和第11個參數規定了何時發起探測和探測失敗后再過多久再發起探測,但并沒有定義一共探測幾次才算結束。
該參數定義發起探測的包的數量。默認為9,建議設置2。
設置和范例
在Linux下調整內核參數,可以直接編輯配置文件/etc/sysctl.conf,然后執行sysctl -p命令生效
結合以上分析的各內核參數,范例如下
net.ipv4.tcp_fin_timeout = 6
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_max_tw_buckets = 8000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 30000
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.ip_local_port_range = 1025 61000
net.ipv4.tcp_keepalive_intvl = 3
net.ipv4.tcp_keepalive_probes = 2
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。