簡介
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¶m2匹配
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用 )