Nginx相關(guān)知識點

序言

Nginx是lgor Sysoev為俄羅斯訪問量第二的rambler.ru站點設(shè)計開發(fā)的氧猬。從2004年發(fā)布至今背犯,憑借開源的力量,已經(jīng)接近成熟與完善盅抚。

Nginx功能豐富漠魏,可作為HTTP服務(wù)器,也可作為反向代理服務(wù)器妄均,郵件服務(wù)器柱锹。支持FastCGI、SSL丰包、Virtual Host奕纫、URL Rewrite、Gzip等功能烫沙。并且支持很多第三方的模塊擴(kuò)展。

Nginx的穩(wěn)定性隙笆、功能集锌蓄、示例配置文件和低系統(tǒng)資源的消耗讓他后來居上,在全球活躍的網(wǎng)站中有12.18%的使用比率撑柔,大約為2220萬個網(wǎng)站瘸爽。

1.Nginx環(huán)境搭建;

自行安裝

2.Nginx_代理_反向代理

代理_反向代理.png

正向代理: 代理服務(wù)器站在客戶端那邊就是正向代理;
反向代理: 代理服務(wù)器站在原始服務(wù)器那邊就是反向代理;
詳解參考點擊Nginx正向代理與反向代理

Nginx在做反向代理時,提供性能穩(wěn)定铅忿,并且能夠提供配置靈活的轉(zhuǎn)發(fā)功能剪决。
Nginx可以根據(jù)不同的正則匹配,采取不同的轉(zhuǎn)發(fā)策略,比如圖片文件結(jié)尾的走文件服務(wù)器柑潦,動態(tài)頁面走web服務(wù)器享言,只要你正則寫的沒問題,又有相對應(yīng)的服務(wù)器解決方案渗鬼,你就可以隨心所欲的玩览露。
并且Nginx對返回結(jié)果進(jìn)行錯誤頁跳轉(zhuǎn),異常判斷等譬胎。如果被分發(fā)的服務(wù)器存在異常差牛,他可以將請求重新轉(zhuǎn)發(fā)給另外一臺服務(wù)器,然后自動去除異常服務(wù)器堰乔。

2.1 設(shè)置 404 頁面導(dǎo)向地址

error_page 404 https://www.runnob.com; #錯誤頁
proxy_intercept_errors on;    #如果被代理服務(wù)器返回的狀態(tài)碼為400或者大于400偏化,設(shè)置的error_page配置起作用。默認(rèn)為off镐侯。

2.2 如果我們的代理只允許接受get侦讨,post請求方法的一種

proxy_method get;    #支持客戶端的請求方法。post/get析孽;

2.3 設(shè)置支持的http協(xié)議版本

proxy_http_version 1.0 ; #Nginx服務(wù)器提供代理服務(wù)的http協(xié)議版本1.0搭伤,1.1,默認(rèn)設(shè)置為1.0版本

2.4 負(fù)載均衡的服務(wù)器如果有一臺服務(wù)器宕機(jī)的解決方案

如果你的nginx服務(wù)器給2臺web服務(wù)器做代理袜瞬,負(fù)載均衡算法采用輪詢怜俐,那么當(dāng)你的一臺機(jī)器web程序iis關(guān)閉,也就是說web不能訪問邓尤,那么nginx服務(wù)器分發(fā)請求還是會給這臺不能訪問的web服務(wù)器拍鲤,如果這里的響應(yīng)連接時間過長,就會導(dǎo)致客戶端的頁面一直在等待響應(yīng)汞扎,對用戶來說體驗就打打折扣季稳,這里我們怎么避免這樣的情況發(fā)生呢。這里我配張圖來說明下問題澈魄。

image.png

如果負(fù)載均衡中其中web2發(fā)生這樣的情況景鼠,nginx首先會去web1請求,但是nginx在配置不當(dāng)?shù)那闆r下會繼續(xù)分發(fā)請求道web2痹扇,然后等待web2響應(yīng)铛漓,直到我們的響應(yīng)時間超時,才會把請求重新分發(fā)給web1鲫构,這里的響應(yīng)時間如果過長浓恶,用戶等待的時間就會越長。

