一.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