nginx性能優(yōu)化

Nginx 的系統(tǒng)結(jié)構(gòu)

<meta charset="utf-8">

Nginx 包含一個(gè)單一的 master 進(jìn)程和多個(gè) worker 進(jìn)程。所有的這些進(jìn)程都是單線程,并且設(shè)計(jì)為同時(shí)處理成千上萬(wàn)個(gè)連接裸卫。worker 進(jìn)程是處理連接的地方,它用于處理客戶端請(qǐng)求纽竣。
master 進(jìn)程負(fù)責(zé)讀取配置文件墓贿、處理套接字、派生 worker 進(jìn)程蜓氨、打開(kāi)日志文件等聋袋。總之穴吹, master 進(jìn)程是一個(gè)可以通過(guò)處理信號(hào)響應(yīng)來(lái)管理請(qǐng)求的進(jìn)程幽勒。
更多內(nèi)容請(qǐng)查看[《Nginx 核心模塊與配置實(shí)踐》](https://juejin.im/post/6868289389722763272)。
1604374251.png

1港令、Nginx運(yùn)行工作進(jìn)程數(shù)量

Nginx運(yùn)行工作進(jìn)程個(gè)數(shù)一般設(shè)置CPU的核心或者核心數(shù)x2啥容。如果不了解cpu的核數(shù),可以top命令之后按1看出來(lái)顷霹,也可以查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l

[root@lx~]# vi/usr/local/nginx1.10/conf/nginx.conf
worker_processes 4;
[root@lx~]# /usr/local/nginx1.10/sbin/nginx-s reload
[root@lx~]# ps -aux | grep nginx |grep -v grep

2咪惠、Nginx運(yùn)行CPU親和力

比如4核配置:

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000
比如8核配置:

worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
worker_processes最多開(kāi)啟8個(gè),8個(gè)以上性能提升不會(huì)再提升了淋淀,而且穩(wěn)定性變得更低遥昧,所以8個(gè)進(jìn)程夠用了

3、Nginx最大打開(kāi)文件數(shù)

worker_rlimit_nofile 65535;
這個(gè)指令是指當(dāng)一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述符數(shù)目绅喉,理論值應(yīng)該是最多打開(kāi)文件數(shù)(ulimit -n)與nginx進(jìn)程數(shù)相除渠鸽,但是nginx分配請(qǐng)求并不是那么均勻,所以最好與ulimit -n的值保持一致柴罐。

注:文件資源限制的配置可以在/etc/security/limits.conf設(shè)置徽缚,針對(duì)root/user等各個(gè)用戶或者*代表所有用戶來(lái)設(shè)置。

*   soft nofile   65535
*   hard nofile   65535
用戶重新登錄生效(ulimit -n)

4革屠、Nginx事件處理模型

events {
  use epoll;
  worker_connections 65535;
  multi_accept on;
}
nginx采用epoll事件模型凿试,處理效率高。

work_connections是單個(gè)worker進(jìn)程允許客戶端最大連接數(shù)似芝,這個(gè)數(shù)值一般根據(jù)服務(wù)器性能和內(nèi)存來(lái)制定那婉,實(shí)際最大值就是worker進(jìn)程數(shù)乘以work_connections。

實(shí)際我們填入一個(gè)65535党瓮,足夠了详炬,這些都算并發(fā)值,一個(gè)網(wǎng)站的并發(fā)達(dá)到這么大的數(shù)量寞奸,也算一個(gè)大站了呛谜!

multi_accept 告訴nginx收到一個(gè)新連接通知后接受盡可能多的連接在跳,默認(rèn)是on,設(shè)置為on后隐岛,多個(gè)worker按串行方式來(lái)處理連接猫妙,也就是一個(gè)連接只有一個(gè)worker被喚醒,其他的處于休眠狀態(tài)聚凹,設(shè)置為off后割坠,多個(gè)worker按并行方式來(lái)處理連接,也就是一個(gè)連接會(huì)喚醒所有的worker妒牙,直到連接分配完畢彼哼,沒(méi)有取得連接的繼續(xù)休眠。當(dāng)你的服務(wù)器連接數(shù)不多時(shí)单旁,開(kāi)啟這個(gè)參數(shù)會(huì)讓負(fù)載有一定的降低沪羔,但是當(dāng)服務(wù)器的吞吐量很大時(shí)饥伊,為了效率象浑,可以關(guān)閉這個(gè)參數(shù)。

5琅豆、開(kāi)啟高效傳輸模式

http {
  include mime.types;
  default_type application/octet-stream;
  ……

  sendfile on;
  tcp_nopush on;
  ……
}
Include mime.types : 媒體類型,include 只是一個(gè)在當(dāng)前文件中包含另一個(gè)文件內(nèi)容的指令愉豺。

default_type application/octet-stream :默認(rèn)媒體類型足夠。

sendfile on:開(kāi)啟高效文件傳輸模式茫因,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來(lái)輸出文件蚪拦,對(duì)于普通應(yīng)用設(shè)為 on,如果用來(lái)進(jìn)行下載等應(yīng)用磁盤(pán)IO重負(fù)載應(yīng)用冻押,可設(shè)置為off驰贷,以平衡磁盤(pán)與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負(fù)載洛巢。注意:如果圖片顯示不正常把這個(gè)改成off括袒。

tcp_nopush on:必須在sendfile開(kāi)啟模式才有效,防止網(wǎng)路阻塞稿茉,積極的減少網(wǎng)絡(luò)報(bào)文段的數(shù)量(將響應(yīng)頭和正文的開(kāi)始部分一起發(fā)送锹锰,而不一個(gè)接一個(gè)的發(fā)送。)

6爬迟、連接超時(shí)時(shí)間

主要目的是保護(hù)服務(wù)器資源卿城,CPU呵扛,內(nèi)存,控制連接數(shù)痢士,因?yàn)榻⑦B接也是需要消耗資源的。

