nginx 日志配置 流量限制

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ī)械硕并,效率低下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末法焰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鲤孵,更是在濱河造成了極大的恐慌壶栋,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件普监,死亡現(xiàn)場離奇詭異贵试,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凯正,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門毙玻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人廊散,你說我怎么就攤上這事桑滩。” “怎么了允睹?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵运准,是天一觀的道長。 經(jīng)常有香客問我缭受,道長胁澳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任米者,我火速辦了婚禮韭畸,結(jié)果婚禮上宇智,老公的妹妹穿的比我還像新娘。我一直安慰自己胰丁,他們只是感情好随橘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锦庸,像睡著了一般机蔗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酸员,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天蜒车,我揣著相機(jī)與錄音讳嘱,去河邊找鬼幔嗦。 笑死晰奖,一個(gè)胖子當(dāng)著我的面吹牛狂塘,可吹牛的內(nèi)容都是我干的窄潭。 我是一名探鬼主播羊精,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宠默,長吁一口氣:“原來是場噩夢啊……” “哼嘉抓!你這毒婦竟也來了始绍?” 一聲冷哼從身側(cè)響起访锻,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拔恰,失蹤者是張志新(化名)和其女友劉穎因谎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颜懊,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡财岔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了河爹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匠璧。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咸这,靈堂內(nèi)的尸體忽然破棺而出夷恍,到底是詐尸還是另有隱情,我是刑警寧澤媳维,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布酿雪,位于F島的核電站,受9級特大地震影響侄刽,放射性物質(zhì)發(fā)生泄漏指黎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一唠梨、第九天 我趴在偏房一處隱蔽的房頂上張望袋励。 院中可真熱鬧,春花似錦、人聲如沸茬故。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磺芭。三九已至赁炎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钾腺,已是汗流浹背徙垫。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留放棒,地道東北人姻报。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像间螟,于是被迫代替她去往敵國和親吴旋。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 大多數(shù) Nginx 新手都會(huì)頻繁遇到這樣一個(gè)困惑厢破,那就是當(dāng)同一個(gè)location配置塊使用了多個(gè) Nginx 模塊...
    SkTj閱讀 7,692評論 0 12
  • I/O模型: 阻塞型荣瑟、非阻塞型、復(fù)用型摩泪、信號驅(qū)動(dòng)型笆焰、異步 同步/異步:關(guān)注消息通知機(jī)制 消息通知:同步:等待對方返...
    Net夜風(fēng)閱讀 2,007評論 0 1
  • 1.簡介: ? Nginx:engine X ,2002年见坑,開源嚷掠,商業(yè)版? http協(xié)議:web服務(wù)器(類似于ht...
    尛尛大尹閱讀 1,867評論 0 3
  • Nginx簡介 解決基于進(jìn)程模型產(chǎn)生的C10K問題,請求時(shí)即使無狀態(tài)連接如web服務(wù)都無法達(dá)到并發(fā)響應(yīng)量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,003評論 0 9
  • I/O模型Nginx介紹Nginx的安裝和目錄結(jié)構(gòu)Nginx的配置Nginx的編譯安裝 一、I/O模型 (一)I/...
    哈嘍別樣閱讀 893評論 0 4