下面的配置是解決方案之一:

proxy_connect_timeout 1;   #nginx服務(wù)器與被代理的服務(wù)器建立連接的超時時間结笨,默認(rèn)60秒
proxy_read_timeout 1; #nginx服務(wù)器想被代理服務(wù)器組發(fā)出read請求后包晰,等待響應(yīng)的超時間湿镀,默認(rèn)為60秒。
proxy_send_timeout 1; #nginx服務(wù)器想被代理服務(wù)器組發(fā)出write請求后伐憾,等待響應(yīng)的超時間勉痴,默認(rèn)為60秒。
proxy_ignore_client_abort on;  #客戶端斷網(wǎng)時塞耕,nginx服務(wù)器是否終端對被代理服務(wù)器的請求蚀腿。默認(rèn)為off。

2.5 根據(jù)代理服務(wù)器網(wǎng)絡(luò)訪問返回的指令來決定請求方向:

如果使用upstream指令配置了一組服務(wù)器作為被代理服務(wù)器扫外,服務(wù)器中的訪問算法遵循配置的負(fù)載均衡規(guī)則莉钙,同時可以使用該指令配置在發(fā)生哪些異常情況時,將請求順次交由下一組服務(wù)器處理筛谚。

proxy_next_upstream timeout;  #反向代理upstream中設(shè)置的服務(wù)器組磁玉,出現(xiàn)故障時,被代理服務(wù)器返回的狀態(tài)值驾讲。

狀態(tài)值可以是:error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

  • error:建立連接或向被代理的服務(wù)器發(fā)送請求或讀取響應(yīng)信息時服務(wù)器發(fā)生錯誤蚊伞。
  • timeout:建立連接,想被代理服務(wù)器發(fā)送請求或讀取響應(yīng)信息時服務(wù)器發(fā)生超時吮铭。
  • invalid_header:被代理服務(wù)器返回的響應(yīng)頭異常时迫。
  • off:無法將請求分發(fā)給被代理的服務(wù)器。
  • http_400谓晌,....:被代理服務(wù)器返回的狀態(tài)碼為400掠拳,500,502纸肉,等溺欧。

2.6 如果你想通過http獲取客戶的真是ip而不是獲取代理服務(wù)器的ip地址,那么要做如下的設(shè)置柏肪。

proxy_set_header Host $host; #只要用戶在瀏覽器中訪問的域名綁定了 VIP VIP 下面有RS姐刁;則就用$host ;host是訪問URL中的域名和端口  www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr;  #把源IP 【$remote_addr,建立HTTP連接header里面的信息】賦值給X-Real-IP;這樣在代碼中 $X-Real-IP來獲取 源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作為代理服務(wù)器時烦味,設(shè)置的IP列表聂使,會把經(jīng)過的機(jī)器ip,代理機(jī)器ip都記錄下來谬俄,用 【柏靶,】隔開;代碼中用 echo $x-forwarded-for |awk -F, '{print $1}' 來作為源IP

2.7 代理配置文件部分配置