keepalive_timeout 60;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
keepalived_timeout :客戶端連接保持會(huì)話超時(shí)時(shí)間茂装,超過(guò)這個(gè)時(shí)間怠蹂,服務(wù)器斷開(kāi)這個(gè)鏈接陪汽。

tcp_nodelay:也是防止網(wǎng)絡(luò)阻塞,不過(guò)要包涵在keepalived參數(shù)才有效褥蚯。

client_header_buffer_size 4k:客戶端請(qǐng)求頭部的緩沖區(qū)大小挚冤,這個(gè)可以根據(jù)你的系統(tǒng)分頁(yè)大小來(lái)設(shè)置,一般一個(gè)請(qǐng)求頭的大小不會(huì)超過(guò) 1k赞庶,不過(guò)由于一般系統(tǒng)分頁(yè)都要大于1k训挡,所以這里設(shè)置為分頁(yè)大小。分頁(yè)大小可以用命令getconf PAGESIZE取得歧强。

open_file_cache max=102400 inactive=20s :這個(gè)將為打開(kāi)文件指定緩存澜薄,默認(rèn)是沒(méi)有啟用的,max指定緩存數(shù)量摊册,建議和打開(kāi)文件數(shù)一致肤京,inactive 是指經(jīng)過(guò)多長(zhǎng)時(shí)間文件沒(méi)被請(qǐng)求后刪除緩存。

open_file_cache_valid 30s:這個(gè)是指多長(zhǎng)時(shí)間檢查一次緩存的有效信息茅特。

open_file_cache_min_uses 1 :open_file_cache指令中的inactive 參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù)忘分,如果超過(guò)這個(gè)數(shù)字,文件描述符一直是在緩存中打開(kāi)的白修,如上例妒峦,如果有一個(gè)文件在inactive 時(shí)間內(nèi)一次沒(méi)被使用,它將被移除兵睛。

client_header_timeout : 設(shè)置請(qǐng)求頭的超時(shí)時(shí)間肯骇。我們也可以把這個(gè)設(shè)置低些,如果超過(guò)這個(gè)時(shí)間沒(méi)有發(fā)送任何數(shù)據(jù)祖很,nginx將返回request time out的錯(cuò)誤笛丙。

client_body_timeout設(shè)置請(qǐng)求體的超時(shí)時(shí)間。我們也可以把這個(gè)設(shè)置低些假颇,超過(guò)這個(gè)時(shí)間沒(méi)有發(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í)間镜豹,如果超過(guò)這個(gè)時(shí)間傲须,客戶端沒(méi)有任何活動(dòng),nginx關(guān)閉連接趟脂。

