Nginx應用-Location路由反向代理及重寫策略

Nginx應用-Location路由反向代理及重寫策略

一、Nginx的反向代理的路由策略

Nginx是著名的高性能Web服務器,應用在很多Web服務領域,同時開發(fā)和部署過程中,為了更好的控制接口API(或是WebService),我們需要嚴格的或是謹慎的規(guī)劃URL的使用,這樣才能為以后的擴張、迭代打下良好的基礎,否則雜亂無章的URL使用,將是以后大規(guī)模擴展的噩夢。

Location的配置語法規(guī)則:

location [=|~|~*|^~] /uri/ {…}

語法說明:

=   開頭表示精確匹配,不支持正則。
^~  開頭表示uri以某個常規(guī)字符串開頭,不支持正則,理解為匹配url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aaa,可以被規(guī)則^~ /static/ /aaa匹配到(注意是空格)。
~和~* 開頭表示區(qū)分大小寫的和不區(qū)分大小寫的正則匹配。
!~和!~* 開頭表示區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配的正則匹配。
/ 通用匹配,任何請求都會匹配,通常放著配置的最后。

匹配優(yōu)先級:

 (1). 優(yōu)先嘗試 全匹配( 也就是前綴 =)
 (2). 嘗試 路徑匹配 ( 也就是前綴 ^~)
 (3). 嘗試 正則匹配 ( 也就是前綴 ~* 或者 ~)
 (4). 字符串匹配 (也就是前綴為空)
 所以,前綴的優(yōu)先級概括為:
 = > ^~ > ~, ~* > 空
 全匹配 > 路徑匹配 > 正則匹配 > 字符串匹配

示例:

字符串匹配

location /static {
    alias  /home/www/static;
    access_log off;
}

路徑匹配,此時proxy_pass的結(jié)束 / 決定是否帶上匹配的路徑

location ^~ /333/ {
    proxy_pass http://106.185.48.229/;
}

正則匹配,此時proxy_pass不能帶結(jié)束 /

location ~ ^/(xxx|yyy)/ {
    proxy_pass http://106.185.48.229;
}

字符串匹配,此時proxy_pass的結(jié)束 / 決定是否帶上匹配得路徑

location /zzz/ {
    proxy_pass http://106.185.48.229/;
}

默認匹配

location / {
    proxy_pass http://127.0.0.1:8080;
}

二、Nginx的Rewrite規(guī)則

語法規(guī)則:

rewrite 正則 替換 標志位
rewrite指令的最后一項參數(shù)為flag標記,flag標記有:

    1.last   last是終止當前l(fā)ocation的rewrite檢測,但會繼續(xù)重試location匹配并處理區(qū)塊中的rewrite規(guī)則。
    2.break  break是終止當前l(fā)ocation的rewrite檢測,而且不再進行l(wèi)ocation匹配。
    3.redirect  返回302臨時重定向,瀏覽器地址會顯示跳轉(zhuǎn)后的URL地址。
    4.permanent  返回301永久重定向,瀏覽器地址會顯示跳轉(zhuǎn)后的URL地址。

示例:

# 正則匹配
 location ~ ^/(a|bb|ccc)/ {
     rewrite ^/([a-z]+)/(.*)$ http://106.185.48.229/$2?$1;
 }
 # 注:用括號括起來的參數(shù)為后面的 $1 $2 變量

三、Nginx常用設置

1.為了便于日志統(tǒng)計和分析,備注一個日志示例格式,供參考

log_format main '$time_iso8601|$remote_addr|$remote_user|$request_method|$uri|'
            '$status|$request_time|$request_length|$body_bytes_sent|$bytes_sent|'
            '$connection|$http_x_forwarded_for|$upstream_addr|$upstream_status|'
            '$upstream_response_time|$args|$http_referer|$http_user_agent';
  access_log  logs/access.log  main;

2. 反向代理透傳客戶端IP設置

  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

3.常用的Nginx全局變量

  $args #這個變量等于請求行中的參數(shù)。
  $content_length #請求頭中的Content-length字段。
  $content_type #請求頭中的Content-Type字段。
  $document_root #當前請求在root指令中指定的值。
  $host #請求主機頭字段,否則為服務器名稱。
  $http_user_agent #客戶端agent信息
  $http_cookie #客戶端cookie信息
  $limit_rate #這個變量可以限制連接速率。
  $request_body_file #客戶端請求主體信息的臨時文件名。
  $request_method #客戶端請求的動作,通常為GET或POST。
  $remote_addr #客戶端的IP地址。
  $remote_port #客戶端的端口。
  $remote_user #已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名。
  $request_filename #當前請求的文件路徑,由root或alias指令與URI請求生成。
  $query_string #與$args相同。
  $scheme #HTTP方法(如http,https)。
  $server_protocol #請求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1。
  $server_addr #服務器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個值。
  $server_name #服務器名稱。
  $server_port #請求到達服務器的端口號。
  $request_uri #包含請求參數(shù)的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。
  $uri #不帶請求參數(shù)的當前URI,$uri不包含主機名,如”/foo/bar.html”。
  $document_uri #與$uri相同。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》,我們講述了瀏覽器端請求發(fā)起過程,通過DNS域名解析服務器IP,并建...
    七寸知架構閱讀 81,774評論 21 356
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務都無法達到并發(fā)響應量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,221評論 0 9
  • 1.ngnix介紹 ngnix www服務軟件 俄羅斯人開發(fā) 開源 性能很高 本身是一款靜態(tài)WWW軟件 靜態(tài)小文件...
    逗比punk閱讀 2,243評論 1 6
  • 1.簡介: ? Nginx:engine X ,2002年,開源,商業(yè)版? http協(xié)議:web服務器(類似于ht...
    尛尛大尹閱讀 2,011評論 0 3
  • 已經(jīng)很久很久不玩貼吧了...剛才偶然的,就去貼吧里看了看,看看自己的兩個賬號很久之前發(fā)的東西,不看不要緊,一看我的...
    青燈古閱讀 210評論 0 1

友情鏈接更多精彩內(nèi)容