Nginx Record

簡介

nginx是開發中常用的web server,又可以做反向代理,另外k8s中的ingress默認使用的也是nginx,所以有必要深入瞭解下nginx的相關知識,及一些必要的原理知識。

常用指令

location

location [=|~|~*|^~|@] pattern { ... }
  • =代表路徑完全匹配
  • ~區分大小寫的正則匹配
server {
    server_name web.com;
    location ~ ^/abcd$ {
    […]
    }
}

^/abcd\(這個正則表達式表示字符串必須以/開始,以\)結束,中間必須是abcd

http://web.com/abcd匹配(完全匹配)
http://web.com/ABCD不匹配,大小寫敏感
http://web.com/abcd?param1&param2匹配
http://web.com/abcd/不匹配,不能匹配正則表達式
http://web.com/abcde不匹配,不能匹配正則表達式
  • ~* 不區分大小寫的正則匹配

查找的順序及優先級

當有多條 location 規則時,nginx 有一套比較複雜的規則,優先級如下:

  • 精確匹配 =
  • 前綴匹配 ^~(立刻停止後續的正則搜索)
  • 按文件中順序的正則匹配 *
  • 匹配不帶任何修飾的前綴匹配。

rewrite模塊

break

break
Context: server, location, if

停止執行 ngx_http_rewrite_module 的指令集,但是其他模塊指令是不受影響的

官方:

last
   stops processing the current set of ngx_http_rewrite_module directives followed by a search for a new location matching the changed URI;

break
   stops processing the current set of ngx_http_rewrite_module directives;

last: 停止當前這個請求,並根據rewrite匹配的規則重新發起一個請求。新請求又從第一階段開始執行…
break:相對last,break並不會重新發起一個請求,只是跳過當前的rewrite階段,並執行本請求後續的執行階段…
實例

server {
    listen 80 default_server;
    server_name dcshi.com;
    root www;

    location /break/ {
        rewrite ^/break/(.*) /test/$1 break;
        echo "break page";
    } 

    location /last/ {
         rewrite ^/last/(.*) /test/$1 last;
         echo "last page";
    }    

    location /test/ {
       echo "test page";
    }
}

if

Context: server, location

依據指定的條件決定是否執行 if 塊語句中的內容

if 中的幾種 判斷條件

  • 一個變量名,如果變量 $variable 的值爲空字符串或者字符串"0",則爲false
  • 變量與一個字符串的比較 相等爲(=) 不相等爲(!=) 注意此處不要把相等當做賦值語句啊
  • 變量與一個正則表達式的模式匹配 操作符可以是(~ 區分大小寫的正則匹配, ~不區分大小寫的正則匹配, !~ !~,前面兩者的非)
  • 檢測文件是否存在 使用 -f(存在) 和 !-f(不存在)
  • 檢測路徑是否存在 使用 -d(存在) 和 !-d(不存在) 後面判斷可以是字符串也可是變量
  • 檢測文件、路徑、或者鏈接文件是否存在 使用 -e(存在) 和 !-e(不存在) 後面判斷可以是字符串也可是變量
  • 檢測文件是否爲可執行文件 使用 -x(可執行) 和 !-x(不可執行) 後面判斷可以是字符串也可是變量
set $variable "0"; 
if ($variable) {
    # 不會執行,因爲 "0" 爲 false
    break;            
}

# 使用變量與正則表達式匹配 沒有問題
if ( $http_host ~ "^star\.igrow\.cn$" ) {
    break;            
}

# 字符串與正則表達式匹配 報錯
if ( "star" ~ "^star\.igrow\.cn$" ) {
    break;            
}
# 檢查文件類的 字符串與變量均可
if ( !-f "/data.log" ) {
    break;            
}

if ( !-f $filename ) {
    break;            
}

if中&&的實現,參考:

        // 匹配click路徑且參數中帶有name=walkingsun 重定向到click-ios路徑
        set $flag 0;
        if ( $uri = /click) {
          set $flag 1;
        }
        if ( $args ~ name=walkingsun ) {
          set $flag 1$flag;
        }
        if ( $flag = 11 ) {
          rewrite ^/(.*) $uri-ios break;
        }

return

Context: server, location, if

return code [text];
return code URL;
return URL;

停止處理並將指定的code碼返回給客戶端。 非標準code碼 444 關閉連接而不發送響應報頭

有一種特殊情況,就是重定向的url可以指定爲此服務器本地的urI,這樣的話,nginx會依據請求的協議$scheme, server_name_in_redirect 和 port_in_redirect自動生成完整的 url (此處要說明的是server_name_in_redirect 和port_in_redirect 指令是表示是否將server塊中的 server_name 和 listen 的端口 作爲redirect用 )

參考

https://segmentfault.com/a/1190000008102599

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