include       mime.types;   #文件擴(kuò)展名與文件類型映射表
default_type  application/octet-stream; #默認(rèn)文件類型凤瘦,默認(rèn)為text/plain
#access_log off; #取消服務(wù)日志    
log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
access_log log/access.log myFormat;  #combined為日志格式的默認(rèn)值
sendfile on;   #允許sendfile方式傳輸文件,默認(rèn)為off案铺,可以在http塊蔬芥,server塊,location塊。
sendfile_max_chunk 100k;  #每個進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值笔诵,默認(rèn)為0返吻,即不設(shè)上限。
keepalive_timeout 65;  #連接超時時間乎婿,默認(rèn)為75s测僵,可以在http,server谢翎,location塊捍靠。
proxy_connect_timeout 1;   #nginx服務(wù)器與被代理的服務(wù)器建立連接的超時時間,默認(rèn)60秒
proxy_read_timeout 1; #nginx服務(wù)器想被代理服務(wù)器組發(fā)出read請求后森逮,等待響應(yīng)的超時間榨婆,默認(rèn)為60秒。
proxy_send_timeout 1; #nginx服務(wù)器想被代理服務(wù)器組發(fā)出write請求后褒侧,等待響應(yīng)的超時間良风,默認(rèn)為60秒宵荒。
proxy_http_version 1.0 ; #Nginx服務(wù)器提供代理服務(wù)的http協(xié)議版本1.0奋单,1.1逆日,默認(rèn)設(shè)置為1.0版本件豌。
#proxy_method get;    #支持客戶端的請求方法溜嗜。post/get钞啸;
proxy_ignore_client_abort on;  #客戶端斷網(wǎng)時遥巴,nginx服務(wù)器是否中止對被代理服務(wù)器的請求在孝。默認(rèn)為off唾糯。
proxy_ignore_headers "Expires" "Set-Cookie";  #Nginx服務(wù)器不處理設(shè)置的http相應(yīng)投中的頭域怠硼,這里空格隔開可以設(shè)置多個。
proxy_intercept_errors on;    #如果被代理服務(wù)器返回的狀態(tài)碼為400或者大于400移怯,設(shè)置的error_page配置起作用香璃。默認(rèn)為off。
proxy_headers_hash_max_size 1024; #存放http報文頭的哈希表容量上限舟误,默認(rèn)為512個字符葡秒。
proxy_headers_hash_bucket_size 128; #nginx服務(wù)器申請存放http報文頭的哈希表容量大小。默認(rèn)為64個字符嵌溢。
proxy_next_upstream timeout;  #反向代理upstream中設(shè)置的服務(wù)器組眯牧,出現(xiàn)故障時,被代理服務(wù)器返回的狀態(tài)值赖草。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
#proxy_ssl_session_reuse on; 默認(rèn)為on学少,如果我們在錯誤日志中發(fā)現(xiàn)“SSL3_GET_FINSHED:digest check failed”的情況時,可以將該指令設(shè)置為off秧骑。

3.Nginx_負(fù)載均衡;

Nginx提供的負(fù)載均衡策略有2種:內(nèi)置策略和擴(kuò)展策略版确。
內(nèi)置策略: 1.輪詢;2.加權(quán)輪詢;3.Ip hash;
擴(kuò)展策略: 就天馬行空扣囊,只有你想不到的沒有他做不到的啦,你可以參照所有的負(fù)載均衡算法绒疗,給他一一找出來做下實現(xiàn)侵歇。

負(fù)載均衡_1.輪詢_2.加權(quán)輪詢.png

Ip hash算法,對客戶端請求的ip進(jìn)行hash操作吓蘑,然后根據(jù)hash結(jié)果將同一個客戶端ip的請求分發(fā)給同一臺服務(wù)器進(jìn)行處理惕虑,可以解決session不共享的問題。

負(fù)載均衡_IPHash算法.png

3.1 負(fù)載均衡的配置

3.1.1 輪詢 nginx默認(rèn)就是輪詢其權(quán)重都默認(rèn)為1磨镶,服務(wù)器處理請求的順序:ABABABABAB...

upstream mysvr { 
    server 192.168.10.121:3333;
    server 192.168.10.122:3333;
}
server {
    ....
    location  ~*^.+$ {         
        proxy_pass  http://mysvr;  #請求轉(zhuǎn)向mysvr 定義的服務(wù)器列表         
    }
}

3.1.2 熱備:如果你有2臺服務(wù)器溃蔫,當(dāng)一臺服務(wù)器發(fā)生事故時,才啟用第二臺服務(wù)器給提供服務(wù)棋嘲。服務(wù)器處理請求的順序:AAAAAA突然A掛啦酒唉,BBBBBBBBBBBBBB.....

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333 backup;  #熱備     
}

3.1.3 加權(quán)輪詢:跟據(jù)配置的權(quán)重的大小而分發(fā)給不同服務(wù)器不同數(shù)量的請求。如果不設(shè)置沸移,則默認(rèn)為1痪伦。下面服務(wù)器的請求順序為:ABBABBABBABBABB....

