天天看點

nginx配置url重定向-反向代理

本文系統:Centos6.5_x64

三台主機:nginx主機,hostname: master.lansgg.com  IP: 192.168.10.128   

          apache主機,hostname: client1.lansgg.com IP:  192.168.10.129

一、nginx 位址重定向

二、nginx 反向代理

1、位址重定向:是指當使用者浏覽某個網址時,将他導向到另一個網址的技術。常用在把一串很長的網址,轉成較短的網址。因為當要傳播某網站時,常常因為網址太長,不好記憶;又有可能因為換了網路的免費網頁空間,網址又必須要變更,不知情的使用者還以為網站關閉了。這時就可以用網路上的轉址了。這個技術使一個網頁是可借由不同的統一資源定位符(URL)連結。

1.1、這 個子產品允許使用正規表達式重寫URI(需PCRE庫),并且可以根據相關變量重定向和選擇不同的配置。如果這個指令在server字段中指定,那麼将在被 請求的location确定之前執行,如果在指令執行後所選擇的location中有其他的重寫規則,那麼它們也被執行。如果在location中執行這 個指令産生了新的URI,那麼location又一次确定了新的URI。這樣的循環可以最多執行10次,超過以後nginx将傳回500錯誤

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<code>正規表達式比對,其中:</code>

<code>* ~ 為區分大小寫比對</code>

<code>* ~* 為不區分大小寫比對</code>

<code>* !~和!~*分别為區分大小寫不比對及不區分大小寫不比對</code>

<code>檔案及目錄比對,其中:</code>

<code>* -f和!-f用來判斷是否存在檔案</code>

<code>* -d和!-d用來判斷是否存在目錄</code>

<code>* -e和!-e用來判斷是否存在檔案或目錄</code>

<code>* -x和!-x用來判斷檔案是否可執行</code>

<code>flag标記有:</code>

<code>* last 相當于Apache裡的[L]标記,表示完成rewrite</code>

<code>* </code><code>break</code> <code>終止比對, 不再比對後面的規則</code>

<code>* redirect 傳回302臨時重定向 位址欄會顯示跳轉後的位址</code>

<code>* permanent 傳回301永久重定向 位址欄會顯示跳轉後的位址</code>

<code>一些可用的全局變量有,可以用做條件判斷</code>

<code>$args, 請求中的參數;</code>

<code>$content_length, HTTP請求資訊裡的</code><code>"Content-Length"</code><code>;</code>

<code>$content_type, 請求資訊裡的</code><code>"Content-Type"</code><code>;</code>

<code>$document_root, 針對目前請求的根路徑設定值;</code>

<code>$document_uri, 與$uri相同;</code>

<code>$host, 請求資訊中的</code><code>"Host"</code><code>,如果請求中沒有Host行,則等于設定的伺服器名;</code>

<code>$limit_rate, 對連接配接速率的限制;</code>

<code>$request_method, 請求的方法,比如</code><code>"GET"</code><code>、</code><code>"POST"</code><code>等;</code>

<code>$remote_addr, 用戶端位址;</code>

<code>$remote_port, 用戶端端口号;</code>

<code>$remote_user, 用戶端使用者名,認證用;</code>

<code>$request_filename, 目前請求的檔案路徑名</code>

<code>$request_body_file</code>

<code>$request_uri, 請求的URI,帶查詢字元串;</code>

<code>$query_string, 與$args相同;</code>

<code>$scheme, 所用的協定,比如http或者是https,比如rewrite  ^(.+)$  $scheme:</code><code>//example</code><code>.com$1  redirect;</code>

<code>$server_protocol, 請求的協定版本,</code><code>"HTTP/1.0"</code><code>或</code><code>"HTTP/1.1"</code><code>;</code>

<code>$server_addr, 伺服器位址,如果沒有用listen指明伺服器位址,使用這個變量将發起一次系統調用以取得位址(造成資源浪費);</code>

<code>$server_name, 請求到達的伺服器名;</code>

<code>$server_port, 請求到達的伺服器端口号;</code>

<code>$uri, 請求的URI,可能和最初的值有不同,比如經過重定向之類的。</code>

rewrite 指令:可以使用在 server, location, if 區域;

