1. 程式人生 > 實用技巧 >nginx ip 訪問次數和連線數 + 日誌檔案的配置

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