upstream mysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}

3.1.4 ip_hash:nginx會讓相同的客戶端ip請求相同的服務(wù)器。

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333;
    ip_hash;
}

nginx負(fù)載均衡配置的幾個狀態(tài)參數(shù)

  • down: 表示當(dāng)前的server暫時不參與負(fù)載均衡雹锣。
  • backup: 預(yù)留的備份機(jī)器网沾。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時候,才會請求backup機(jī)器蕊爵,因此這臺機(jī)器的壓力最輕辉哥。
  • max_fails: 允許請求失敗的次數(shù),默認(rèn)為1攒射。當(dāng)超過最大次數(shù)時醋旦,返回proxy_next_upstream 模塊定義的錯誤。
  • fail_timeout: 在經(jīng)歷了max_fails次失敗后会放,暫停服務(wù)的時間饲齐。max_fails可以和fail_timeout一起使用。

eg:

upstream mysvr { 
    server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
    server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;    
}

4.Nginx緩存配置指南

4.1 如何配置基本緩存設(shè)置

開啟簡單的緩存配置咧最,只需要兩個指令:proxy_cache_path和proxy_cache捂人。
proxy_cache_path: 配置緩存的存放地址和其他的一些常用配置;
proxy_cache:指令是為了啟動緩存;

proxy_cache_path /path/to/cache levels=1:2 keys_zone=mycache:10m max_size=10g inactive=60m use_temp_path=off;
server {
  # ...
  location / {
    proxy_cache mycache;
    proxy_pass http://my_upstream;
  }
}

相關(guān)配置說明:

  • /path/to/cache 本地路徑,用來設(shè)置Nginx緩存資源的存放地址
  • levels 默認(rèn)所有緩存文件都放在同一個/path/to/cache下矢沿,但是會影響緩存的性能滥搭,因此通常會在/path/to/cache下面建立子目錄用來分別存放不同的文件。假設(shè)levels=1:2捣鲸,Nginx為將要緩存的資源生成的key為f4cd0fbc769e94925ec5540b6a4136d0瑟匆,那么key的最后一位0,以及倒數(shù)第2-3位6d作為兩級的子目錄栽惶,也就是該資源最終會被緩存到/path/to/cache/0/6d目錄中
  • key_zone 在共享內(nèi)存中設(shè)置一塊存儲區(qū)域來存放緩存的key和metadata(類似使用次數(shù))愁溜,這樣nginx可以快速判斷一個request是否命中或者未命中緩存无午,1m可以存儲8000個key,10m可以存儲80000個key
  • max_size 最大cache空間祝谚,如果不指定,會使用掉所有disk space酣衷,當(dāng)達(dá)到配額后交惯,會刪除最少使用的cache文件
  • inactive 未被訪問文件在緩存中保留時間,本配置中如果60分鐘未被訪問則不論狀態(tài)是否為expired穿仪,緩存控制程序會刪掉文件席爽。inactive默認(rèn)是10分鐘。需要注意的是啊片,inactive和expired配置項的含義是不同的只锻,expired只是緩存過期,但不會被刪除紫谷,inactive是刪除指定時間內(nèi)未被訪問的緩存文件
  • use_temp_path 如果為off齐饮,則nginx會將緩存文件直接寫入指定的cache文件中,而不是使用temp_path存儲笤昨,official建議為off祖驱,避免文件在不同文件系統(tǒng)中不必要的拷貝
  • proxy_cache 啟用proxy cache,并指定key_zone瞒窒。另外捺僻,如果proxy_cache off表示關(guān)閉掉緩存。

4.2 proxy_cache其他相關(guān)指令集

4.2.1 proxy_no_cache

Syntax:proxy_no_cache string ...;
Default: —
Context: http , server , location

該指令用于定義滿足條件的響應(yīng)不會被保存到緩存中崇裁。在條件字符串中至少有一個條件不為空或者0匕坯,符合這樣條件的響應(yīng)才不會被緩存。
舉例如下

proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma    $http_authorization;