文法:rewrite regex replacement flag

按照相關的正規表達式與字元串修改URI,指令按照在配置檔案中出現的順序執行。  

可以在重寫指令後面添加标記。  

如果替換的字元串以http://開頭,請求将被重定向,并且不再執行多餘的rewrite指令。  

尾部的标記(flag)可以是以下的值:

last - 完成重寫指令,之後搜尋相應的URI或location。

break - 完成重寫指令。

redirect - 傳回302臨時重定向,如果替換字段用http://開頭則被使用。

permanent - 傳回301永久重定向。

<code>rewrite  ^(</code><code>/download/</code><code>.*)</code><code>/media/</code><code>(.*)\..*$  $1</code><code>/mp3/</code><code>$2.mp3  last;</code>

<code>rewrite  ^(</code><code>/download/</code><code>.*)</code><code>/audio/</code><code>(.*)\..*$  $1</code><code>/mp3/</code><code>$2.ra   last;</code>

<code>return</code>   <code>403;</code>

但是如果我們将其放入一個名為/download/的location中,則需要将last标記改為break,否則nginx将執行10次循環并傳回500錯誤。

<code>location </code><code>/download/</code> <code>{</code>

<code>  </code><code>rewrite  ^(</code><code>/download/</code><code>.*)</code><code>/media/</code><code>(.*)\..*$  $1</code><code>/mp3/</code><code>$2.mp3  </code><code>break</code><code>;</code>

<code>  </code><code>rewrite  ^(</code><code>/download/</code><code>.*)</code><code>/audio/</code><code>(.*)\..*$  $1</code><code>/mp3/</code><code>$2.ra   </code><code>break</code><code>;</code>

<code>  </code><code>return</code>   <code>403;</code>

<code>}</code>

如果替換字段中包含參數,那麼其餘的請求參數将附加到後面,為了防止附加,可以在最後一個字元後面跟一個問号:

<code>rewrite  ^</code><code>/users/</code><code>(.*)$  </code><code>/show</code><code>?user=$1?  last;</code>

注意:大括号({和}),可以同時用在正規表達式和配置塊中,為了防止沖突,正規表達式使用大括号需要用雙引号(或者單引号)。例如要重寫以下的URL:

<code>/photos/123456</code>

為:

<code>/path/to/photos/12/1234/123456</code><code>.png</code>

則使用以下正規表達式(注意引号):

<code>rewrite  </code><code>"/photos/([0-9] {2})([0-9] {2})([0-9] {2})"</code> <code>/path/to/photos/</code><code>$1/$1$2/$1$2$3.png;</code>