server_tokens :并不會(huì)讓nginx執(zhí)行的速度更快泰讽,但它可以關(guān)閉在錯(cuò)誤頁(yè)面中的nginx版本數(shù)字,這樣對(duì)于安全性是有好處的。

client_max_body_size:上傳文件大小限制已卸。

7佛玄、fastcgi 調(diào)優(yōu)

fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
fastcgi_connect_timeout 600 :指定連接到后端FastCGI的超時(shí)時(shí)間。

fastcgi_send_timeout 600 :向FastCGI傳送請(qǐng)求的超時(shí)時(shí)間累澡。

fastcgi_read_timeout 600 :指定接收FastCGI應(yīng)答的超時(shí)時(shí)間梦抢。

fastcgi_buffer_size 64k :指定讀取FastCGI應(yīng)答第一部分需要用多大的緩沖區(qū),默認(rèn)的緩沖區(qū)大小為愧哟。fastcgi_buffers指令中的每塊大小奥吩,可以將這個(gè)值設(shè)置更小。

fastcgi_buffers 4 64k :指定本地需要用多少和多大的緩沖區(qū)來(lái)緩沖FastCGI的應(yīng)答請(qǐng)求蕊梧,如果一個(gè)php腳本所產(chǎn)生的頁(yè)面大小為256KB霞赫,那么會(huì)分配4個(gè)64KB的緩沖區(qū)來(lái)緩存,如果頁(yè)面大小大于256KB肥矢,那么大于256KB的部分會(huì)緩存到fastcgi_temp_path指定的路徑中端衰,但是這并不是好方法,因?yàn)閮?nèi)存中的數(shù)據(jù)處理速度要快于磁盤(pán)甘改。一般這個(gè)值應(yīng)該為站點(diǎn)中php腳本所產(chǎn)生的頁(yè)面大小的中間值旅东,如果站點(diǎn)大部分腳本所產(chǎn)生的頁(yè)面大小為256KB,那么可以把這個(gè)值設(shè)置為“8 32K”楼誓、“4 64k”等玉锌。

fastcgi_busy_buffers_size 128k :建議設(shè)置為fastcgi_buffers的兩倍名挥,繁忙時(shí)候的buffer疟羹。

fastcgi_temp_file_write_size 128k :在寫(xiě)入fastcgi_temp_path時(shí)將用多大的數(shù)據(jù)塊,默認(rèn)值是fastcgi_buffers的兩倍禀倔,該數(shù)值設(shè)置小時(shí)若負(fù)載上來(lái)時(shí)可能報(bào)502BadGateway榄融。

fastcgi_temp_path  :緩存臨時(shí)目錄。

fastcgi_intercept_errors on :這個(gè)指令指定是否傳遞4xx和5xx錯(cuò)誤信息到客戶端救湖,或者允許nginx使用error_page處理錯(cuò)誤信息愧杯。注:靜態(tài)文件不存在會(huì)返回404頁(yè)面,但是php頁(yè)面則返回空白頁(yè)鞋既!

fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cachelevels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g :fastcgi_cache緩存目錄力九,可以設(shè)置目錄層級(jí),比如1:2會(huì)生成16*256個(gè)子目錄邑闺,cache_fastcgi是這個(gè)緩存空間的名字跌前,cache是用多少內(nèi)存(這樣熱門(mén)的內(nèi)容nginx直接放內(nèi)存,提高訪問(wèn)速度)陡舅,inactive表示默認(rèn)失效時(shí)間抵乓,如果緩存數(shù)據(jù)在失效時(shí)間內(nèi)沒(méi)有被訪問(wèn),將被刪除,max_size表示最多用多少硬盤(pán)空間。

fastcgi_cache cache_fastcgi :#表示開(kāi)啟FastCGI緩存并為其指定一個(gè)名稱灾炭。開(kāi)啟緩存非常有用茎芋,可以有效降低CPU的負(fù)載,并且防止502的錯(cuò)誤放生蜈出。cache_fastcgi為proxy_cache_path指令創(chuàng)建的緩存區(qū)名稱田弥。

fastcgi_cache_valid 200 302 1h :#用來(lái)指定應(yīng)答代碼的緩存時(shí)間,實(shí)例中的值表示將200和302應(yīng)答緩存一小時(shí)铡原,要和fastcgi_cache配合使用皱蹦。

