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)核修改生效。