nginx的rewrite,gzip,反向代理學習筆記

rewrite模塊名:ngx_http_rewrite_module默認自動被編譯php

指令:rewrite regex replacement [flag]html

regex :正則表達式,用於匹配用戶請求的uringinx

replacement:重寫後的結果正則表達式

flag 能夠有四個值分別爲last,break,redirect,permanentvim

  last:重寫完成以後中止對當前uri的進一步處理,改成對新uri的新一輪處理,在nginx內部完成,客戶端不會察覺後端

 

  break:重寫完成後,中止對當前uri的處理,轉向其後面的其餘處理瀏覽器

 

  補充:last 重寫以後還會在nginx內部從新自上而下檢查rewrite匹配規則,break則不會從新檢查rewrite匹配規則緩存

 

  redirect:重寫完成以後會返回給客戶端一個臨時重定向,客戶端瀏覽器自動對新的uri發起請求(302)服務器

 

  permanent:重寫完成後會返回給客戶端一個永久重定向,客戶端瀏覽器自動對新的uri發起請求(301)url

應用上下文:http,server,location,if

 

實例:

.*表示任意內容,\.表示對.進行轉義  $1對前面的第一個()中的內容$2引用第二個()中的內容以此類推

http://www.b.com/download/a/media/12.php--->/tmp/download/a/mp3/12.html

 

若是flag沒有指定,則默認爲last

PCRE正則表達式元字符

      字符匹配 . [] [^]

      次數匹配 * + ? {m} {m,} {m,n}

      位置定位 ^,$

      或者 |

      分組 () 後向引用 $1 $2…

 

rewrite_log on|off  是否將重寫日誌記入error log中,默認爲關閉

www.c.com/bbs/index.html---> /tmp/vhost2/forum/index.html

 

上面的if語句的做用:www.c.com/download ---> www.c.com/index.html   return表示把新的uri發送給客戶端,由客戶端從新

請求

 

http://www.c.com/hello/ ---> https://www.baidu.com

 

模塊ngx_http_gzip_static_module是nginx會讀取預先gzip壓縮好的文件,靜態壓縮只需壓縮一次,不須要每次請求都壓縮,此模

塊編譯時須要使用--with-http_gzip_static_module參數纔會被編譯,模塊ngx_http_gzip_module不需指定默認會被編譯

 

gzip on 開啓動態壓縮功能  gzip_min_length 觸發壓縮功能的響應報文的最小長度 單位爲字節  gzip_http_version 觸發壓縮功能

的http協議最小版本  gzip_disable msie6 對IE6的瀏覽器發送響應報文時不進行壓縮   gzip_types 對哪些類型的資源作壓縮,好比

壓縮圖片:image/jpeg image/gif image/png

 

反向代理模塊ngx_http_proxy_module 默認會被編譯

proxy_pass URL

應用上下文:location,location內部的if中,limit_except

反代www.d.com--->http://192.168.238.150  注意若是location中使用了模式匹配如 ~*,~等proxy_pass最後的斜線不能加

否者會報錯

這裏還得說下location 後面匹配的優先級

 =:URI的精確匹配;

~:作正則表達式匹配,區分字符大小寫;
~*:作正則表達式匹配,不區分字符大小寫;
^~:URI的左半部分匹配,不區分字符大小寫;

匹配優先級:精確匹配=、^~、~或~*、不帶符號的URL

 

上面三個圖都是反代www.d.com/admin --> http://192.168.238.150/admin/    所以若是http://192.168.238.150/ 則最後

的/會被location後定義的參數覆蓋,若是http://192.168.238.150則location後定義的參數會被添加到http://192.168.238.150後

面, 

 

若是location後面跟了正則表達式或者location上下文使用了rewrite則proxy_pass 後的url 必須是http://192.168.238.150這種形

式,後面不能帶uri,哪怕只有/也不能夠

 

接下來了解一個參數proxy_set_header field value,用於proxy_server向backend server 發送請求報文時,將某請求首部從新賦

值,或在原有值後面添加一個新值,或者自定義一個新首部,好比proxy_set_header Host value  Host是請求報文請求首部的

Host,這裏的value有兩個值要介紹一下,$proxy_host  假如proxy_pass http://www.a.com 那$proxy_host指的就是

www.a.com,  $http_host 這個是客戶端請求報文請求首部Host的值

 

 

上面的proxy_set_header做用是當nginx做爲反代去請求backend server時會在請求首部添加一個x-real-ip的首部,而且指定其值

爲$remote_addr

 

$remote_addr表明上游客戶端的ip地址,咱們去backend server上修改一下日誌記錄格式就能夠將上游客戶端的ip地址記錄到日誌

中去了(後端是httpd server)

 到後端server修改日誌格式 vim /var/log/httpd/access.log

 

將LogFormat 後的%h修改成%{x-real-ip}i  後面的i是指定其值的,可是若是有多層反代怎麼解決記錄真實ip地址的問題?

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for  其中X-Forwarded-For是約定俗成的首部名,

$proxy_add_x_forwarded_for的含義是無論X-Forwarded-For中有沒有值都將上游客戶端的ip地址添加到X-Forwarded-For首部

中,每臺反代都添加這條命令就解決了上面的問題,若是經過了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串ip

值,究竟哪一個纔是真正的用戶端的真實IP呢?

X-Forwarded-For: client1, proxy1, proxy2

X-Forwarded-For會取得第一個非unknown的有效IP字符串。

 

 

上面的設置,當代理服務器向後端請求時,會將請求報文的請求首部Host設置爲客戶端請求報文的請求首部Host的值

 

add_header這個參數是當代理服務器返回給客戶端是在響應首部添加Via這個首部並賦值爲$server_addr  $server_addr是nginx的

內置變量其值爲代理服務器本身的ip地址

 

 

反向代理緩存能把靜態頁面和動態頁面的請求都緩存下來,proxy_cache_path 只能存放於http上下文中,不能放置於server或

location

proxy_cache_path 指定緩存目錄,prxoy的上一級目錄必須存在不然會報錯, levels指定該緩存空間有兩層hash目錄,第一層目錄

爲1個字符,第二層爲2個字符,keys_zone=pcache 參數用來爲這個緩存區起名(proxy_cache 指令須要用到  其後對應緩存區名

稱)後面的10m指內存緩存空間大小爲10MB(這個10MB指的是對文件元數據的緩存), inactive=3h 指若是緩存數據在3小時

(天:d、秒:s、分:m)內沒有被訪問,將自動被刪除 max_size=10g 指硬盤緩存大小爲10GB,proxy_cache調用緩存區若是後

面跟的值爲off表示禁用  proxy_cache_key $request_uri  以$request_uri的值爲緩存鍵值,這樣作即便有多個主機名也同樣能緩

存命中了 ,在這裏proxy_cache_key參數能夠省略不指 

請求

http://www.ooxx.com/book/1232.html 

$request_uri表明的是/book/1232.html

proxy_cache_valid指令,能夠在http、server、location中使用,若是proxy_cache_valid 不指定狀態碼,直接指定緩存時間,將

只緩存默認的狀態碼(200、30一、302),而若是須要對304也指定,則須要寫完整的狀態碼,如上面寫的200 304

 

proxy_connect_timeout 定義與後端服務器的超時時長;默認爲60s 建議不超過75s

proxy_send_timeout 請求報文發送給後端服務器的超時時長,默認爲60s

proxy_read_timeout 等待後端服務器發送響應報文的超時時長,默認爲60s

上面三個指令能夠定義在http server location中

相關文章
相關標籤/搜索