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
上邊咱們已經知道怎麼去設置訪問日誌和錯誤日誌,可是這樣設置有一個弊端:日誌文件都放在同一個文件中,長時間運行後日志文件很大,可能達到幾個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
Nginx的介紹到這裏就基本結束了,這裏彙總了一些Nginx中最經常使用的配置
# 用戶和用戶組 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; } }
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;
#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相同的請求由同一個服務器處理,適用於緩存較多場景。
變量 |
含義 |
$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 |