其中拔稳,cookie_nocache葛峻、arg_nocache...皆為變量,可以根據(jù)你訪問的匹配策略來設(shè)置壳炎,其值只有2類泞歉,0和非0;

訪問匹配策略例如:

if ($request_uri ~ ^/(login|register|password\/reset)/) { set $cookie_nocache 1; }

如果在此鏈?zhǔn)脚渲弥校灰幸粋€值不為0匿辩,則不會cache腰耙;例如:

proxy_no_cache $cookie_nocache(0) $arg_nocache(1) $arg_comment(0)

則不會被cache.

注:一般會配合proxy_cache_bypass共同使用;

4.2.2 proxy_cache_bypass

Syntax: proxy_cache_bypass string ...;
Default: —
Context: http , server , location

該指令用于定義哪些情況不從cache讀取铲球,直接從backend獲取資源挺庞;配置方式同proxy_no_cache。

4.2.3 proxy_cache_key

Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

給緩存數(shù)據(jù)定義一個鍵稼病,例如

proxy_cache_key “$host$request_uri $cookie_user”;

4.2.4 proxy_cache_methods

Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location

該指令用于設(shè)置緩存哪些HTTP方法,默認(rèn)緩存HTTP GET/HEAD方法,不緩存HTTP POST 方法.选侨。

4.2.5 proxy_cache_valid

Syntax: proxy_cache_valid [code ...] time;
Default:  —
Context:  http, server, location

設(shè)置不同響應(yīng)碼的緩存時間掖鱼,當(dāng)不指定響應(yīng)碼的時候,例如

proxy_cache_valid 5m;

只對響應(yīng)碼為200援制,301戏挡,302的訪問請求資源設(shè)置緩存時間,此外可以個性化定制晨仑,例如:

proxy_cache_valid 200 302 10m; 
proxy_cache_valid 301 1h; 
proxy_cache_valid 404 1m; 
proxy_cache_valid any 1m;

此外褐墅,還可以在相應(yīng)header里設(shè)置優(yōu)先級更高的緩存有效時間:

  • “X-Accel-Expires”,設(shè)置響應(yīng)的緩存過期時間,以秒為單位洪己;0為不緩存妥凳;
  • 如果沒有設(shè)置“X-Accel-Expires” header,則關(guān)于緩存的配置策略可能會在“Expires”或者“Cache-Control” header中答捕;
  • 如果header含有“Set-Cookie”,則響應(yīng)不會被緩存逝钥,類似的配置可以在“proxy_ignore_header”中可見;
  • header包含“Vary”并且設(shè)置為“*”拱镐,則請求不會被緩存艘款,如果“Vary”有具體的值,則對應(yīng)的請求會被緩存沃琅;

4.2.6 proxy_ignore_headers

Syntax:  proxy_ignore_headers field ...;
Default:  —
Context:  http, server, location

不緩存包含在field的響應(yīng)header磷箕,可以設(shè)置的值有:“X-Accel-Redirect”, “X-Accel-Expires”, “X-Accel-Limit-Rate”,“X-Accel-Buffering”, “X-Accel-Charset”, “Expires”, “Cache-Control”, “Set-Cookie” (0.8.44), and “Vary”阵难。
如果上述的header field沒有設(shè)置為忽略岳枷,則header filed中有“X-Accel-Expires”, “Expires”, “Cache-Control”, “Set-Cookie”, and “Vary”的話,響應(yīng)會被緩存呜叫。

4.2.7 proxy_cache_min_uses指令

Syntax:  proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;
Context: http, server, location

該指令用于設(shè)置緩存的最小使用次數(shù),默認(rèn)值為1

4.3 nginx緩存擴(kuò)展

4.3.1 proxy_cache_use_stale增強(qiáng)站點容錯能力

源站有問題時空繁,nginx可以通過proxy_cache_use_stale指令開啟容錯能力,即使用緩存內(nèi)容來響應(yīng)客戶端的請求朱庆。舉例如下:

location / {  
    ...  
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;  
}  

