nginx+fastcgi工作原理與nginx-rewrite模組的應用

2020-08-11 23:15:52

nginx工作原理與nginx-rewrite模組的應用

一、nginx工作原理原理及分類

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

1、從結構分類

【1】nginx核心模組

HTTP 模組,EVENT 模組(進程應用的模組),MAIL 模組(郵件使用的模組)

【2】nginx基礎模組

HTTP Access 模組、HTTP FastCGI 模組、HTTP Proxy 模組和 HTTP Rewrite 模組

【3】nginx第三方模組

HTTP Upstream Request Hash 模組、Notice 模組和 HTTP Access Key模組等等

2、從功能分類

通常一個 location 中的指令會涉及一個 handler 模組和多個 filter 模組(當然,多個 location 可以複用同一個模組)。handler 模組負責處理請求,完成響應內容的生成,而 filter 模組對響應內容進行處理。 使用者根據自己的需要所開發的模組都屬於第三方模組。正是有了這麼多模組的支撐, Nginx 的功能纔會如此強大。

【1】handles(處理模組)

此類模組直接處理請求,並進行輸出內容和修改 headers 資訊等操作。Handlers 處理器模組一般只能有一個

【2】fliter(過濾器模組)

此類模組主要對其他處理器模組輸出的內容進行修改操作,最後由 Nginx 輸出

【3】proxies(代理類模組)

此類模組是 Nginx 的 HTTP Upstream 之類的模組,這些模組主要與後端一些服務比如 FastCGI 等進行互動,實現服務代理和負載均衡等功能。

二、nginx進程

在工作方式上,Nginx 分爲單工作進程和多工作進程兩種模式。在單工作進程模式下,除主進程外,還有一個工作進程,工作進程是單執行緒的;在多工作進程模式下,每個工作進程包含多個執行緒。Nginx 預設爲單工作進程模式。

1、master進程

master 進程主要用來管理 worker 進程,主要包含:接收來自外界的信號,向各worker進程發送信號,監控worker進程的執行狀態,當worker進程退出後(異常情況下),會自動 重新啓動新的worker進程。master進程充當整個行程羣組與使用者的互動介面,同時對進程進行監護,不需要處理網路事件,不負責業務的執行。

2、worker進程

worker進程實現重新啓動服務、平滑升級、更換日誌檔案、組態檔實時生效等功能。

三、Nginx+FastCGI(快速通用閘道器介面)執行原理

1、認識FastCGI

FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行着,只要啓用後,不會每次都要花費時間去fork一次(這是CGI最爲人詬病的fork-and-execute 模式)。它還支援分佈式的運算, 即 FastCGI 程式可以在網站伺服器以外的主機上執行並且接受來自其它網站伺服器來的請求。
FastCGI是語言無關的、可伸縮架構的CGI開放擴充套件,其主要行爲是將CGI直譯器進程保持在記憶體中並因此獲得較高的效能。衆所周知,CGI直譯器的反覆 反復載入是CGI效能低下的主要原因,如果CGI直譯器保持在記憶體中並接受FastCGI進程管理器排程,則可以提供良好的效能、伸縮性、Fail- Over特性等等。

2、執行原理

在这里插入图片描述
上圖就是執行原理,如果你悟到了你就懂了,悟不到我解釋了也是白搭!

四、nginx-rewrite模組介紹

因爲目前很多工作前端開發都會選擇使用Nginx作爲反向代理伺服器,但是平時業務需要難免碰到重寫URL,Nginx的Rewrite跳轉有什麼使用場景呢?公司更換域名需要存取舊域名時跳轉到新域名請求靜態檔案跳轉到CDN根據使用者裝置不同跳轉到不同站點(pc端,行動端)不得不說的是Apache伺服器規則庫很強大,做跳轉也很簡單,但是Nginx使用Rewrite實現跳轉效率更高,所以這也是我們需要學習Nginx的Rewrite模組的目的所在。

1、Rewrite是Nginx的靜態重寫模組,跳轉的使用場景有以下幾種情形:

可以改變使用者存取的URL
可以將動態URL僞裝成靜態URL提供服務
可以存取舊域名時跳轉到新域名
可以根據變數,目錄,用戶端資訊等跳轉不同的URL

2、Rewrite的實現跳轉

Nginx利用ngx_http_rewrite_module模組解析和處理rewrite請求。Rewrite用於實現URL重寫,其實有點類似於重定向功能,可以將使用者的請求重寫至別的目錄,在一定程度上提高了網站安全性。Rewrite支援if條件判斷,但不支援else判斷。而且Rewrite需要PCRE支援,一次重定向最多可以跳轉10次,超過10次將返回500錯誤。Rewrite模組包含set命令,可以建立變數用來記錄條件標識或者傳遞變數到其他的Location中。Rewrite實際上就是使用Nginx已有的全域性變數或者通過set命令設定的變數結合正則表達式實現URL重寫。

