快速掌握Nginx(四) —— Nginx日誌切片和經常使用配置總結

1.Nginx日誌管理

1.日誌簡單介紹

  Nginx提供了日誌記錄的功能,日誌文件在對咱們管理網站十分有用,經過訪問日誌(access_log)咱們能夠獲取請求來源、客戶端信息、請求的資源等信息;經過錯誤日誌(error_log)能夠獲取錯誤發生時間、錯誤信息等,方便咱們及時定位和修復錯誤。看一下Nginx中日誌相關的指令。javascript

#設置訪問日誌:訪問日誌文件爲nginx/logs/mysite.access.log,格式爲main
  access_log  logs/mysite.access.log main;
          位置 格式
#設置錯誤日誌:錯誤日誌文件爲nginx/logs/mysite.error.log,記錄級別爲error   error_log logs/mysite.error.log error;
            位置        級別
#定義main格式的日誌 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

  在Nginx日誌中嚴重程度:debug<info<notice<warn<error<crit,通常記錄warn/error級別;定義日誌格式中,$開頭的是Nginx中的變量,在前面已經總結過了,爲了方便查看本篇底部也放了一份。記錄網站的訪問/錯誤日誌,十分簡單,只須要把access_log/error_log指令放在須要記錄的server主機內便可。也能夠把access_log/error_log指令放在http中用來記錄全局日誌。css

  看一個簡單的Nginx配置文件,爲了方便演示,這裏只配置了默認主機,並刪去了Nginx中一些和日誌不相關的配置:html

worker_processes 2;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;#定義main格式的日誌
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
  #默認主機
  server{
        listen 80;
        server_name localhost;
        location /{
                root html;
                index index.html;
         }
        #訪問日誌,名字問nginx/logs/mysite.access.log,格式爲main格式
        access_log  logs/mysite.access.log main; #錯誤日誌,記錄級別爲error
        error_log logs/mysite.error.log error;
      }
}

  當咱們輸入虛擬機IP會訪問到默認主機,這時在nginx/logs目錄下自動生成訪問日誌mysite.access.log和錯誤日誌mysite.error.log。內容以下:java

mysite.access.log內容node

 

  訪問日誌的內容爲main格式中定義的信息,某些信息不存在沒有顯示。咱們也能夠自定義訪問日誌的格式。linux

mysite.error.log內容nginx

  能夠看到錯誤緣由是favicon.ico文件找不到,咱們也能夠知道錯誤發生的時間,請求,客戶端和服務端IP等信息。web

 2.日誌切片

  上邊咱們已經知道怎麼去設置訪問日誌和錯誤日誌,可是這樣設置有一個弊端:日誌文件都放在同一個文件中,長時間運行後日志文件很大,可能達到幾個G,甚至十幾個G大小,查看起來很不方便。爲了解決這個問題就須要進行日誌切片,如每小時或者天天的日誌放在一個單獨的文件中。怎麼實現呢?整體思路是:設置一個定時任務,每隔一段時間將日誌文件剪切到一個特定的目錄下。算法

  這裏以訪問日誌切片爲例,爲了方便演示這裏把每分鐘的訪問日誌放在一個單獨的文件中,首先,添加一個存放日誌文件的目錄,執行命令 mkdir /usr/local/nginx/logs/mysitelogs ,咱們打算把mysite的全部訪問日誌都放在這個文件夾下。而後添加一個切割日誌的腳本,執行命令 vim /usr/local/nginx/mysitelog.sh ,腳本內容以下:shell

#mysite.com虛擬主機的日誌存放路徑
LOGPATH=/usr/local/nginx/logs/mysite.access.log
#日誌備份文件目錄,mysite虛擬主機的備份日誌放在logs下的單獨目錄下
BASEPATH=/usr/local/nginx/logs/mysitelogs
#一分鐘記錄一次 
bak=$BASEPATH/$(date -d today +%Y%m%d%H%M).mysite.access.log
#重名日誌文件
mv $LOGPATH $bak
touch $LOGPATH
#向nginx主進程發送信號,從新寫日誌
/usr/local/nginx/sbin/nginx -s reopen

最後添加一個定時任務,執行命令 crontab -e ,編輯內容以下,表示每分鐘執行一次mysitelog.sh腳本:

* * * * * sh /usr/local/nginx/mysitelog.sh

到這裏日誌切片就結束了,咱們看一個日誌文件, cd /usr/local/nginx/logs/mysitelogs 到日誌文件夾下,看到日誌文件爲每分鐘存儲一次,前綴格式爲yyyyMMddhhmm:

 

