nginx 日志配置
1、nginx 日志介紹
nginx 有一個(gè)非常靈活的日志記錄模式,每個(gè)級別的配置可以有各自獨(dú)立的訪問日志, 所需日志模塊 ngx_http_log_module 的支持夺溢,日志格式通過 log_format 命令來定義阔逼,日志對于統(tǒng)計(jì)和排錯(cuò)是非常有利的兆衅,下面總結(jié)了 nginx 日志相關(guān)的配置 包括 access_log、rewrite_log嗜浮、error_log羡亩。
# 設(shè)置訪問日志
access_log path 樣式;
2、作用域
可以應(yīng)用access_log指令的作用域分別有http危融,server畏铆,location,吉殃。也就是說辞居,在這幾個(gè)作用域外使用該指令,Nginx會(huì)報(bào)錯(cuò)蛋勺。
該例子指定日志的寫入路徑為/var/logs/nginx-access.log瓦灶,日志格式使用默認(rèn)的combined。
access_log /var/logs/nginx-access.log combined;
該例子指定日志的寫入路徑為/var/logs/nginx-access.log抱完,日志格式使用默認(rèn)的combined
3贼陶、log_format 指令
Nginx 預(yù)定義了名為 combined 日志格式,如果沒有明確指定日志格式默認(rèn)使用該格式:
log_format combined'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
如果不想使用Nginx預(yù)定義的格式,可以通過log_format指令來自定義每界。
語法
log_format name[escape=default|json] string ...;
name 格式名稱捅僵。在 access_log 指令中引用。
escape 設(shè)置變量中的字符編碼方式是json還是default眨层,默認(rèn)是default庙楚。
string 要定義的日志格式內(nèi)容。該參數(shù)可以有多個(gè)趴樱。參數(shù)中可以使用Nginx變量馒闷。
log_format 指令中常用的一些變量:
4.自定義日志格式的使用:
log_format? main'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/logs/nginx-access.log main;
server {
}
使用log_format指令定義了一個(gè)main的格式,并在access_log指令中引用了它叁征。假如客戶端有發(fā)起請求:http://qf.com/纳账,我們看一下我截取的一個(gè)請求的日志記錄:
10.0.105.207--[01/Jul/2019:10:44:36+0800]"GET / HTTP/1.1"3040"-""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36""-"
我們看到最終的日志記錄中$remote_user、$http_referer捺疼、$http_x_forwarded_for都對應(yīng)了一個(gè)-疏虫,這是因?yàn)檫@幾個(gè)變量為空。
? 面試時(shí):注意日志里面的ip地址一定要在第一列啤呼。
5卧秘、error_log 指令
錯(cuò)誤日志在Nginx中是通過error_log指令實(shí)現(xiàn)的。該指令記錄服務(wù)器和請求處理過程中的錯(cuò)誤信息官扣。
語法
配置錯(cuò)誤日志文件的路徑和日志級別翅敌。
error_log file [level];
Default:
error_log logs/error.log error;
file 參數(shù)指定日志的寫入位置。
level 參數(shù)指定日志的級別惕蹄。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值蚯涮。可以看到其取值范圍是按緊急程度從低到高排列的卖陵。只有日志的錯(cuò)誤級別等于或高于level指定的值才會(huì)寫入錯(cuò)誤日志中遭顶。
基本用法
error_log /var/logs/nginx/nginx-error.log
配置段:http,? mail,? stream,? server, location作用域。
例子中指定了錯(cuò)誤日志的路徑為:/var/logs/nginx/nginx-error.log泪蔫,日志級別使用默認(rèn)的 error棒旗。
6、rewrite_log 指令
由ngx_http_rewrite_module模塊提供的鸥滨。用來記錄重寫日志的嗦哆。對于調(diào)試重寫規(guī)則建議開啟,啟用時(shí)將在error log中記錄重寫日志婿滓。基本語法:
rewrite_log on | off;
?
默認(rèn)值:
rewrite_log off;
配置段:? http,? server, location,? if作用域老速。
7、nginx 日志配置總結(jié)
Nginx中通過access_log和error_log指令配置訪問日志和錯(cuò)誤日志凸主,通過log_format我們可以自定義日志格式橘券。如果日志文件路徑中使用了變量,我們可以通過open_log_file_cache 指令來設(shè)置緩存,提升性能旁舰。其他的根據(jù)自己的使用場景定義锋华。
詳細(xì)的日志配置信息可以參考Nginx官方文檔
8、nginx的日志輪轉(zhuǎn)
[root@192 ~]# rpm -ql nginx |grep log
/etc/logrotate.d/nginx
/var/log/nginx
[root@192 ~]# vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {#指定需要輪轉(zhuǎn)處理的日志文件
daily#日志文件輪轉(zhuǎn)周期箭窜,可用值為: daily/weekly/yearly
missingok# 忽略錯(cuò)誤信息
rotate7# 輪轉(zhuǎn)次數(shù)毯焕,即最多存儲7個(gè)歸檔日志,會(huì)刪除最久的歸檔日志
minsize 5M? #限制條件磺樱,大于5M的日志文件才進(jìn)行分割纳猫,否則不操作
dateext# 以當(dāng)前日期作為命名格式
compress# 輪循結(jié)束后,已歸檔日志使用gzip進(jìn)行壓縮
delaycompress# 與compress共用竹捉,最近的一次歸檔不要壓縮
notifempty# 日志文件為空芜辕,輪循不會(huì)繼續(xù)執(zhí)行
create640nginx nginx#新日志文件的權(quán)限
sharedscripts#有多個(gè)日志需要輪詢時(shí),只執(zhí)行一次腳本
postrotate# 將日志文件轉(zhuǎn)儲后執(zhí)行的命令块差。以endscript結(jié)尾侵续,命令需要單獨(dú)成行
if[-f/var/run/nginx.pid ];then#判斷nginx的PID。# 默認(rèn)logrotate會(huì)以root身份運(yùn)行
kill-USR1cat/var/run/nginx.pid
fi
? ? ?? endscript
}
?
執(zhí)行命令:
[root@192 nginx]# /usr/sbin/logrotate -f /etc/logrotate.conf
創(chuàng)建計(jì)劃任務(wù):
[root@192 nginx]# crontab -e
5923* * * /usr/sbin/logrotate-f/etc/logrotate.conf
nginx 的平滑升級
1憨闰、為什么要對 nginx 平滑升級
隨著 nginx 越來越流行状蜗,并且 nginx 的優(yōu)勢也越來越明顯训裆,nginx 的版本迭代也來時(shí)加速模式,1.9.0版本的nginx更新了許多新功能,伴隨著 nginx 的廣泛應(yīng)用,版本升級必然越來越快,線上業(yè)務(wù)不能停,此時(shí) nginx 的升級就需要平滑升級。
nginx 方便地幫助我們實(shí)現(xiàn)了平滑升級双饥。其原理簡單概括迟螺,就是:(1)在不停掉老進(jìn)程的情況下排霉,啟動(dòng)新進(jìn)程。(2)老進(jìn)程負(fù)責(zé)處理仍然沒有處理完的請求浪谴,但不再接受處理請求凶杖。(3)新進(jìn)程接受新請求杈湾。(4)老進(jìn)程處理完所有請求,關(guān)閉所有連接后员凝,停止宣吱。這樣就很方便地實(shí)現(xiàn)了平滑升級。一般有兩種情況下需要升級 nginx,一種是確實(shí)要升級 nginx 的版本,另一種是要為 nginx 添加新的模塊乖订。
2扮饶、nginx 平滑升級描述
多進(jìn)程模式下的請求分配方式
nginx 默認(rèn)工作在多進(jìn)程模式下扛点,即主進(jìn)程(master process)啟動(dòng)后完成配置加載和端口綁定等動(dòng)作,fork出指定數(shù)量的工作進(jìn)程(worker process),這些子進(jìn)程會(huì)持有監(jiān)聽端口的文件描述符(fd)玖瘸,并通過在該描述符上添加監(jiān)聽事件來接受連接
信號的接收和處理
nginx 主進(jìn)程在啟動(dòng)完成后會(huì)進(jìn)入等待狀態(tài)秸讹,負(fù)責(zé)響應(yīng)各類系統(tǒng)消息,如SIGCHLD蔑匣、SIGHUP文虏、SIGUSR2等。
Nginx信號簡介
主進(jìn)程支持的信號
TERM, INT: 立刻退出
QUIT: 等待工作進(jìn)程結(jié)束后再退出
KILL: 強(qiáng)制終止進(jìn)程
HUP: 重新加載配置文件殖演,使用新的配置啟動(dòng)工作進(jìn)程氧秘,并逐步關(guān)閉舊進(jìn)程。
USR1: 重新打開日志文件
USR2: 啟動(dòng)新的主進(jìn)程趴久,實(shí)現(xiàn)熱升級
WINCH: 逐步關(guān)閉工作進(jìn)程
工作進(jìn)程支持的信號
TERM, INT: 立刻退出
QUIT: 等待請求處理結(jié)束后再退出
USR1: 重新打開日志文件
3丸相、nginx 平滑升級實(shí)戰(zhàn)
1、查看現(xiàn)有的 nginx 編譯參數(shù)
[root@nginx-server ~]#? /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.0
built bygcc4.8.520150623(Red Hat4.8.5-36) (GCC)
built with OpenSSL1.0.2k-fips26Jan2017
TLS SNI support enabled
configure arguments:--prefix=/usr/local/nginx--group=nginx--user=nginx--sbin-path=/usr/local/nginx/sbin/nginx--conf-path=/etc/nginx/nginx.conf--error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log--http-client-body-temp-path=/tmp/nginx/client_body--http-proxy-temp-path=/tmp/nginx/proxy--http-fastcgi-temp-path=/tmp/nginx/fastcgi--pid-path=/var/run/nginx.pid--lock-path=/var/lock/nginx--with-http_stub_status_module--with-http_ssl_module--with-http_gzip_static_module--with-pcre--with-http_realip_module--with-stream
2.上傳新版本的源碼包nginx-1.16.1.tar.gz彼棍,解壓到/usr/local/
按照原來的編譯參數(shù)安裝 nginx 的方法進(jìn)行安裝灭忠,只需要到 make,千萬不要 make install 座硕。如果make install 會(huì)將原來的配置文件覆蓋
[root@nginx-server2 ~]# cd /usr/local/nginx-1.16.1/
[root@nginx-server2 nginx-1.16.1]# ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream
[root@nginx-server2 nginx-1.16.1]# make
千萬不要make install
3弛作、備份原 nginx 二進(jìn)制文件
備份二進(jìn)制文件和 nginx 的配置文件(期間nginx不會(huì)停止服務(wù))
[root@nginx-server2 nginx-1.16.1]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_$(date +%F)
4、復(fù)制新的nginx二進(jìn)制文件华匾,進(jìn)入新的nginx源碼包
[root@nginx-server2 nginx-1.16.1]# cp /usr/local/nginx-1.16.1/objs/nginx /usr/local/nginx/sbin/
5映琳、測試新版本的nginx是否正常
[root@nginx-server2 nginx-1.16.1]# /usr/local/nginx/sbin/nginx -t
6、給nginx發(fā)送平滑遷移信號(若不清楚pid路徑蜘拉,請查看nginx配置文件)
[root@nginx-server2 nginx-1.16.1]# kill -USR2 `cat /var/run/nginx.pid`
7萨西、查看nginx pid,會(huì)出現(xiàn)一個(gè)nginx.pid.oldbin
[root@nginx-server2 nginx-1.16.1]# ll /var/run/nginx.pid*
-rw-r--r--1root root5Jul111:29 /var/run/nginx.pid
-rw-r--r--1root root5Jul109:54 /var/run/nginx.pid.oldbin
8旭旭、從容關(guān)閉舊的Nginx進(jìn)程
[root@nginx-server2 nginx-1.16.1]# kill -WINCH `cat /var/run/nginx.pid.oldbin`
9谎脯、此時(shí)不重載配置啟動(dòng)舊的工作進(jìn)程
[root@nginx-server2 nginx-1.16.1]# kill -HUP `cat /var/run/nginx.pid.oldbin`
10、結(jié)束工作進(jìn)程持寄,完成此次升級
[root@nginx-server2 nginx-1.16.1]# kill -QUIT `cat /var/run/nginx.pid.oldbin`
11源梭、驗(yàn)證Nginx是否升級成功
[root@nginx-server2 nginx-1.16.1]# /usr/local/nginx/sbin/nginx -V
12娱俺、訪問驗(yàn)證
[root@localhost nginx-1.6.3]# elinks 10.0.105.189
nginx 錯(cuò)誤頁面配置
nginx錯(cuò)誤頁面包括404 403 500 502 503 504等頁面,只需要在server中增加以下配置即可:
#error_page? 404 403 500 502 503 504? /404.html;
location=/404.html {
? ? ? ? ? ? ? ? ? ? ?? root ? /usr/local/nginx/html;
? ? ? ? ? ? ?? }
注意:
/usr/local/nginx/html/ 路徑下必須有404.html這個(gè)文件7下椤J阜瘛!
404.html上如果引用其他文件的png或css就會(huì)有問題脑溢,顯示不出來僵朗,因?yàn)槠渌募脑L問也要做配置; 為了簡單屑彻,可以將css嵌入文件中验庙,圖片用base編碼嵌入;如下:
[root@localhost html]# vim 404.html
<!DOCTYPE html>
<html>
?? <head>
? ? ?? <title>404</title>
? ? ?? <style>
? ? ? ? ?? .layout-table{display:table;height:100%;width:100%;vertical-align: middle;margin-top:150px}
? ? ? ? ?? .layout-table-cell{display: table-cell;vertical-align: middle;text-align:center}
.layout-tip{font-size:28px;color:#373737;margin: 0 auto;margin-top:16px;border-bottom: 1px solid #eee;padding-bottom: 20px;width: 360px;}
#tips{font-size:18px;color:#666666;margin-top:16px;}
? ? ?? </style>
?? </head>
哎呀社牲,找不到該頁面啦粪薛!
請檢查您的網(wǎng)絡(luò)連接是否正常或者輸入的網(wǎng)址是否正確
? ? ? ? ? ? ? ? ?? </div>
? ? ? ? ? ? ?? </div>
? ? ? ? ?? </div>
? ? ?? </div>
?? </body>
</html>
展示效果搏恤;
nginx 流量控制
流量限制 (rate-limiting)违寿,是Nginx中一個(gè)非常實(shí)用,卻經(jīng)常被錯(cuò)誤理解和錯(cuò)誤配置的功能熟空。我們可以用來限制用戶在給定時(shí)間內(nèi)HTTP請求的數(shù)量藤巢。請求,可以是一個(gè)簡單網(wǎng)站首頁的GET請求息罗,也可以是登錄表單的 POST 請求掂咒。流量限制可以用作安全目的,比如可以減慢暴力密碼破解的速率迈喉。通過將傳入請求的速率限制為真實(shí)用戶的典型值绍刮,并標(biāo)識目標(biāo)URL地址(通過日志),還可以用來抵御 DDOS 攻擊挨摸。更常見的情況孩革,該功能被用來保護(hù)上游應(yīng)用服務(wù)器不被同時(shí)太多用戶請求所壓垮。
以下將會(huì)介紹Nginx的 流量限制 的基礎(chǔ)知識和高級配置得运,”流量限制”在Nginx Plus中也適用膝蜈。
1、Nginx如何限流
Nginx的”流量限制”使用漏桶算法(leaky bucket algorithm)澈圈,該算法在通訊和分組交換計(jì)算機(jī)網(wǎng)絡(luò)中廣泛使用彬檀,用以處理帶寬有限時(shí)的突發(fā)情況。就好比瞬女,一個(gè)桶口在倒水,桶底在漏水的水桶努潘。如果桶口倒水的速率大于桶底的漏水速率诽偷,桶里面的水將會(huì)溢出坤学;同樣,在請求處理方面报慕,水代表來自客戶端的請求深浮,水桶代表根據(jù)”先進(jìn)先出調(diào)度算法”(FIFO)等待被處理的請求隊(duì)列,桶底漏出的水代表離開緩沖區(qū)被服務(wù)器處理的請求眠冈,桶口溢出的水代表被丟棄和不被處理的請求飞苇。
2、配置基本的限流
“流量限制”配置兩個(gè)主要的指令蜗顽,limit_req_zone和limit_req布卡,如下所示:
192.168.62.155配置:
limit_req_zone$binary_remote_addrzone=mylimit:10mrate=1r/s;
upstream myweb {
server192.168.62.157:80weight=1max_fails=1fail_timeout=1;
? ? ?? }
server {
listen80;
? ? ?? server_name localhost;
?
? ? ?? location /login {
limit_reqzone=mylimit;
? ? ? ? ? ? ?? proxy_pass http://myweb;
proxy_set_header Host$host:$server_port;
proxy_set_header X-Real-IP$remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
? ? ? ? ? ? ?? }
}
192.168.62.157配置:
server {
listen80;
? ? ?? server_name localhost;
? ? ?? location /login {
? ? ? ? ? ? ?? root ?? /usr/share/nginx/html;
? ? ? ? ? ? ?? index ? index.html index.html;
? ? ? ? ? ? ?? }
}
limit_req_zone指令定義了流量限制相關(guān)的參數(shù),而limit_req指令在出現(xiàn)的上下文中啟用流量限制(示例中雇盖,對于”/login/”的所有請求)忿等。
limit_req_zone指令通常在HTTP塊中定義,使其可在多個(gè)上下文中使用崔挖,它需要以下三個(gè)參數(shù):
Key - 定義應(yīng)用限制的請求特性贸街。示例中的 Nginx 變量$binary_remote_addr,保存客戶端IP地址的二進(jìn)制形式狸相。這意味著薛匪,我們可以將每個(gè)不同的IP地址限制到,通過第三個(gè)參數(shù)設(shè)置的請求速率脓鹃。(使用該變量是因?yàn)楸茸址问降目蛻舳薎P地址$remote_addr蛋辈,占用更少的空間)
Zone - 定義用于存儲每個(gè)IP地址狀態(tài)以及被限制請求URL訪問頻率的共享內(nèi)存區(qū)域。保存在內(nèi)存共享區(qū)域的信息将谊,意味著可以在Nginx的worker進(jìn)程之間共享冷溶。定義分為兩個(gè)部分:通過zone=keyword標(biāo)識區(qū)域的名字,以及冒號后面跟區(qū)域大小尊浓。16000個(gè)IP地址的狀態(tài)信息逞频,大約需要1MB,所以示例中區(qū)域可以存儲160000個(gè)IP地址栋齿。
Rate - 定義最大請求速率苗胀。在示例中,速率不能超過每秒10個(gè)請求瓦堵。Nginx實(shí)際上以毫秒的粒度來跟蹤請求基协,所以速率限制相當(dāng)于每1000毫秒1個(gè)請求。因?yàn)椴辉试S”突發(fā)情況”(見下一章節(jié))菇用,這意味著在前一個(gè)請求1000毫秒內(nèi)到達(dá)的請求將被拒絕澜驮。
limit_req_zone指令設(shè)置流量限制和共享內(nèi)存區(qū)域的參數(shù),但實(shí)際上并不限制請求速率惋鸥。所以需要通過添加
limit_req指令杂穷,將流量限制應(yīng)用在特定的location或者server塊悍缠。在上面示例中,我們對/login/請求進(jìn)行流量限制耐量。
現(xiàn)在每個(gè)IP地址被限制為每秒只能請求1次/login/飞蚓,更準(zhǔn)確地說,在前一個(gè)請求的1000毫秒內(nèi)不能請求該URL廊蜒。
3趴拧、處理突發(fā)
如果我們在1000毫秒內(nèi)接收到2個(gè)請求,怎么辦山叮?對于第二個(gè)請求著榴,Nginx將給客戶端返回錯(cuò)誤。這可能并不是我們想要的結(jié)果聘芜,因?yàn)閼?yīng)用本質(zhì)上趨向于突發(fā)性兄渺。相反地,我們希望緩沖任何超額的請求汰现,然后及時(shí)地處理它們挂谍。我們更新下配置,在limit_req中使用burst參數(shù):
limit_req_zone$binary_remote_addrzone=mylimit:10mrate=10r/s;
? ? ?? upstream myweb {
server192.168.62.157:80weight=1max_fails=1fail_timeout=1;
? ? ? ? ? ? ?? }
? ? ?? server {
listen80;
? ? ? ? ? ? ?? server_name localhost;
?
? ? ? ? ? ? ?? location /login {
limit_reqzone=mylimitburst=20;
? ? ? ? ? ? ? ? ? ? ?? proxy_pass http://myweb;
proxy_set_header Host$host:$server_port;
proxy_set_header X-Real-IP$remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
? ? ? ? ? ? ? ? ? ? ?? }
? ? ?? }
burst參數(shù)定義了超出zone指定速率的情況下(示例中的mylimit區(qū)域瞎饲,速率限制在每秒10個(gè)請求口叙,或每100毫秒一個(gè)請求),客戶端還能發(fā)起多少請求嗅战。上一個(gè)請求100毫秒內(nèi)到達(dá)的請求將會(huì)被放入隊(duì)列妄田,我們將隊(duì)列大小設(shè)置為20。
這意味著驮捍,如果從一個(gè)給定IP地址發(fā)送21個(gè)請求疟呐,Nginx會(huì)立即將第一個(gè)請求發(fā)送到上游服務(wù)器群,然后將余下20個(gè)請求放在隊(duì)列中东且。然后每100毫秒轉(zhuǎn)發(fā)一個(gè)排隊(duì)的請求启具,只有當(dāng)傳入請求使隊(duì)列中排隊(duì)的請求數(shù)超過20時(shí),Nginx才會(huì)向客戶端返回錯(cuò)誤珊泳。
4鲁冯、配置流量控制相關(guān)功能
1、配置日志記錄
默認(rèn)情況下色查,Nginx會(huì)在日志中記錄由于流量限制而延遲或丟棄的請求薯演,如下所示:
2019/02/1304:20:00 [error]120315#0: *32086 limiting requests, excess: 1.000 by zone "mylimit", client: 192.168.1.2, server: nginx.com, request: "GET / HTTP/1.0", host: "nginx.com"
日志條目中包含的字段:
limiting requests - 表明日志條目記錄的是被“流量限制”請求
excess - 每毫秒超過對應(yīng)“流量限制”配置的請求數(shù)量
zone - 定義實(shí)施“流量限制”的區(qū)域
client - 發(fā)起請求的客戶端IP地址
server - 服務(wù)器IP地址或主機(jī)名
request - 客戶端發(fā)起的實(shí)際HTTP請求
host - HTTP報(bào)頭中host的值
默認(rèn)情況下,Nginx以error級別來記錄被拒絕的請求秧了,如上面示例中的[error]所示(Nginx以較低級別記錄延時(shí)請求跨扮,一般是info級別)。如要更改Nginx的日志記錄級別,需要使用limit_req_log_level指令好港。這里愉镰,我們將被拒絕請求的日志記錄級別設(shè)置為warn:
一定要定義日志位置和級別才可以:
?
limit_req_zone$binary_remote_addrzone=mylimit:10mrate=10r/s;
? ? ?? upstream myweb {
server192.168.62.157:80weight=1max_fails=1fail_timeout=1;
? ? ? ? ? ? ?? }
? ? ?? server {
listen80;
? ? ? ? ? ? ?? server_name localhost;
?
? ? ? ? ? ? ?? location /login {
limit_reqzone=mylimitburst=20;
? ? ? ? ? ? ? ? ? ? ?? limit_req_log_level warn;
? ? ? ? ? ? ? ? ? ? ?? proxy_pass http://myweb;
proxy_set_header Host$host:$server_port;
proxy_set_header X-Real-IP$remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
? ? ? ? ? ? ? ? ? ? ?? }
? ? ?? }
繼續(xù)訪問測試米罚,看error.log日志
2钧汹、發(fā)送到客戶端的錯(cuò)誤代碼
一般情況下,客戶端超過配置的流量限制時(shí)录择,Nginx響應(yīng)狀態(tài)碼為503(Service Temporarily Unavailable)拔莱。可以使用limit_req_status指令來設(shè)置為其它狀態(tài)碼(例如下面的404狀態(tài)碼):
limit_req_zone$binary_remote_addrzone=mylimit:10mrate=10r/s;
? ? upstream myweb {
? ? server192.168.62.157:80weight=1max_fails=1fail_timeout=1;
? ? ? ? }
? ? server {
? ? listen80;
? ? server_name localhost;
? ? location /login {
? ? ? ? ? ? limit_reqzone=mylimitburst=20;
? ? ? ? ? ? limit_req_log_level warn;
? ? ? ? ? ? limit_req_status404;
? ? proxy_pass http://myweb;
proxy_set_header Host$host:$server_port;
? ? ? ? proxy_set_header X-Real-IP$remote_addr;
? ? ? ? proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
? ? }
? ? }
5隘竭、nginx 流量控制總結(jié)
以上已經(jīng)涵蓋了Nginx和Nginx Plus提供的“流量限制”的很多功能塘秦,包括為HTTP請求的不同location設(shè)置請求速率,給“流量限制”配置burst參數(shù)动看。
nginx 訪問控制
1尊剔、nginx 訪問控制模塊
(1)基于IP的訪問控制:http_access_module(2)基于用戶的信任登錄:http_auth_basic_module
2、基于IP的訪問控制
1菱皆、配置語法
Syntax:allow address | CIDR | unix: | all;
default:默認(rèn)無
Context:http须误,server,location
?
Syntax:deny address | CIDR | unix: | all;
default:默認(rèn)無
Context:http仇轻,server京痢,location
2、配置測試
修改/etc/nginx/conf.d/access_mod.conf內(nèi)容如下:
server {
listen80;
? ? ?? server_name localhost;
? ? ?? location ~ ^/admin {
? ? ? ? ? ? ?? root /home/www/html;
? ? ? ? ? ? ?? index index.html index.hml;
deny192.168.1.8;
? ? ? ? ? ? ?? allow all;
#deny 192.168.1.8;
? ? ? ? ? ? ?? }
}
#需要注意:
如果先允許訪問篷店,在定義拒絕訪問祭椰。那么拒絕訪問不生效。
虛擬機(jī)宿主機(jī)IP為192.168.1.8疲陕,虛擬機(jī)IP為192.168.1.11方淤,故這里禁止宿主機(jī)訪問,允許其他所有IP訪問蹄殃。宿主機(jī)訪問http://192.168.1.11/admin携茂,顯示403 Forbidden。當(dāng)然也可以反向配置窃爷,同時(shí)也可以使用IP網(wǎng)段的配置方式邑蒋,如allow 192.168.1.0/24;,表示滿足此網(wǎng)段的IP都可以訪問按厘。
3医吊、指定location拒絕所有請求
如果你想拒絕某個(gè)指定URL地址的所有請求,而不是僅僅對其限速逮京,只需要在location塊中配置deny all指令:
server {
listen80;
? ? ?? server_name localhost;
? ? ?? location /foo.html {
? ? ? ? ? ? ?? root /home/www/html;
? ? ? ? ? ? ?? deny all;
? ? ? ? ? ? ?? }
}
3卿堂、基于用戶的信任登錄
1、配置語法
Syntax:auth_basic string | off;
default:auth_basic off;
Context:http,server草描,location览绿,limit_except
?
Syntax:auth_basic_user_file file;
default:默認(rèn)無
Context:http,server穗慕,location饿敲,limit_except
file:存儲用戶名密碼信息的文件。
2逛绵、配置示例
改名access_mod.conf為auth_mod.conf怀各,內(nèi)容如下:
server {
? ? listen80;
? ? server_name localhost;
? ? location ~ ^/admin {
? ? ? ? root /home/www/html;
? ? ? ? index index.html index.hml;
? ? ? ? auth_basic"Auth access test!";
? ? ? ? auth_basic_user_file /etc/nginx/auth_conf;
? ? ? ? }
}
auth_basic不為off,開啟登錄驗(yàn)證功能术浪,auth_basic_user_file加載賬號密碼文件瓢对。
3、建立口令文件
[root@192 ~]# mkdir /home/www/html/admin -p
[root@192 ~]# vim /home/www/html/admin
hello qf
[root@192 ~]# yum install -y httpd-tools #htpasswd 是開源 http 服務(wù)器 apache httpd 的一個(gè)命令工具胰苏,用于生成 http 基本認(rèn)證的密碼文件
[root@192 ~]# htpasswd -cm /etc/nginx/auth_conf user10? //第一次新建用戶
[root@192 ~]# htpasswd -m /etc/nginx/auth_conf user20? //第二次添加用戶
[root@192 ~]# cat /etc/nginx/auth_conf
user10:$apr1$MOa9UVqF$RlYRMk7eprViEpNtDV0n40
user20:$apr1$biHJhW03$xboNUJgHME6yDd17gkQNb0
4硕蛹、訪問測試
測試失敗
5、局限性
(1)用戶信息依賴文件方式(2)操作管理機(jī)械硕并,效率低下