nginx反向代理,負載均衡,動靜分離,rewrite地址重寫介紹


一.rewrite地址重寫

 

地址轉發后客戶端瀏覽器地址欄中的地址顯示是不變的,而地址重寫后地址欄中的地址會變成正確的地址。 在一次地址轉發過程中只會產生一次網絡請求,而一次地址重寫產生兩次請求。 地址轉發一般發生在同一站點項目內,而地址重寫則沒有限制。 地址轉發到的頁面可以不用全路徑名表示,而地址重寫到的頁面必須使用完全的路徑名表示。 地址轉發過程中,可以將客戶端請求的request范圍內的屬性傳遞給新的頁面,但地址重寫不可以。 地址轉發的速度比地址重寫的速度快。
rewrite指令:通過正則表達式的匹配來改變URI,可以同時存在一個或多個指令,按照順序依次對URI進行匹配
redirect:將重寫后的URI返回給客戶端,狀態碼為302,指明是臨時重定向URI,主要用在replacement變量不是以http或https開頭的情況下
vi conf/vhost/www.abc.com.conf

#vi編輯虛擬主機配置文件
文件內容
server {
      listen
80;
      server_name abc.com;       rewrite
^/(.*) http://www.abc.com/$1 permanent; } server {       listen 80;       server_name www.abc.com;     location / {       root /data/www/www;       index index.html index.htm;       }
    error_log logs
/error_www.abc.com.log error;     access_log logs/access_www.abc.com.log main; } 或者 server {     listen 80;     server_name abc.com www.abc.com;     if ( $host != 'www.abc.com' ) {         rewrite ^/(.*) http://www.abc.com/$1 permanent;
    }     location / {       root /data/www/www;       index index.html index.htm;         }     error_log logs/error_www.abc.com.log error;     access_log logs/access_www.abc.com.log main;     }
2)重啟服務 確認無誤便可重啟,操作如下: nginx -t #結果顯示ok和success沒問題便可重啟 nginx -s reload
3)查看跳轉效果 打開瀏覽器訪問abc.com 頁面打開后,URL地址欄的abc.com變成了www.abc.com說明URL重寫成功。

rewrite的組要功能是實現RUL地址的重定向。Nginx的rewrite功能需要PCRE軟件的支持,即通過perl兼容正則表達式語句進行規則匹配的。默認參數編譯nginx就會支持rewrite的模塊,但是也必須要PCRE的支持

rewrite是實現URL重寫的關鍵指令,根據regex(正則表達式)部分內容,重定向到replacement,結尾是flag標記。

rewrite語法格式及參數語法說明如下:

rewrite    <regex>    <replacement>    [flag];

    關鍵字    正則      替代內容       flag標記

關鍵字:其中關鍵字error_log不能改變

正則:perl兼容正則表達式語句進行規則匹配

替代內容:將正則匹配的內容替換成replacement

flag標記:rewrite支持的flag標記

flag標記說明:

 

last  #本條規則匹配完成后,繼續向下匹配新的location URI規則

break  #本條規則匹配完成即終止,不再匹配后面的任何規則

redirect  #返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址

permanent  #返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址

rewrite參數的標簽段位置

server,location,if

例子:rewrite ^/(.*) http://www.czlun.com/$1 permanent;

rewrite為固定關鍵字,表示開始進行rewrite匹配規則

regex部分是 ^/(.*) ,這是一個正則表達式,匹配完整的域名和后面的路徑地址

replacement部分是http://www.czlun.com/$1 $1,是取自regex部分()里的內容。匹配成功后跳轉到的URL

flag部分 permanent表示永久301重定向標記,即跳轉到新的 http://www.czlun.com/$1 地址上

rewrite 企業應用場景

Nginx的rewrite功能在企業里應用非常廣泛:

可以調整用戶瀏覽的URL,看起來更規范,合乎開發及產品人員的需求。

 為了讓搜索引擎搜錄網站內容及用戶體驗更好,企業會將動態URL地址偽裝成靜態地址提供服務。

 網址換新域名后,讓舊的訪問跳轉到新的域名上。例如,訪問京東的360buy.com會跳轉到jd.com

根據特殊變量、目錄、客戶端的信息進行URL調整等

 


 


 

二.nginx的動靜分離

