nginx ip 訪問次數和連線數 + 日誌檔案的配置
一、限制同一時間段ip訪問次數。
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #定義一個名為one的limit_req_zone用來儲存session,大小是10M記憶體, #以$binary_remote_addr 為key,限制平均每秒的請求為1個, #1M能儲存16000個狀態,rete的值必須為整數, server { ... location /search/ { limit_req zone=one burst=5; #限制每ip每秒不超過1個請求,漏桶數burst為5,也就是佇列. #nodelay,如果不設定該選項,嚴格使用平均速率限制請求數,超過的請求被延時處理. #舉個栗子: #設定rate=20r/s每秒請求數為20個,漏桶數burst為5個, #brust的意思就是,如果第1秒、2,3,4秒請求為19個,第5秒的請求為25個是被允許的,可以理解為20+5 #但是如果你第1秒就25個請求,第2秒超過20的請求返回503錯誤. #如果區域儲存空間不足,伺服器將返回503(服務臨時不可用)錯誤 #速率在每秒請求中指定(r/s)。如果需要每秒少於一個請求的速率,則以每分鐘的請求(r/m)指定。 }
還可以限制來自單個IP地址的請求的處理速率,同時限制虛擬伺服器的請求處理速率:
http { limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=10r/s; ... server { ... limit_req zone=perip burst=5 nodelay; #漏桶數為5個.也就是佇列數.nodelay:不啟用延遲. limit_req zone=perserver burst=10; #限制nginx的處理速率為每秒10個 }
二、限制單個ip的連線數
http { limit_conn_zone $binary_remote_addr zone=addr:10m; #定義一個名為addr的limit_req_zone用來儲存session,大小是10M記憶體, #以$binary_remote_addr 為key, #nginx 1.18以後用limit_conn_zone替換了limit_conn, #且只能放在http{}程式碼段. ... server { ... location /download/ { limit_conn addr 1; #連線數限制 #設定給定鍵值的共享記憶體區域和允許的最大連線數。超出此限制時,伺服器將返回503(服務臨時不可用)錯誤. #如果區域儲存空間不足,伺服器將返回503(服務臨時不可用)錯誤 }
三、開啟錯誤日誌和訪問日誌
access_log: 用來指定日誌檔案的存放路徑
寫在http 下則是對所有的server的訪問進行記錄,寫在server下則是對當前server的訪問記錄進行記載(個人建議不同server的訪問日誌分開記載)。
error_log: nginx 的錯誤日誌
這個是對nginx的訪問出錯的時候進行記錄,(我一般寫在檔案最上邊)
log_format : 定義log的格式。
引數如下
$remote_addr |
客戶端的ip地址(代理伺服器,顯示代理服務ip) |
$remote_user |
用於記錄遠端客戶端的使用者名稱稱(一般為“-”) |
$time_local |
用於記錄訪問時間和時區 |
$request |
用於記錄請求的url以及請求方法 |
$status |
響應狀態碼,例如:200成功、404頁面找不到等。 |
$body_bytes_sent |
給客戶端傳送的檔案主體內容位元組數 |
$http_user_agent |
使用者所使用的代理(一般為瀏覽器) |
$http_x_forwarded_for |
可以記錄客戶端IP,通過代理伺服器來記錄客戶端的ip地址 |
$http_referer |
可以記錄使用者是從哪個連結訪問過來的 |
使用 tail -20f 檔案 來看後20行內容。
完整配置日誌如下:
http { log_format main '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server{
limit_req zone=one burst=5;
listen 8000;
server_name 123.56.223.123;
access_log log/access.log main; # 這個log 的地址為 /user/share/nginx/log, 指明使用main格式
location /{
proxy_pass http://127.0.0.1:5558;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
日誌內容如下:
內容借鑑:
https://www.cnblogs.com/crazylqy/p/6891991.html
https://www.cnblogs.com/xulan0922/p/9219178.html