fastcgi_cache_valid 301 1d :將301應(yīng)答緩存一天。

fastcgi_cache_valid any 1m :將其他應(yīng)答緩存為1分鐘眷蜈。

fastcgi_cache_min_uses 1 :該指令用于設(shè)置經(jīng)過(guò)多少次請(qǐng)求的相同URL將被緩存沪哺。

fastcgi_cache_key http://$host$request_uri :該指令用來(lái)設(shè)置web緩存的Key值,nginx根據(jù)Key值md5哈希存儲(chǔ).一般根據(jù)$host(域名)、$request_uri(請(qǐng)求的路徑)等變量組合成proxy_cache_key 酌儒。

fastcgi_pass  :指定FastCGI服務(wù)器監(jiān)聽(tīng)端口與地址辜妓,可以是本機(jī)或者其它。

總結(jié):

nginx的緩存功能有:proxy_cache / fastcgi_cache

proxy_cache的作用是緩存后端服務(wù)器的內(nèi)容忌怎,可能是任何內(nèi)容籍滴,包括靜態(tài)的和動(dòng)態(tài)。

fastcgi_cache的作用是緩存fastcgi生成的內(nèi)容榴啸,很多情況是php生成的動(dòng)態(tài)的內(nèi)容孽惰。

proxy_cache緩存減少了nginx與后端通信的次數(shù),節(jié)省了傳輸時(shí)間和后端寬帶鸥印。

fastcgi_cache緩存減少了nginx與php的通信的次數(shù)勋功,更減輕了php和數(shù)據(jù)庫(kù)(mysql)的壓力。

8库说、gzip 調(diào)優(yōu)

使用gzip壓縮功能狂鞋,可能為我們節(jié)約帶寬,加快傳輸速度潜的,有更好的體驗(yàn)骚揍,也為我們節(jié)約成本,所以說(shuō)這是一個(gè)重點(diǎn)啰挪。

Nginx啟用壓縮功能需要你來(lái)ngx_http_gzip_module模塊信不,apache使用的是mod_deflate。

一般我們需要壓縮的內(nèi)容有:文本亡呵,js抽活,html,css政己,對(duì)于圖片酌壕,視頻掏愁,flash什么的不壓縮,同時(shí)也要注意卵牍,我們使用gzip的功能是需要消耗CPU的果港!

gzip on;
gzip_min_length 2k;
gzip_buffers   4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
gzip_vary on;
gzip_proxied any;
gzip on;   #開(kāi)啟壓縮功能
gzip_min_length 1k :設(shè)置允許壓縮的頁(yè)面最小字節(jié)數(shù),頁(yè)面字節(jié)數(shù)從header頭的Content-Length中獲取糊昙,默認(rèn)值是0辛掠,不管頁(yè)面多大都進(jìn)行壓縮,建議設(shè)置成大于1K释牺,如果小與1K可能會(huì)越壓越大萝衩。

gzip_buffers 4 32k :壓縮緩沖區(qū)大小,表示申請(qǐng)4個(gè)單位為32K的內(nèi)存作為壓縮結(jié)果流緩存没咙,默認(rèn)值是申請(qǐng)與原始數(shù)據(jù)大小相同的內(nèi)存空間來(lái)存儲(chǔ)gzip壓縮結(jié)果猩谊。

gzip_http_version 1.1 :壓縮版本,用于設(shè)置識(shí)別HTTP協(xié)議版本祭刚,默認(rèn)是1.1牌捷,目前大部分瀏覽器已經(jīng)支持GZIP解壓,使用默認(rèn)即可涡驮。

gzip_comp_level 6 :壓縮比例暗甥,用來(lái)指定GZIP壓縮比,1壓縮比最小捉捅,處理速度最快撤防,9壓縮比最大,傳輸速度快棒口,但是處理慢寄月,也比較消耗CPU資源。

gzip_types text/css text/xml application/javascript :用來(lái)指定壓縮的類型陌凳,‘text/html’類型總是會(huì)被壓縮剥懒。默認(rèn)值: gzip_types text/html (默認(rèn)不對(duì)js/css文件進(jìn)行壓縮)

壓縮類型,匹配MIME型進(jìn)行壓縮合敦;