靜態資源放在 A 主機的一個目錄上,將動態程序放在 B 主機上,同時在 A 上安裝 Nginx 並且在 B 上安裝Tomcat。配置 Nginx

當請求的是 html、jpg 等靜態資源時,就訪問 A 主機上的靜態資源目錄;當用戶提出動態資源的請求時,則將請求轉發到后端的B

服務器上,交由 Tomcat 處理,再由 Nginx 將結果返回給請求端。

提到這,可能有您會有疑問,動態請求要先訪問 A,A 轉發訪問 B,再由 B 返回結果給 A,A 最后又將結果返回給客戶端,這是不是有點多

余。初看的確多余,但是這樣做至少有 2 點好處。第一,為負載均衡做准備,因為隨着系統的發展壯大,只用一台 B 來處理動態請求顯然是

是不夠的,要有 B1,B2 等等才行。那么基於圖 2 的結構,就可以直接擴展 B1,B2,再修改 Nginx 的配置就可以實現 B1 和 B2 的負載均

衡。第二,對於程序開發而言,這種結構的程序撰寫和單台主機沒有區別。我們假設只用一台 Tomcat 作為服務器,那么凡是靜態資源,如圖

片、CSS 代碼,就需要編寫類似這樣的訪問代碼:<img src=”{address of A}/a.jpg”>,當靜態資源過多,需要擴展出其他的服務器來安放

靜態資源時,訪問這些資源就可能要編寫這樣的代碼:<img src=”{address of C}/a.jpg”>、<img src=”{address of D}/a.jpg”>。可

看到,當服務器進行變更或擴展時,代碼也要隨之做出修改,對於程序開發和維護來說非常困難。而基於上面的結構,程序都只 要 <img

src=”a.jpg”>,無需關心具體放置資源的服務器地址,因為具體的地址 Nginx 為幫您綁定和選擇。

# 轉發的服務器,upstream 為負載均衡做准備
 upstream tomcat_server{
        server 192.168.8.23:8099;
 }
    server {
        listen       80;
        server_name  localhost;
       # 靜態資源存放目錄
        root  /im;

        location / {
            root   html;
            index  ak47.html index.html index.htm;
        }
       # 動態請求的轉發
        location ~ .*.jsp$ {
            proxy_pass http://tomcat_server;
            proxy_set_header Host $host;
        }
 # 靜態請求直接讀取
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
          expires      30d;
 } 

其目的和我們預期的一樣,動態的請求(以 .jsp 結尾)發到 B(192.168.8.23:8099,即 tomcat_server)上,而靜態的請求(gif|jpg 等)則直接訪問定義的im目錄

三.反向代理加負載均衡

反向代理(Reverse Proxy)實際運行方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器

反向代理的作用:

 1.1 保證內網的安全,隱藏原始服務器

1.2 負載均衡。反向代理多個服務器

nginx 的 upstream默認是以輪詢的方式實現負載均衡,這種方式中,每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。 另外一種方式是ip_hash:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。

upstream myvic{
             #ip_hash;
             server 192.168.1.251 weight=1 fail_timeout=20s;
             server 192.168.1.252 weight=2 fail_timeout=20s;;
             server 192.168.1.247 weight=3 fail_timeout=20s;;#可以給服務器加權重
        }
server {

        listen       80;
        server_name  www.myvick.cn;
        location / {
             #反向代理的地址
             proxy_pass http://myvic;     
        }
}

第二種配置:ip_hash輪詢方法,不可給服務器加權重

 

upstream myvic {
       server 192.168.196.130 fail_timeout=20s;
       server 192.168.196.132 fail_timeout=20s;
     ip_hash;
 }
 server {
         listen 80;
         server_name www.myvick.cn;
      index index.html index.htm index.php;
      location / {
              proxy_pass http://myvic;
          proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; #當其中一台返回錯誤碼404,500...等錯誤時,
                    #可以分配到下一台服務器程序繼續處理,提高平台訪問成功率,多可運用於前台程序負載,設置proxy_next_upstream
        

         proxy_next_upstream off;#關閉請求下一個服務器

         include proxy.conf; 
      } 
基於ip hash實現session

 

Nginx基礎入門之proxy反向代理常用配置項說明:

http://blog.51cto.com/blief/1739178

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM