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中