不能用通配符 text/*;

text/html默認(rèn)已經(jīng)壓縮 (無(wú)論是否指定)验游;

設(shè)置哪壓縮種文本文件可參考 conf/mime.types充岛。

gzip_vary on :varyheader支持,改選項(xiàng)可以讓前端的緩存服務(wù)器緩存經(jīng)過(guò)GZIP壓縮的頁(yè)面耕蝉,例如用Squid緩存經(jīng)過(guò)nginx壓縮的數(shù)據(jù)崔梗。

9、expires 緩存調(diào)優(yōu)

緩存垒在,主要針對(duì)于圖片蒜魄,css,js等元素更改機(jī)會(huì)比較少的情況下使用,特別是圖片谈为,占用帶寬大旅挤,我們完全可以設(shè)置圖片在瀏覽器本地緩存365d,css伞鲫,js粘茄,html可以緩存?zhèn)€10來(lái)天,這樣用戶第一次打開(kāi)加載慢一點(diǎn)秕脓,第二次柒瓣,就非常快了吠架!緩存的時(shí)候芙贫,我們需要將需要緩存的拓展名列出來(lái), Expires緩存配置在server字段里面傍药。

location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}

location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}
注:log_not_found off;是否在error_log中記錄不存在的錯(cuò)誤屹培。默認(rèn)是。

總結(jié):

expire功能優(yōu)點(diǎn):

expires可以降低網(wǎng)站購(gòu)買(mǎi)的帶寬怔檩,節(jié)約成本褪秀;

同時(shí)提升用戶訪問(wèn)體驗(yàn);

減輕服務(wù)的壓力薛训,節(jié)約服務(wù)器成本媒吗,是web服務(wù)非常重要的功能。

expire功能缺點(diǎn):

被緩存的頁(yè)面或數(shù)據(jù)更新了乙埃,用戶看到的可能還是舊的內(nèi)容闸英,反而影響用戶體驗(yàn)。

解決辦法:第一個(gè)縮短緩存時(shí)間介袜,例如:1天甫何,但不徹底,除非更新頻率大于1天遇伞;第二個(gè)對(duì)緩存的對(duì)象改名辙喂。

網(wǎng)站不希望被緩存的內(nèi)容:

網(wǎng)站流量統(tǒng)計(jì)工具;

更新頻繁的文件(google的logo)鸠珠。

10巍耗、防盜鏈

防止別人直接從你網(wǎng)站引用圖片等鏈接,消耗了你的資源和網(wǎng)絡(luò)流量渐排,那么我們的解決辦法由幾種:

水印炬太,品牌宣傳,你的帶寬驯耻,服務(wù)器足夠亲族;

防火墻炒考,直接控制,前提是你知道IP來(lái)源霎迫;

防盜鏈策略下面的方法是直接給予404的錯(cuò)誤提示斋枢。

location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers noneblocked www.benet.com benet.com;
if($invalid_referer) {
  #return 302 http://www.benet.com/img/nolink.jpg;
  return 404;
  break;
}
access_log off;
}
參數(shù)可以使如下形式:

none  :意思是不存在的Referer頭(表示空的,也就是直接訪問(wèn)女气,比如直接在瀏覽器打開(kāi)一個(gè)圖片)杏慰。

blocked  :意為根據(jù)防火墻偽裝Referer頭,如:“Referer:XXXXXXX”炼鞠。

server_names  :為一個(gè)或多個(gè)服務(wù)器的列表缘滥,0.5.33版本以后可以在名稱中使用“*”通配符。

11谒主、訪問(wèn)限流

我們構(gòu)建網(wǎng)站是為了讓用戶訪問(wèn)它們朝扼,我們希望用于合法訪問(wèn)。所以不得不采取一些措施限制濫用訪問(wèn)的用戶霎肯。這種濫用指的是從同一IP每秒到服務(wù)器請(qǐng)求的連接數(shù)擎颖。因?yàn)檫@可能是在同一時(shí)間內(nèi),世界各地的多臺(tái)機(jī)器上的爬蟲(chóng)機(jī)器人多次嘗試爬取網(wǎng)站的內(nèi)容观游。
#限制用戶連接數(shù)來(lái)預(yù)防DOS攻擊  (http內(nèi))
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
#限制同一客戶端ip最大并發(fā)連接數(shù)
limit_conn perip 2;
#限制同一server最大并發(fā)連接數(shù)
limit_conn perserver 20;
#限制下載速度搂捧,根據(jù)自身服務(wù)器帶寬配置
limit_rate 300k; 

其中“l(fā)imit_conn one 10”既可以放在server層對(duì)整個(gè)server有效,也可以放在location中只對(duì)單獨(dú)的location有效懂缕。
該配置表明:客戶端的并發(fā)連接數(shù)只能是10個(gè)允跑。

limit_req_zone 參數(shù)配置

Syntax: limit_req zone=name [burst=number] [nodelay];
Default:    —
Context:    http, server, location

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
第一個(gè)參數(shù):$binary_remote_addr 表示通過(guò)remote_addr這個(gè)標(biāo)識(shí)來(lái)做限制,“binary_”的目的是縮寫(xiě)內(nèi)存占用量搪柑,是限制同一客戶端ip地址聋丝。
第二個(gè)參數(shù):zone=one:10m表示生成一個(gè)大小為10M,名字為one的內(nèi)存區(qū)域工碾,用來(lái)存儲(chǔ)訪問(wèn)的頻次信息弱睦。
第三個(gè)參數(shù):rate=1r/s表示允許相同標(biāo)識(shí)的客戶端的訪問(wèn)頻次,這里限制的是每秒1次渊额,還可以有比如30r/m的况木。

limit_req zone=one burst=5 nodelay;
第一個(gè)參數(shù):zone=one 設(shè)置使用哪個(gè)配置區(qū)域來(lái)做限制,與上面limit_req_zone 里的name對(duì)應(yīng)端圈。
第二個(gè)參數(shù):burst=5焦读,重點(diǎn)說(shuō)明一下這個(gè)配置,burst爆發(fā)的意思舱权,這個(gè)配置的意思是設(shè)置一個(gè)大小為5的緩沖區(qū)當(dāng)有大量請(qǐng)求(爆發(fā))過(guò)來(lái)時(shí),超過(guò)了訪問(wèn)頻次限制的請(qǐng)求可以先放到這個(gè)緩沖區(qū)內(nèi)仑嗅。
第三個(gè)參數(shù):nodelay宴倍,如果設(shè)置张症,超過(guò)訪問(wèn)頻次而且緩沖區(qū)也滿了的時(shí)候就會(huì)直接返回503,如果沒(méi)有設(shè)置鸵贬,則所有請(qǐng)求會(huì)等待排隊(duì)俗他。

例子:
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        location /search/ {
            limit_req zone=one burst=5 nodelay;
        }
}     

下面配置可以限制特定UA(比如搜索引擎)的訪問(wèn):
limit_req_zone  $anti_spider  zone=one:10m   rate=10r/s;
limit_req zone=one burst=100 nodelay;
if ($http_user_agent ~* "googlebot|bingbot|Feedfetcher-Google") {
    set $anti_spider $http_user_agent;
}
   
詳細(xì)配置:
 #統(tǒng)一在http域中進(jìn)行配置

 #限制請(qǐng)求

 limit_req_zone $uri zone=api_read:20m rate=50r/s;

 #按ip配置一個(gè)連接 zone

 limit_conn_zone $binary_remote_addr zone=perip_conn:10m;

 #按server配置一個(gè)連接 zone

 limit_conn_zone $server_name zone=perserver_conn:100m;

===== server =====

location / {

 if (!-e $request_filename){

  rewrite ^/(.*) /index.php last;

 }

 #請(qǐng)求限流排隊(duì)通過(guò) burst默認(rèn)是0

 limit_req zone=api_read burst=100;

 #連接數(shù)限制,每個(gè)IP并發(fā)請(qǐng)求為50

 limit_conn perip_conn 50;

 #服務(wù)所限制的連接數(shù)(即限制了該server并發(fā)連接數(shù)量)

 limit_conn perserver_conn 200;

 #連接限速

 #limit_rate 100k;

}

12、內(nèi)核參數(shù)優(yōu)化

fs.file-max = 999999:這個(gè)參數(shù)表示進(jìn)程(比如一個(gè)worker進(jìn)程)可以同時(shí)打開(kāi)的最大句柄數(shù)阔逼,這個(gè)參數(shù)直線限制最大并發(fā)連接數(shù)兆衅,需根據(jù)實(shí)際情況配置。

net.ipv4.tcp_max_tw_buckets = 6000 :這個(gè)參數(shù)表示操作系統(tǒng)允許TIME_WAIT套接字?jǐn)?shù)量的最大值嗜浮,如果超過(guò)這個(gè)數(shù)字羡亩,TIME_WAIT套接字將立刻被清除并打印警告信息。該參數(shù)默認(rèn)為180000危融,過(guò)多的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)打開(kāi)的端口范圍。

#net.ipv4.tcp_tw_recycle = 1 :?jiǎn)⒂胻imewait快速回收吉殃。暫不使用此參數(shù)

net.ipv4.tcp_tw_reuse = 1 :開(kāi)啟重用辞居。允許將TIME-WAIT sockets重新用于新的TCP連接。這對(duì)于服務(wù)器來(lái)說(shuō)很有意義蛋勺,因?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è)置的小一些,可以更快地清理無(wú)效的連接乾蛤。

net.ipv4.tcp_syncookies = 1 :開(kāi)啟SYN Cookies每界,當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理家卖。

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需要通過(guò)三次握手來(lái)建立網(wǎng)絡(luò)連接.當(dāng)三次握手成功后,我們可以看到端口的狀態(tài)由LISTEN轉(zhuǎn)變?yōu)镋STABLISHED,接著這條鏈路上就可以開(kāi)始傳送數(shù)據(jù)了.每一個(gè)處于監(jiān)聽(tīng)(Listen)狀態(tài)的端口,都有自己的監(jiān)聽(tīng)隊(duì)列.監(jiān)聽(tīng)隊(duì)列的長(zhǎng)度與如somaxconn參數(shù)和使用該端口的程序中l(wèi)isten()函數(shù)有關(guān)酪捡。somaxconn定義了系統(tǒng)中每一個(gè)端口最大的監(jiān)聽(tīng)隊(duì)列的長(zhǎng)度,這是個(gè)全局的參數(shù),默認(rèn)值為128叁征,對(duì)于一個(gè)經(jīng)常處理新連接的高負(fù)載 web服務(wù)環(huán)境來(lái)說(shuō),默認(rèn)的 128 太小了逛薇。大多數(shù)環(huán)境這個(gè)值建議增加到 1024 或者更多捺疼。大的偵聽(tīng)隊(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繁忙來(lái)不及accept新連接的情況時(shí)官扣,Linux不至于丟失客戶端發(fā)起的連接請(qǐng)求翅敌。

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ù)與性能無(wú)關(guān)鸥滨,用于解決TCP的SYN攻擊嗦哆。

 

下面貼一個(gè)完整的內(nèi)核優(yōu)化設(shè)置:

fs.file-max = 999999
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
執(zhí)行sysctl  -p使內(nèi)核修改生效。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婿滓,一起剝皮案震驚了整個(gè)濱河市老速,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凸主,老刑警劉巖橘券,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卿吐,居然都是意外死亡旁舰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)嗡官,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)箭窜,“玉大人,你說(shuō)我怎么就攤上這事衍腥』怯#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵婆咸,是天一觀的道長(zhǎng)竹捉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)尚骄,這世上最難降的妖魔是什么块差? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上憾儒,老公的妹妹穿的比我還像新娘询兴。我一直安慰自己乃沙,他們只是感情好起趾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著警儒,像睡著了一般训裆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜀铲,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天边琉,我揣著相機(jī)與錄音,去河邊找鬼记劝。 笑死变姨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厌丑。 我是一名探鬼主播定欧,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怒竿!你這毒婦竟也來(lái)了砍鸠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耕驰,失蹤者是張志新(化名)和其女友劉穎爷辱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體朦肘,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饭弓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了媒抠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弟断。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖领舰,靈堂內(nèi)的尸體忽然破棺而出夫嗓,到底是詐尸還是另有隱情,我是刑警寧澤冲秽,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布舍咖,位于F島的核電站,受9級(jí)特大地震影響锉桑,放射性物質(zhì)發(fā)生泄漏排霉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一民轴、第九天 我趴在偏房一處隱蔽的房頂上張望攻柠。 院中可真熱鬧球订,春花似錦、人聲如沸瑰钮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浪谴。三九已至开睡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苟耻,已是汗流浹背篇恒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凶杖,地道東北人胁艰。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像智蝠,于是被迫代替她去往敵國(guó)和親腾么。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354