補充:咱們在實際使用時通常把一天的日誌放在一個文件中(高併發量的除外),下邊的腳本實現天天晚上11:30分存儲一第二天志文件:

#-------------------shell腳本   
#該虛擬主機的日誌存放路徑
LOGPATH=/usr/local/nginx/logs/mysite.access.log
#日誌備份文件目錄,mysite虛擬主機的備份日誌放在logs下的單獨目錄下
BASEPATH=/usr/local/nginx/logs/mysitelogs
#一天記錄一次,格式爲20190326mysite.access.log
bak=$BASEPATH/$(date -d yesterday +%Y%m%d)mysite.access.log
#重名日誌文件
echo $bak
mv $LOGPATH $bak
touch $LOGPATH
#向nginx主進程發送信號,從新打開日誌
/usr/local/nginx/sbin/nginx -s reopen

#------------------定時任務
30 23 * * * sh /usr/local/nginx/mysitelog.sh
View Code

2.經常使用Nginx配置總結

  Nginx的介紹到這裏就基本結束了,這裏彙總了一些Nginx中最經常使用的配置

2.1 基本配置

# 用戶和用戶組
user wyy wyy

#工做進程個數,一般設置和邏輯cpu個數一致
worker_processes  8;
#cpu親和性,每一個進程分配一個cpu  00000001表示第一個cpu,00000010表示第二個cpu,依次類推
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#若是是兩個邏輯cpu,能夠設置worker_processes  2; worker_cpu_affinity 01 10;

#一個nginx工做進程最多能夠打開的文件描述符個數 ,最好和linux最多能打開的文件描述符個數(查看命令:ulimit-n)保持一致。
#出現報錯:too open many file,這時咱們把worker_rlimit_nofile 值設置大一些就能夠了。
worker_rlimit_nofile 65535


#記錄的級別嚴重程度:debug<info<notice<warn<error<crit],通常記錄warn/error級別
#錯誤日誌,級別爲error
error_log  logs/error.log  error;

#記錄nginx的master進程的pid
pid        logs/nginx.pid;

 
events {
    use epoll ;               #多路複用IO的一種方式,效率很高,支持linux2.6以上內核
    worker_connections  1024; #每一個工做進程的最大鏈接數,一臺nginx的理論最大鏈接數就是(單個工做進程的最大鏈接數*工做進程個數)
    multi_accept on;          #儘量多地接受請求
}


http {
    #媒體類型,定義在nginx/conf/mine.types中
    include       mime.types;
    #默認的媒體類型
    default_type  application/octet-stream;
    #main日誌格式
    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  logs/access.log  main;
  #nginx是否調用sendfile函數(zero,copy等)來輸出文件,普通應用都應該設置成on
    sendfile        on;
  #默認開啓,nginx接受到數據包不立刻發送,等到數據包達到必定大小再發送,使用Nagle算法控制。減小tcp傳輸次數,防止網絡阻塞
    tcp_nopush      on;
  #tcp不延遲,和tcp_nopush相反,接收到數據包就發送,提升數據的實時響應
  #tcp_nodelay off;
    #長鏈接,請求資源獲取完畢後不斷開鏈接,60s後關閉該鏈接
    keepalive_timeout  60;
 
   #上傳時單個文件最大爲10M
  client_max_body_size 10m;
  #客戶端的請求頭緩衝區大小,通常設置爲系統分頁大小便可(查詢系統分頁命令:getconf PAGESIZE)
  #client_header_buffer_size 4k;
  #客戶端的請求體緩衝區大小,超過這個大小存放在臨時文件中,
  #client_body_buffer_size 8k;

  ######超時管理 代理服務器時纔有用 (超時都返回502超時錯誤)
  #nginx鏈接後臺服務器超時時間,
  proxy_connect_timeout 90;
  #後臺服務器回傳數據超時時間,90s傳輸數據未完成就報錯
  proxy_send_timeout 90;
  #鏈接成功,等待後臺服務器響應的超時時間
  proxy_read_timeout 90;

  #爲打開文件設定緩存,默認是不啓用的,max指定緩存數量,建議和最多能打開文件描述符個數(查詢命令:ulimit -n)一致,inactive是指通過多長時間文件沒被請求後刪除緩存
  open_file_cache max=65535 inactive=60s;
  #多久檢查一次緩存的有效信息
  open_file_cache_valid 30s;
  
  #定義負載均衡模塊,
  upstream mysiteServers{
      server 123.11.1.2:8080 weight=1 max_fails=2 fail_timeout=30s;
      server 123.11.1.3:8080 weight=2 max_fails=2 fail_timeout=30s;
      server 123.11.1.4:8080 weight=3 max_fails=2 fail_timeout=30s;
  }

  server{
       servername :www.site1.com  www.site1.cn;
    #首頁 
  location = / {
      proxy_pass http:/123.11.1.1:8080/Home/Index;
    }

  #靜態文件
  location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
      root /webroot/res/;
    #緩存十分鐘
    expires:600;
    }
  #通用規則,用來轉發動態請求到後端應用服務器
  location / {
      proxy_pass http://mysiteServers;
    }
 }

