Nginx——Rewrite及nginx模塊(理論篇)

Rewrite跳轉場景

URL看起來更規範,合理
企業會將動態URL地址僞裝成靜態地址提供服務
網址換新域名後,讓舊的訪問跳轉到新的域名上
服務端某些業務調整

Rewrite跳轉實現

Nginx——Rewrite及nginx模塊(理論篇)

Rewrite實用場景

  • Nginx跳轉需求的實現方式
    使用rewrite進行匹配跳轉
    使用if匹配全局變量後跳轉
    使用location匹配再跳轉
  • rewrite放在server{},if{},location{}段中
  • 對域名或參數字符串
    使用if全局變量匹配
    使用proxy_pass反向代理

常用的正則表達式元字符

字符 說明
^ 匹配輸入字符串的起始位置
$ 匹配輸入字符串的結束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
匹配前面的字符零次或一次
. 匹配除\n之外的任何單個字符,使用諸如"[.\n]"之類的模式,可匹配包括"\n"在內的任意字符
\d 匹配純數字 [0-9]
{n} 重複多次
{n,} 重複n次或更多次
[c] 匹配單個字符c
[a-z] 匹配a-z小寫字母的任意一個
[a-zA-Z] 匹配a-z小寫字母或A-Z大寫字母的任意一個

Rewrite命令

語法:
rewrite <regex>            <replacement>             [flag];
            正則                  跳轉後的內容               rewrite支持的flag標記

flag標記說明:

標記 說明
last 相當於Apache的[L]標記,表示完成rewrite
break 本條規則匹配完成即終止,不再匹配後面的任何規則
redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址,爬蟲不會更新url
permanent 返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址,爬蟲更新url

last和break比較:

last break
使用場景 一般寫在server和if中 一般使用在location中
URL匹配 不終止重寫後的url匹配 終止重寫後的url匹配

location分類

分類:
    location = patt {} [精準匹配]
    location patt {} [一般匹配]
    location ~ patt {} [正則匹配]

正則匹配的常用表達式:

標記 說明
~ 執行一個正則匹配,區分大小寫
~* 執行一個正則匹配,不區分大小寫
!~ 執行一個正則匹配,區分大小寫不匹配
!~* 執行一個正則匹配,不區分大小寫不匹配
^~ 普通字符匹配;使用前綴匹配。如果匹配成功,則不再匹配其他location
= 普通字符精準匹配。也就是完全匹配
@ 定義一個命名的location,使用在內部定向時

location優先級

**相同類型的表達式,字符創長的會優先匹配**
**按優先級排列**
    = 類型
    ^~ 類型表達式
    正則表達式(~和~*)類型
    常規字符串匹配類型,按前綴匹配
    通常匹配(/),如果沒有其他匹配,任何請求都會匹配到

比較rewrite和location

**相同點**
        都能實現跳轉
**不同點**
        rewrite是在同一域名內更改獲取資源的路徑
        location是對一類路徑做控制訪問或方向代理,還可以proxy_pass到其他機器
**rewrite會寫在location裏執行順序**
        執行server塊裏面的rewrite指令
        執行location匹配
        執行選定的location中的rewrite指令

location優先級的示例

##精確匹配/,主機名後面不能帶任何字符串
location = / {
[ configuration A ]     
}

##所有的地址都以/開頭,這條規則將匹配到所有請求,但正則和最長字符串會優先匹配
location  / {
[ configuration B ]     
}

##匹配任何以/documents/開頭的地址,當後面正則表達式沒有匹配到時,才起作用
location /documents/ {
[ configuration C ]
}

##匹配任何以/documents/abc開頭的地址,當後面正則表達式沒有匹配到時,纔會起作用
location ~ /documents/abc {
[ configuration D ]
}

##以/images/開頭的地址,匹配符合後,停止往下匹配
location ^~ /images/ {
[ configuration E ]
}

##匹配所有以gif結尾的請求,/images/下的圖片會被[configuration E]處理,因爲^~的優先級更高
location ~* \.(gif|jpg|jpeg)$ {
[ configuration F ]
}

##最長字符匹配到/images/abc,優先級最低
location /images/abc {
[ configuration G ]
}