如上配置表示盛泡,當(dāng)作為cache的NGINX收到源站返回error、timeout或者其他指定的5XX錯誤娱颊,并且在其緩存中有請求文件的陳舊版本傲诵,則會將這些陳舊版本的文件而不是錯誤信息發(fā)送給客戶端。

4.3.2 多磁盤分割緩存

使用NGINX箱硕,不需要建立一個RAID(磁盤陣列)拴竹。如果有多個硬盤,NGINX可以用來在多個硬盤之間分割緩存剧罩。舉例如下:

# 我們假設(shè)每塊硬盤掛載在相應(yīng)的目錄中:/mnt/disk1栓拜、/mnt/disk2、/mnt/disk3

proxy_cache_path /mnt/disk1 levels=1:2 keys_zone=cache_1:256m max_size=1024G use_temp_path=off;
proxy_cache_path /mnt/disk2 levels=1:2 keys_zone=cache_2:256m max_size=1024G use_temp_path=off;
proxy_cache_path /mnt/disk3 levels=1:2 keys_zone=cache_3:256m max_size=1024G use_temp_path=off;
split_clients $request_uri $disk {
    33.3%     1;
    33.3%     2;
    *         3;
}

location / {
    proxy_pass http://backend;
    proxy_cache_key $request_uri;
    proxy_cache cache_$disk;
}

在這份配置中,使用了3個獨立的緩存幕与,每個緩存專用一塊硬盤挑势,另外,3個獨立的線程池也各自專用一塊硬盤啦鸣。

緩存之間(其結(jié)果就是磁盤之間)的負(fù)載均衡使用split_clients模塊潮饱,split_clients非常適用于這個任務(wù)。
在 proxy_cache_path指令中設(shè)置use_temp_path=off诫给,表示NGINX會將臨時文件保存在緩存數(shù)據(jù)的同一目錄中饼齿。這是為了避免在更新緩存時,磁盤之間互相復(fù)制響應(yīng)數(shù)據(jù)蝙搔。

5.Nginx日志文件 + 日志文件切分講解;

5.1日志文件作用

通過訪問日志,你可以得到用戶地域來源考传、跳轉(zhuǎn)來源吃型、使用終端、某個URL訪問量等相關(guān)信息僚楞;
通過錯誤日志勤晚,你可以得到系統(tǒng)某個服務(wù)或server的性能瓶頸等。
因此泉褐,將日志好好利用赐写,你可以得到很多有價值的信息。

5.2 Nginx日志格式

打開nginx.conf配置文件:vim /usr/local/nginx/conf/nginx.conf
日志部分內(nèi)容:
#access_log logs/access.log main;
日志生成的到Nginx根目錄logs/access.log文件膜赃,默認(rèn)使用“main”日志格式挺邀,也可以自定義格式。
默認(rèn)“main”日志格式:

默認(rèn)“main”日志格式.png

參數(shù)明細(xì)表:

參數(shù) 解釋
$remote_addr 客戶端的ip地址(代理服務(wù)器跳座,顯示代理服務(wù)ip)
$remote_user 用于記錄遠(yuǎn)程客戶端的用戶名稱(一般為“-”)
$time_local 用于記錄訪問時間和時區(qū)
$request 用于記錄請求的url以及請求方法
$status 響應(yīng)狀態(tài)碼端铛,例如:200成功、404頁面找不到等疲眷。
$body_bytes_sent 給客戶端發(fā)送的文件主體內(nèi)容字節(jié)數(shù)
$http_user_agent 用戶所使用的代理(一般為瀏覽器)
$http_x_forwarded_for 可以記錄客戶端IP禾蚕,通過代理服務(wù)器來記錄客戶端的ip地址
$http_referer 可以記錄用戶是從哪個鏈接訪問過來的

查看日志命令tail -f /usr/local/nginx/logs/access.log

5.3 Nginx自定義日志

打開nginx.conf配置文件去掉#注釋見下圖:


image.png

自定義某一個server配置的日志,使用“main”日志格式狂丝。


image.png

日志生成的到Nginx根目錄logs/access.log文件换淆,默認(rèn)使用“main”日志格式,也可以自定義格式几颜。