3、Rewrite使用場景

在Nginx中使用Rewrite實現跳轉有以下三種場景:
【1】直接用Rewrite進行匹配跳轉
【2】使用if匹配全域性變數進行跳轉
【3】使用location匹配再進行跳轉
所以說rewrite語句只允許放在server{ },if{ },location{ }中。location只對域名後邊的除去傳遞參數外的字串起作用,而對域名或參數字串使用if全域性變數匹配,用proxy_pass反向代理。
rewrite語法:

rewrite regex replacement [flag]

rewrite將使用者請求的URL基於正則表達式regex進行檢查,匹配到時將其替換爲正則表達式對應的新的URL。若在同一級設定模組中存在多個rewrite規則,則會自頂向下檢查。replacement則爲跳轉後的內容。[flag]作爲識別符號用於控制回圈機制 機製,如果替換後的URL是以http或者https開頭,則會直接301永久重定向。

【1】flag參數介紹

rewrite語句有四種flag狀態:redirect、permanent、break、last。前兩種屬於客戶瀏覽器重新發起對新地址的請求,後兩種是在WEB伺服器內部實現跳轉。
(1)redirect :臨時重定向,重寫完成後以臨時重定向方式直接返回重寫後生成的新URL給用戶端,有用戶端重新發起請求,使用相對路徑,http://或https://開頭,狀態碼:302
(2)permanent :永久重定向,以永久重定向的方式直接返回重寫後生成的新URL給用戶端,由用戶端重新發起新的請求,狀態碼:301
(3)last :重寫完成後停止對當前location中後續的其他重寫操作,而後對新的URL啓動新一輪重寫檢查,不建議在location中使用
(4)break :重寫完成後停止對當前URL在當前location中後續的其他重寫操作,而後直接跳轉至重寫規則匹配塊之後的其他設定;結束回圈,建議在location中使用。

【2】臨時重定向與永久重定向的區別:

臨時重定向不會快取新域名的解析記錄,但是永久重定向會快取新域名的解析記錄。

【3】location分類

location = patt {} //精準匹配
location patt {} //一般匹配
location ~ patt {} //正則匹配
(1)正則匹配的常用表達式
在这里插入图片描述
(2)location優先順序規則
(location = 完整路徑)>(location ^~ 完整路徑)>(location ~* 完整路徑)>(location ~ 完整路徑)>(location 完整路徑)>(location /)

五、nginx-rewrite模組設定

1、基於域名跳轉

公司舊域名www.kgc.com因爲業務需求有變更,需要使用新的域名www.test.com代替,但不能廢除舊的域名,從舊的域名跳轉到新的域名,且保持其參數不變。

【1】安裝nginx源和軟體包
[root@localhost ~]#rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@localhost ~]#yum install -y nginx
【2】修改預設站點組態檔
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  www.kgc.com;
    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    location / {
        if ($host = 'www.kgc.com') {
          rewrite ^/(.*)$ http://www.kgc.com/$1 permanent;
 }
}

上面組態檔中出現了www.kgc.com域名,所以要設定域名解析服務。

【3】啓動nginx
[root@localhost ~]#systemctl restart nginx

2、基於IP地址跳轉

所有IP存取任何內容都顯示一個固定維護頁面,只有公司內部ip存取正常定義IP地址192.168.60.33是公司內部IP地址,192.168.60.44不是公司內部IP地址

【1】安裝nginx源和軟體包
[root@localhost ~]#rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@localhost ~]#yum install -y nginx
【2】修改預設站點組態檔
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  www.kgc.com;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    
    set $rewrite true;
    if ($remote_addr = "192.168.60.33") {
       set $rewrite false;}    
    if ($rewrite = true) {  
       rewrite (.+) /error.html;}    
    location = /error.html {       
       root    /usr/share/nginx/html;}
【3】啓動nginx
[root@localhost ~]#systemctl restart nginx

3、基於舊、新域名跳轉並加上目錄

將域名http://bbs.kgc.com下面 下麪的發帖都跳轉到http://www.kgc.com/bbs,切域名跳轉後參數不變

【1】安裝nginx源和軟體包
[root@localhost ~]#rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@localhost ~]#yum install -y nginx
【2】修改預設站點組態檔
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  bbs.kgc.com;
    location /post {
       rewrite (.+) http://www.kgc.com/bbs$1 permanent;
}
location / { 
  root   /usr/share/nginx/html;      
  index  index.html index.htm;
}

上面組態檔中實現的是bbs.kgc.com域名,所以要修改DNS服務的數據組態檔

【3】啓動nginx
[root@localhost ~]#systemctl restart nginx