##以/images/abc開頭的,優先級次之
location ~ /images/abc {
[ configuration H ]
}

##如果和正則~/images/abc/1.html相比,正則優先級更高
location /images/abc/1.html {
[ configuration I ]
}

location優先級規則

匹配某個具體文件:
(location = 完整路徑)>(location ^~完整路徑)>(location ~完整路徑)>(location ~完整路徑)>(location 完整路徑)>(location /)
用目錄做匹配訪問某個文件:
(location = 目錄)>(location ^~目錄/)>(location ~ 目錄)>(location ~
目錄)>(location 目錄)>(location /)

Nginx模塊

Nginx——Rewrite及nginx模塊(理論篇)

1,Nginx 工作原理

Nginx 由內核和模塊組成。
 Nginx 本身做的工作實際很少,當它接到一個 HTTP 請求時, 它僅僅是通過查找配置文件將此次請求映射到一個 location block,而此 location 中所配 置的各個指令則會啓動不同的模塊去完成工作,因此模塊可以看做 Nginx 真正的勞動工作者。

 通常一個 location 中的指令會涉及一個 handler 模塊和多個 filter 模塊(當然,多個 location 可以複用同一個模塊)。handler 模塊負責處理請求,完成響應內容的生成,而 filter 模塊對響應內容進行處理。 用戶根據自己的需要所開發的模塊都屬於第三方模塊。正是有了這麼多模塊的支撐, Nginx 的功能纔會如此強大。
Nginx 的模塊從結構上分爲核心模塊、基礎模塊和第三方模塊
核心模塊:HTTP 模塊、EVENT 模塊和 MAIL 模塊;
基礎模塊:HTTP Access 模塊、HTTP FastCGI 模塊、HTTP Proxy 模塊和 HTTP Rewrite 模塊;
第三方模塊:HTTP Upstream Request Hash 模塊、Notice 模塊和 HTTP Access Key 模 塊。
Nginx 的模塊從功能上分爲如下三類:
  Handlers(處理器模塊):此類模塊直接處理請求,並進行輸出內容和修改 headers 信息等操作。Handlers 處理器模塊一般只能有一個; Filters(過濾器模塊):此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由 Nginx 輸出; Proxies(代理類模塊):此類模塊是 Nginx 的 HTTP Upstream 之類的模塊,這些模塊主要與後端一些服務比如 FastCGI 等進行交互,實現服務代理和負載均衡等功能。

2. Nginx 的進程模型 在工作方式上,Nginx 分爲單工作進程和多工作進程兩種模式。

 在單工作進程模式下,除主進程外,還有一個工作進程,工作進程是單線程的;
 在多工作進程模式下,每個工作進程包含多個線程。Nginx 默認爲單工作進程模式。

 Nginx 在啓動後,會有一個 master 進程和多個 worker 進程。
 master 進程主要用來管理 worker 進程,主要包含:接收來自外界的信號,向各 worker 進程發送信號,監控 worker 進程的運行狀態,當 worker 進程退出後(異常情況下),會自動 重新啓動新的 worker 進程。 master 進程充當整個進程組與用戶的交互接口,同時對進程進行監護。它不需要處理網絡事件,不負責業務的執行,只會通過管理worker 進程來實現重啓服務、平滑升級、更換日誌文件、配置文件實時生效等功能。

3.Nginx+FastCGI運行原理

 Nginx 不支持對外部程序的直接調用或者解析,所有的外部程序(包括 PHP)必須通過FastCGI 接口來調用。FastCGI 接口在 Linux 下是 socket(這個 socket 可以是文件 socket, 也可以是 ip socket)。 wrapper 爲了調用 CGI 程序,還需要一個 FastCGI 的 wrapper(wrapper 可以理解爲用於啓動另一個程序的程序),這個 wrapper 綁定在某個固定 socket 上,如端口或者文件 socket。當 Nginx 將 CGI 請求發送給這個 socket 的時候,通過 FastCGI 接口,wrapper 接收到請求,然後 Fork(派生)出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接着 wrapper 再將返回的數據通過 FastCGI 接口,沿着固定的 socket傳遞給 Nginx;最後 Nginx 將返回的數據(html 頁面或者圖片)發送給客戶端。

謝謝閱讀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章