2.2 壓縮配置

  gzip能夠放在http/server/location/if下,用於壓縮請求資源,減少網絡傳輸的數據尺寸。gzip壓縮經常使用於文本類型(css/js等)文件壓縮,二進制文件(如圖片,視頻)壓縮比不大,建議使用緩存(expires)進行優化:

#開啓gzip壓縮
gzip  on;
#最小壓縮大小4000字節,小於4000字節就不壓縮了
gzip_min_length 4000;
#壓縮的緩衝設置,緩衝32塊開始輸出,每塊4k大小
#gzip_buffers 32 4k;
#壓縮採用的版本
gzip_http_version 1.1;
#壓縮級別,級別越大壓縮後尺寸越小方便傳輸,但同時壓縮時耗費cpu資源也越大(最大爲9,通常不要超過6)
gizp_comp_level 4;
#壓縮的文件類型,不屬於這些類型的就不壓縮(能夠經過 cat nginx/conf/mine.types查看文件類型),注:二進制文件如圖片/視頻的壓縮比不大,不建議壓縮
gzip_types  application/javascript  text/plain  text/css text/xml;   
# 是否傳輸gzip壓縮標誌,請求頭中有vary標誌的返回壓縮版本文件,沒有vary頭的返回原始文件
gzip_vary on;

2.3 負載均衡配置

#1.weight
#指定輪詢權重,weight越大,轉發概率越大,通常用於後端服務器性能不均的狀況。
  upstream mysiteServers{
    server 192.168.70.1:8080 weight=1;
    server 192.168.70.2:8080 weight=3;
  }
#2.ip_hash
#每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,適用後臺服務器緩存多的場合,也能夠解決session的問題。
  upstream mysiteServers{
    ip_hash;
    server 192.168.70.1:8080;
    server 192.168.70.2:8080;
  }
        
#一些參數
  upstream mysiteServers{
    server 192.168.70.1:8080 down;
    server 192.168.70.1:8081 weight=2;
    server 192.168.70.2:8080;
    server 192.168.70.2:8081 backup;
  }
#1.down表示的server暫時不參與負載均衡,請求不會轉發給這臺服務器;
#2.weight爲weight越大,負載的權重就越大;
#3.max_fails續請求失敗的次數默認爲1.當超過最大次數時,再也不轉發請求給這臺服務器;
#4.fail_timeout:max_fails次失敗後,暫停多久後再向這臺服務器轉發請求;
#5.backup: 其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。


補充:也可使用第三方模塊實現其餘負載均衡模式: ①添加nginx-upstream-fair模塊能夠實現按響應性能進行負載均衡,響應速度越快的服務器分發請求的概率越大; ②添加nginx_upstream_hash模塊能夠實現按請求url來進行轉發請求,url相同的請求由同一個服務器處理,適用於緩存較多場景。

 補充:Nginx的一些全局變量

 

變量

含義

$args

請求中的參數,同$query_string

$content length

請求頭中的Content-length字段。

$content_type

請求頭中的Content-Type字段。

$document_root

當前請求在root指令中指定的值。

$host

請求主機頭字段,不然爲服務器名稱。

$http_user_agent

用戶代理,通常爲用戶瀏覽器信息

$http_cookie

客戶端cookie信息

$limit_rate

這個變量能夠限制鏈接速率。

$request_method

客戶端請求的動做,一般爲GET或POST。

$remote_addr

客戶端的IP地址。

$remote_port

客戶端的端口。

$remote_user

已經通過Auth Basic Module驗證的用戶名。

$request_filename

當前請求的文件路徑,由root或alias指令與URI請求生成。

$scheme

協議名(如http,https)。

$server_protocol

請求使用的協議,一般是HTTP/1.0或HTTP/1.1。

$server_addr

服務器地址,在完成一次系統調用後能夠肯定這個值。

$server_name

服務器名稱。

$server_port

請求到達服務器的端口號。

$request_uri

包含請求參數的原始URI,不包含主機名,如」/user/getuser?id=100」。

$uri

不帶請求參數的當前URI,$uri不包含主機名,如」/user/getuser」。

$document_uri

與$uri相同

$http_x_forwarded_for

 代理過程的IP

相關文章
相關標籤/搜索