高效傳輸模式
http {
……
sendfile on;
tcp_nopush on;
……
sendfile on;//開啟高效文件傳輸模式,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來輸出文件,對(duì)于普通應(yīng)用
設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負(fù)
載。
注意:如果圖片顯示不正常把這個(gè)改成off。
tcp_nopush on;必須在sendfile開啟模式才有效,防止網(wǎng)路阻塞,積極的減少網(wǎng)絡(luò)報(bào)文段的數(shù)量(將響應(yīng)頭和正文的
開始部分一起發(fā)送,而不一個(gè)接一個(gè)的發(fā)送。)
連接超時(shí)時(shí)間
主要目的是保護(hù)服務(wù)器資源,CPU,內(nèi)存,控制連接數(shù),因?yàn)榻⑦B接也是需要消耗資源的
keepalive_timeout 10;
tcp_nodelay on;
client_header_timeout 15;
client_header_buffer_size 4k;
client_body_timeout 15;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
client_body_buffer_size 128k;
keepalived_timeout客戶端連接保持會(huì)話超時(shí)時(shí)間,超過這個(gè)時(shí)間,服務(wù)器斷開這個(gè)鏈接,我們將它設(shè)置低些可以讓
ngnix持續(xù)工作的時(shí)間更長(zhǎng)。
tcp_nodelay;也是防止網(wǎng)絡(luò)阻塞,不過要包涵在keepalived參數(shù)才有效,告訴nginx不要緩存數(shù)據(jù),而是一段一段的發(fā)
送--當(dāng)需要及時(shí)發(fā)送數(shù)據(jù)時(shí),就應(yīng)該給應(yīng)用設(shè)置這個(gè)屬性,這樣發(fā)送一小塊數(shù)據(jù)信息時(shí)就不能立即得到返回值。
client_header_buffer_size 4k;
客戶端請(qǐng)求頭部的緩沖區(qū)大小,這個(gè)可以根據(jù)你的系統(tǒng)分頁(yè)大小來設(shè)置,一般一個(gè)請(qǐng)求頭的大小不會(huì)超過 1k,不過由于
一般系統(tǒng)分頁(yè)都要大于1k,所以這里設(shè)置為分頁(yè)大小。分頁(yè)大小可以用命令getconf PAGESIZE取得。
open_file_cache max=102400 inactive=20s;
這個(gè)將為打開文件指定緩存,默認(rèn)是沒有啟用的,max指定緩存數(shù)量,建議和打開文件數(shù)一致,inactive 是指經(jīng)過多長(zhǎng)
時(shí)間文件沒被請(qǐng)求后刪除緩存。打開緩存的同時(shí)也指定了緩存最大數(shù)目,以及緩存的時(shí)間。我們可以設(shè)置一個(gè)相對(duì)高的
最大時(shí)間,這樣我們可以在它們不活動(dòng)超過20秒后清除掉。
open_file_cache_valid 30s;
這個(gè)是指多長(zhǎng)時(shí)間檢查一次緩存的有效信息。
open_file_cache_min_uses 2;
open_file_cache指令中的inactive 參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù),如果超過這個(gè)數(shù)字,文件描述符一直是在緩存
中打開的,如上例,如果有一個(gè)文件在inactive 時(shí)間內(nèi)一次沒被使用,它將被移除。
open_file_cache_errors on;
指定了當(dāng)搜索一個(gè)文件時(shí)是否緩存錯(cuò)誤信息,也包括再次給配置中添加文件。我們也包括了服務(wù)器模塊,這些是在不同
文件中定義的。如果你的服務(wù)器模塊不在這些位置,你就得修改這一行來指定正確的位置。
client_header_timeout設(shè)置請(qǐng)求頭的超時(shí)時(shí)間。我們也可以把這個(gè)設(shè)置低些,如果超過這個(gè)時(shí)間沒有發(fā)送任何數(shù)據(jù),
nginx將返回request time out的錯(cuò)誤
client_body_timeout設(shè)置請(qǐng)求體的超時(shí)時(shí)間。我們也可以把這個(gè)設(shè)置低些,超過這個(gè)時(shí)間沒有發(fā)送任何數(shù)據(jù),和上面
一樣的錯(cuò)誤提示
reset_timeout_connection 告訴nginx關(guān)閉不響應(yīng)的客戶端連接。這將會(huì)釋放那個(gè)客戶端所占有的內(nèi)存空間。
send_timeout 響應(yīng)客戶端超時(shí)時(shí)間,這個(gè)超時(shí)時(shí)間僅限于兩個(gè)活動(dòng)之間的時(shí)間,如果超過這個(gè)時(shí)間,客戶端沒有任何
活動(dòng),nginx關(guān)閉連接
server_tokens 并不會(huì)讓nginx執(zhí)行的速度更快,但它可以關(guān)閉在錯(cuò)誤頁(yè)面中的nginx版本數(shù)字,這樣對(duì)于安全性是有
好處的。
client_max_body_size上傳文件大小限制,請(qǐng)求和提交的文件最大不能超過10M,超過之后報(bào)錯(cuò)。
內(nèi)核參數(shù)
fs.file-max = 999999:這個(gè)參數(shù)表示進(jìn)程(比如一個(gè)worker進(jìn)程)可以同時(shí)打開的最大句柄數(shù),這個(gè)參數(shù)直線限制
最大并發(fā)連接數(shù),需根據(jù)實(shí)際情況配置。
net.ipv4.tcp_max_tw_buckets = 6000 #這個(gè)參數(shù)表示操作系統(tǒng)允許TIME_WAIT套接字?jǐn)?shù)量的最大值,如果超過這個(gè)
數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。該參數(shù)默認(rèn)為180000,過多的TIME_WAIT套接字會(huì)使Web服務(wù)器
變慢。
注:主動(dòng)關(guān)閉連接的服務(wù)端會(huì)產(chǎn)生TIME_WAIT狀態(tài)的連接
net.ipv4.ip_local_port_range = 1024 65000 #允許系統(tǒng)打開的端口范圍。
net.ipv4.tcp_tw_recycle = 1#啟用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1#開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接。這對(duì)于服務(wù)器來說很有
意義,因?yàn)榉?wù)器上總會(huì)有大量TIME-WAIT狀態(tài)的連接。
net.ipv4.tcp_keepalive_time = 30:這個(gè)參數(shù)表示當(dāng)keepalive啟用時(shí),TCP發(fā)送keepalive消息的頻度。默認(rèn)是2
小時(shí),若將其設(shè)置的小一些,可以更快地清理無效的連接。
net.ipv4.tcp_syncookies = 1#開啟SYN Cookies,當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來處理。
net.core.somaxconn = 40960 #web 應(yīng)用中 listen 函數(shù)的 backlog 默認(rèn)會(huì)給我們內(nèi)核參數(shù)的
net.core.somaxconn 限制到128,而nginx定義的NGX_LISTEN_BACKLOG 默認(rèn)為511,所以有必要調(diào)整這個(gè)值。
注:對(duì)于一個(gè)TCP連接,Server與Client需要通過三次握手來建立網(wǎng)絡(luò)連接.當(dāng)三次握手成功后,我們可以看到端口的狀
態(tài)由LISTEN轉(zhuǎn)變?yōu)镋STABLISHED,接著這條鏈路上就可以開始傳送數(shù)據(jù)了.每一個(gè)處于監(jiān)聽(Listen)狀態(tài)的端口,都有自
己的監(jiān)聽隊(duì)列.監(jiān)聽隊(duì)列的長(zhǎng)度與如somaxconn參數(shù)和使用該端口的程序中l(wèi)isten()函數(shù)有關(guān)
somaxconn參數(shù):定義了系統(tǒng)中每一個(gè)端口最大的監(jiān)聽隊(duì)列的長(zhǎng)度,這是個(gè)全局的參數(shù),默認(rèn)值為128,對(duì)于一個(gè)經(jīng)常處理
新連接的高負(fù)載 web服務(wù)環(huán)境來說,默認(rèn)的 128 太小了。大多數(shù)環(huán)境這個(gè)值建議增加到 1024 或者更多。大的偵聽隊(duì)
列對(duì)防止拒絕服務(wù) DoS 攻擊也會(huì)有所幫助。
net.core.netdev_max_backlog = 262144 #每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許送到
隊(duì)列的數(shù)據(jù)包的最大數(shù)目。
net.ipv4.tcp_max_syn_backlog = 262144 #這個(gè)參數(shù)標(biāo)示TCP三次握手建立階段接受SYN請(qǐng)求隊(duì)列的最大長(zhǎng)度,默認(rèn)
為1024,將其設(shè)置得大一些可以使出現(xiàn)Nginx繁忙來不及accept新連接的情況時(shí),Linux不至于丟失客戶端發(fā)起的連接請(qǐng)
求。
下面貼一個(gè)完整的內(nèi)核優(yōu)化:
net.ipv4.tcp_rmem = 10240 87380 12582912#這個(gè)參數(shù)定義了TCP接受緩存(用于TCP接受滑動(dòng)窗口)的最小值、默
認(rèn)值、最大值。
net.ipv4.tcp_wmem = 10240 87380 12582912:這個(gè)參數(shù)定義了TCP發(fā)送緩存(用于TCP發(fā)送滑動(dòng)窗口)的最小值、
默認(rèn)值、最大值。
net.core.rmem_default = 6291456:這個(gè)參數(shù)表示內(nèi)核套接字接受緩存區(qū)默認(rèn)的大小。
net.core.wmem_default = 6291456:這個(gè)參數(shù)表示內(nèi)核套接字發(fā)送緩存區(qū)默認(rèn)的大小。
net.core.rmem_max = 12582912:這個(gè)參數(shù)表示內(nèi)核套接字接受緩存區(qū)的最大大小。
net.core.wmem_max = 12582912:這個(gè)參數(shù)表示內(nèi)核套接字發(fā)送緩存區(qū)的最大大小。
net.ipv4.tcp_syncookies = 1:該參數(shù)與性能無關(guān),用于解決TCP的SYN攻擊