重新讀取加載Nginx配置文件:

執(zhí)行命令:nginx-s reload

5.4 Nginx日志分隔

網(wǎng)上一位老師寫的log文件分解的腳本

此腳本執(zhí)行時間根據(jù)自己公司情況來定,可以設(shè)置默認(rèn)一天執(zhí)行一次;

#!/bin/sh
BASE_DIR=/usr/local/nginx
BASE_FILE_NAME=bhz.com.access.log
CURRENT_PATH=$BASE_DIR/logs
BAK_PATH=$BASE_DIR/datalogs
CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME
BAK_TIME=`/bin/date -d yesterday +%Y%m%d%H%M`
BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME
echo $BAK_FILE
$BASE_DIR/sbin/nginx -s stop
mv $CURRENT_FILE $BAK_FILE
$BASE_DIR/sbin/nginx

創(chuàng)建crontab設(shè)置作業(yè)

設(shè)置日志文件存放目錄crontab -e

*/1 * * * * sh /usr/local/software/nginx/nginx_log.sh
此設(shè)置的為一分鐘,如果設(shè)置一天自行修改;

6.Nginx配置文件結(jié)構(gòu)

默認(rèn)的 nginx 配置文件 nginx.conf 內(nèi)容如下

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #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;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

nginx 文件結(jié)構(gòu)

...              #全局塊

events {         #events塊
   ...
}

http      #http塊
{
    ...   #http全局塊
    server        #server塊
    { 
        ...       #server全局塊
        location [PATTERN]   #location塊
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局塊
}
  • 1倍试、全局塊:配置影響nginx全局的指令。一般有運行nginx服務(wù)器的用戶組蛋哭,nginx進(jìn)程pid存放路徑易猫,日志存放路徑,配置文件引入,允許生成worker process數(shù)等准颓。
  • 2哈蝇、events塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。有每個進(jìn)程的最大連接數(shù)攘已,選取哪種事件驅(qū)動模型處理連接請求炮赦,是否允許同時接受多個網(wǎng)路連接,開啟多個網(wǎng)絡(luò)連接序列化等样勃。
  • 3吠勘、http塊:可以嵌套多個server,配置代理峡眶,緩存剧防,日志定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入辫樱,mime-type定義峭拘,日志自定義,是否使用sendfile傳輸文件狮暑,連接超時時間鸡挠,單連接請求數(shù)等。
  • 4搬男、server塊:配置虛擬主機(jī)的相關(guān)參數(shù)拣展,一個http中可以有多個server。
  • 5缔逛、location塊:配置請求的路由备埃,以及各種頁面的處理情況。

示例

########### 每個指令必須有分號結(jié)束褐奴。#################
#user administrator administrators;  #配置用戶或者組瓜喇,默認(rèn)為nobody nobody。
#worker_processes 2;  #允許生成的進(jìn)程數(shù)歉糜,默認(rèn)為1
#pid /nginx/pid/nginx.pid;   #指定nginx進(jìn)程運行文件存放地址
error_log log/error.log debug;  #制定日志路徑乘寒,級別。這個設(shè)置可以放入全局塊匪补,http塊伞辛,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #設(shè)置網(wǎng)路連接序列化夯缺,防止驚群現(xiàn)象發(fā)生蚤氏,默認(rèn)為on
    multi_accept on;  #設(shè)置一個進(jìn)程是否同時接受多個網(wǎng)絡(luò)連接,默認(rèn)為off
    #use epoll;      #事件驅(qū)動模型踊兜,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大連接數(shù)竿滨,默認(rèn)為512
}
http {
    include       mime.types;   #文件擴(kuò)展名與文件類型映射表
    default_type  application/octet-stream; #默認(rèn)文件類型,默認(rèn)為text/plain
    #access_log off; #取消服務(wù)日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined為日志格式的默認(rèn)值
    sendfile on;   #允許sendfile方式傳輸文件,默認(rèn)為off于游,可以在http塊毁葱,server塊,location塊贰剥。
    sendfile_max_chunk 100k;  #每個進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值倾剿,默認(rèn)為0,即不設(shè)上限蚌成。
    keepalive_timeout 65;  #連接超時時間前痘,默認(rèn)為75s,可以在http担忧,server芹缔,location塊。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯誤頁
    server {
        keepalive_requests 120; #單連接請求上限次數(shù)瓶盛。
        listen       4545;   #監(jiān)聽端口
        server_name  127.0.0.1;   #監(jiān)聽地址       
        location  ~*^.+$ {       #請求的url過濾最欠,正則匹配,~為區(qū)分大小寫蓬网,~*為不區(qū)分大小寫。
           #root path;  #根目錄
           #index vv.txt;  #設(shè)置默認(rèn)頁
           proxy_pass  http://mysvr;  #請求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #允許的ip           
        } 
    }
}