<code>server {</code>

<code>   </code><code>server_name www.example.com;</code>

<code>   </code><code>rewrite ^ http:</code><code>//example</code><code>.com$request_uri? permanent;</code>

同樣,重寫隻對路徑進行操作,而不是參數,如果要重寫一個帶參數的URL,可以使用以下代替:

<code>if</code> <code>($args ^~ post=100){</code>

<code>  </code><code>rewrite ^ http:</code><code>//example</code><code>.com</code><code>/new-address</code><code>.html? permanent;</code>

<code>    </code><code>server {</code>

<code>        </code><code>listen  80 default_server;</code>

<code>        </code><code>server_name     www.lansgg.com lansgg.com;</code>

<code>        </code><code>access_log      logs</code><code>/lansgg</code><code>.access.log main;</code>

<code>        </code><code>error_log       logs</code><code>/lansgg</code><code>.error.log;</code>

<code>        </code><code>root            </code><code>/opt/nginx/nginx/html/lansgg</code><code>;</code>

<code>        </code><code>index index.html;</code>

<code>        </code><code>rewrite ^/ http:</code><code>//www</code><code>.Aries.com/;</code>

<code>        </code><code>}</code>

break 指令 可使用server, location, if 區域; 中止Rewirte,不在繼續比對

last 指令 可server, location, if  區域;

last與break的差別在于,last并不會停止對下面location的比對。

測驗一下break與last的差別

<code>    </code><code>listen    80 default_server;</code>

<code>    </code><code>server_name    www.lansgg.com lansgg.com;</code>

<code>    </code><code>access_log    logs</code><code>/lansgg</code><code>.access.log main;</code>

<code>    </code><code>error_log    logs</code><code>/lansgg</code><code>.error.log;</code>

<code>    </code><code>root        </code><code>/opt/nginx/nginx/html/lansgg</code><code>;</code>

<code>    </code><code>index index.html;</code>

<code>    </code><code>location </code><code>/c1</code><code>.html {</code>

<code>    </code><code>rewrite </code><code>/c1</code><code>.html </code><code>/c2</code><code>.html </code><code>break</code><code>;</code>

<code>    </code><code>}</code>

<code>    </code><code>location </code><code>/c2</code><code>.html {</code>

<code>    </code><code>return</code> <code>508;</code>

<code>[root@master sbin]</code><code># echo "c1" &gt; /opt/nginx/nginx/html/lansgg/c1.html</code>

<code>[root@master sbin]</code><code># echo "c2" &gt; /opt/nginx/nginx/html/lansgg/c2.html</code>

使用last的話,會繼續搜尋下面是否有符合條件(符合重寫後的/c2.html請求)的location。此時,/c2.html剛好與面location的條件對應上了,進入花括号{}裡面的代碼執行,這裡會傳回508。

<code>    </code><code>rewrite </code><code>/c1</code><code>.html </code><code>/c2</code><code>.html last;</code>

使用firebug 可以看到;

<a href="http://s3.51cto.com/wyfs02/M01/4D/F9/wKiom1ReJ_bR_WwhAACvgot1dVM022.jpg" target="_blank"></a>

if 指令 可使用server, location 區域;

示例:當通路http://www.lansgg.com網址的時候跳轉到www.Aries.com;

<code>        </code><code>if</code> <code>($http_host = www.lansgg.com){</code>

<code>        </code><code>rewrite (.*) http:</code><code>//www</code><code>.Aries.com;</code>

<a href="http://s3.51cto.com/wyfs02/M02/4D/F8/wKioL1ReMavwbbrPAAEAO-or-Mg289.jpg" target="_blank"></a>

return 指令 可使用server, location, if  區域

文法:return code  

這個指令結束執行配置語句并為用戶端傳回狀态代碼,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416與500-504。此外,非标準代碼444将關閉連接配接并且不發送任何的頭部。

rewrite_log  指令  可使用server, location, if  區域

啟用時将在error log中記錄notice 标記的重寫日志。

set 指令 可使用server, location, if  區域

文法:set variable value  

指令設定一個變量并為其指派,其值可以是文本,變量和它們的組合。  

你可以使用set定義一個新的變量,但是不能使用set設定$http_xxx頭部變量的值。

文法:uninitialized_variable_warn on|off  

預設值:uninitialized_variable_warn on  

開啟或關閉在未初始化變量中記錄警告日志。  

事實上,rewrite指令在配置檔案加載時已經編譯到内部代碼中,在解釋器産生請求時使用。  

expires 指令 可 http, server, location 區域

文法: expires [time|epoch|max|off]

預設值: expires off

該指令可以控制HTTP應答中的“Expires”和“Cache-Control”的頭标,(起到控制頁面緩存的作用)。可以在time值中使用正數或負數。“Expires”頭标的值将通過目前系統時間加上設定的 time 值來獲得。

epoch 指定“Expires”的值為 1 January, 1970, 00:00:01 GMT。

max 指定“Expires”的值為 31 December 2037 23:59:59 GMT,“Cache-Control”的值為10年。

-1 指定“Expires”的值為 伺服器目前時間 -1s,即永遠過期

“Cache-Control”頭标的值由指定的時間來決定:

    負數:Cache-Control: no-cache

    正數或零:Cache-Control: max-age = #, # 為指定時間的秒數s。其他的機關有d(天),h(小時)

"off" 表示不修改“Expires”和“Cache-Control”的值

控制圖檔等過期時間為30天,這個時間可以設定的更長。具體視情況而定

<code>location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {</code>

<code>           </code><code>log_not_found off;  </code><code>#不記錄404 not  found 錯誤日志           expires 30d;</code>

<code>           </code><code>break</code><code>;       }</code>

控制比對/resource/或者/mediatorModule/裡所有的檔案緩存設定到最長時間

<code>        </code><code>location ~ /(resource|mediatorModule)/ {</code>

<code>                </code><code>root    </code><code>/opt/demo</code><code>;</code>

<code>                </code><code>expires max;</code>

設定某個檔案的過期時間;這裡為600秒,并不記錄通路日志

<code>location ^~ </code><code>/html/scripts/loadhead_1</code><code>.js {</code>

<code>access_log   off;</code>

<code>root </code><code>/opt/lampp/htdocs/web</code><code>;</code>

<code>expires 600;</code>

<code>break</code><code>;</code>

設定GZIP

一般情況下壓縮後的html、css、js、php、jhtml等檔案,大小能降至原來的25%,也就是說,原本一個100k的html,壓縮後隻剩下25k。這無疑能節省很多帶寬,也能降低伺服器的負載。

在nginx中配置gzip比較簡單

一般情況下隻要在nginx.conf的http段中加入下面幾行配置即可

<code>   </code><code>gzip</code>  <code>on;</code>

<code>   </code><code>gzip_min_length  1000;</code>

<code>   </code><code>gzip_buffers     48k;</code>

<code>   </code><code>gzip_types       text</code><code>/plain</code> <code>application</code><code>/x-javascript</code> <code>text</code><code>/css</code> <code>text</code><code>/html</code> <code>application</code><code>/xml</code><code>;</code>

可以通過網頁gzip檢測工具來檢測網頁是否啟用了gzip

編輯nginx.conf

<code>        </code><code>rewrite ^</code><code>/c/</code><code>(.*)$ http:</code><code>//www</code><code>.lansgg.com</code><code>/cc/</code><code>$1;</code>

<code>        </code> 

<code>[root@master lansgg]</code><code># tree</code>

<code>.</code>

<code>├── c</code>

<code>│   └── index.html</code>

<code>├── cc</code>

<code>├── index.html</code>

<code>└── it.jpg</code>

<code>2 directories, 4 files</code>

<a href="http://s3.51cto.com/wyfs02/M02/4D/F9/wKioL1RePF6hWtH5AAFKE7zHvzw477.jpg" target="_blank"></a>

302即為臨時重定向;

永久重定向(隐含重定向)

<code>        </code><code>rewrite ^</code><code>/c/</code><code>(.*)$ </code><code>/cc/</code><code>$1;</code>

2、反向代理:是指以代理伺服器來接受internet上的連接配接請求,然後将請求轉發給内部網絡上的伺服器,并将從伺服器上得到的結果傳回給internet上請求連接配接的用戶端,此時代理伺服器對外就表現為一個伺服器。

2.1、配置nginx實作反向代理;

需求:通路http://192.168.10.128/other 傳回 apache主機的other目錄下的Index.html

<a href="http://s3.51cto.com/wyfs02/M02/4D/F6/wKioL1Rd21mwBFavAAIkMKYLkDs383.jpg" target="_blank"></a>

涉及nginx指令:

2.2、配置nginx配置檔案nginx.conf

<code>    </code><code>location / {</code>

<code>    </code><code>location </code><code>/other</code> <code>{</code>

<code>    </code><code>proxy_pass          http:</code><code>//192</code><code>.168.10.129</code><code>/other</code><code>;</code>

<code>    </code><code>proxy_set_header    X-Real-IP $remote_addr; </code>

2.3、配置client1

<code>mkdir</code> <code>/var/www/html/other</code>

<code>echo</code> <code>"192.168.10.129"</code> <code>&gt; </code><code>/var/www/html/other/index</code><code>.html</code>

2.4、測試;

<a href="http://s3.51cto.com/wyfs02/M01/4D/F7/wKiom1Rd6hKzwCh2AAB13d4xNOk488.jpg" target="_blank"></a>

檢視日志:

<code>[root@client1 ~]</code><code># tail -f /var/log/httpd/access_log </code>

<code>192.168.10.1 - - [06</code><code>/Nov/2014</code><code>:21:25:44 +0800] </code><code>"GET /other/ HTTP/1.1"</code> <code>200 15 </code><code>"-"</code> <code>"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0"</code>

本文轉自 西索oO 51CTO部落格,原文連結:http://blog.51cto.com/lansgg/1575274

繼續閱讀