幾個常見配置項:

    1. $remote_addr 與 $http_x_forwarded_for 用以記錄客戶端的ip地址鹉勒;
    1. $remote_user :用來記錄客戶端用戶名稱帆锋;
  • 3.$time_local : 用來記錄訪問時間與時區(qū);
  • 4.$request : 用來記錄請求的url與http協(xié)議禽额;
  • 5.$status : 用來記錄請求狀態(tài)锯厢;成功是200;
  • 6.$body_bytes_s ent :記錄發(fā)送給客戶端文件主體內(nèi)容大懈埂实辑;
  • 7.$http_referer :用來記錄從那個頁面鏈接訪問過來的;
  • 8.$http_user_agent :記錄客戶端瀏覽器的相關(guān)信息藻丢;

注意:

驚群現(xiàn)象:一個網(wǎng)路連接到來剪撬,多個睡眠的進(jìn)程被同事叫醒,但只有一個進(jìn)程能獲得鏈接悠反,這樣會影響系統(tǒng)性能
每個指令必須有分號結(jié)束残黑。

7.Nginx 常用命令

進(jìn)入安裝目錄下的sbin

./nginx  #啟動
./nginx -t #檢查 nginx.conf配置文件
./nginx -s reload #重啟
./nginx -s stop # 停止

參考
Nginx 配置詳解
Nginx 反向代理與負(fù)載均衡詳解
正向代理與反向代理【總結(jié)】
Nginx緩存配置指南
nginx 緩存與優(yōu)化
Nginx日志管理
Nginx詳解(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市斋否,隨后出現(xiàn)的幾起案子梨水,更是在濱河造成了極大的恐慌,老刑警劉巖茵臭,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疫诽,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奇徒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門雏亚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逼龟,你說我怎么就攤上這事评凝。” “怎么了腺律?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵奕短,是天一觀的道長。 經(jīng)常有香客問我匀钧,道長翎碑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任之斯,我火速辦了婚禮日杈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘佑刷。我一直安慰自己莉擒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布瘫絮。 她就那樣靜靜地躺著涨冀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麦萤。 梳的紋絲不亂的頭發(fā)上鹿鳖,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機(jī)與錄音壮莹,去河邊找鬼翅帜。 笑死,一個胖子當(dāng)著我的面吹牛命满,可吹牛的內(nèi)容都是我干的涝滴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼胶台,長吁一口氣:“原來是場噩夢啊……” “哼狭莱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起概作,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤腋妙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讯榕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骤素,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匙睹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了济竹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痕檬。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖送浊,靈堂內(nèi)的尸體忽然破棺而出梦谜,到底是詐尸還是另有隱情,我是刑警寧澤袭景,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布唁桩,位于F島的核電站,受9級特大地震影響耸棒,放射性物質(zhì)發(fā)生泄漏荒澡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一与殃、第九天 我趴在偏房一處隱蔽的房頂上張望单山。 院中可真熱鬧,春花似錦幅疼、人聲如沸米奸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悴晰。三九已至,卻和暖如春狼忱,著一層夾襖步出監(jiān)牢的瞬間膨疏,已是汗流浹背一睁。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工钻弄, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人者吁。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓窘俺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親复凳。 傳聞我的和親對象是個殘疾皇子瘤泪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

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