天天看點

Nginx常用變量,rewrite實戰,Nginx反向代理,Nginx負載均衡

Nginx常用的變量

比較常用的有$http_user_agent(用戶端資訊,浏覽器辨別),$request_uri(請求連接配接),$http_referer(跳轉過來的位址)

Nginx所有變量的詳情

rewrite實戰

rewrite經常用于域名跳轉,僞靜态,防盜鍊

1. 域名重定向

場景一:

兩個域名,一個是以前使用(www.shuai.com),一個是現在使用(www.aoli.com),将通路全部轉到現在使用的域名上去。

在www.shuai.com虛拟主機中

server
	{
		listen 80;
		server_name www.shuai.com;
		rewrite /(.*) http://www.aoli.com/$1 permanent;
		...
	}
           

場景二:

一台主機有多個主機名,将所有通路全都轉向一個主機名。

server
	{
		listen 80;
		server_name www.shuai.com shuai.com;
		if ( $host != "www.shuai.com" )
		{
			rewrite /(.*) http://www.shuai.com/$1 permanent;
		}
	}
           

場景三:

http跳轉https

server{
    listen 80;
    server_name www.shuai.com;
    rewrite /(.*) https://www.shuaicom/$1 permanent;
    .......
    
}
           

場景四:

域名通路二級目錄

server{
    listen 80;
    server_name bbs.shuai.com;
    rewrite /(.*) http://www.shuai.com/bbs/$1 last;
    .......
    
}	 
           

場景五:

分離靜态請求

server{
    listen 80;
    server_name www.shuai.com;
    if ( $uri ~* 'jpg|jpeg|gif|css|png|js$')
    {
        rewrite /(.*) http://img.shuai.com/$1 permanent;
    }

    .......
    
}
           

2.防盜鍊

server{
listen 80;
server_name www.shuai.com;
location ~* ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$
{
    valid_referers none blocked server_names *.shuai.com shuai.com ;
    if ($invalid_referer)
    {
        rewrite /(.*) http://img.shuai.com/images/forbidden.png;
        return 403;
    }
}
.......    
}
           

這裡none表示空referer,blocked 表示沒有http://或https://開頭

3 .僞靜态

location /  {
    rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
    rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
    rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
    rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
    rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
    rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
}
           

還有,多個條件一塊rewrite的時候,Nginx隻能加上一個計數變量

rewrite實戰詳解

Nginx的反向代理

反向代理作用有很多,本區域域名沒有備案好,可以在香港的主機上做一個代理,能通路網站。反向代理多台後端機器,就被稱為負載均衡。

簡單的反向代理模闆:代理www.shuai.com,proxy_pass設定的是IP,proxy_set_header Host 接收主機資訊,proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

用來設定被代理端接收到的遠端用戶端IP,如果不設定,則header資訊中并不會透傳遠端真實用戶端的IP位址。

server 
{
    listen 80;
    server_name www.shuai.com;
    
    location /
    {
        proxy_pass http://123.23.13.11/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
           
  • proxy_pass 可以後接主機名或IP+port ,一般的在後面加上\,這裡設定會有好多種情況,這裡就不一一說了,看後面詳情。
  • proxy_set_header用來設定被代理伺服器接收到的header資訊。
  • proxy_redirect
  • proxy_buffering
  • proxy_cache

    平常主要使用proxy_pass和proxy_set_header,後面的幾個不常用。

    proxy_buffering和proxy_cache詳情

負載均衡

Nginx負載均衡是通過upstream 和proxy_pass 實作的,upstream提供一個real_server集,proxy_pass調用這個集。

  1. 一個簡單的負載均衡
    upstream www {
        server 172.37.150.109:80;
        server 172.37.150.101:80;
        server 172.37.150.110:80;
    }
    
    server {
        listen 80;
        server_name www.shuai.com;
        location / {
            proxy_pass http://www/;
            proxy_set_header Host   $host;
            proxy_set_header X-Real-IP      $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
               

upstream提供一個三台real_server集叫www,proxy_pass調用www,就可以實作。請求輪番發送給三台伺服器。session或cookie資訊是沒有共享的。可能會需要多次登入資訊。

2. 标準的負載均衡

upstream www {
    server 172.37.150.109:80 weight=50;
    server 172.37.150.101:80 weight=100;
    server 172.37.150.110:80 weight=50;
    ip_hash;
}

server {
    listen 80;
    server_name www.aminglinux.com;
    location / {
        proxy_pass http://www/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
           

weight表示權重,server性能好,設定權重高,處理任務多。

ip_hash表示用戶端固定通路某台server(解決了session共享)。

基本上這樣配置就是常用的Nginx負載均衡了。

upstream還有一些其他配置

server 172.37.150.109:80 weight=50 max_fails=3 fail_timeout=30s down backup;
           

down,表示目前的server不參與負載均衡;

backup,為預留的機器,當其他的server(非backup)出現故障或者忙的時候,才會請求backup機器;

max_fails,允許請求失敗的次數,預設為1。當失敗次數達到該值,就認為該機器down掉了。 失敗的名額是由proxy_next_upstream子產品定義,其中404狀态碼不認為是失敗。

fail_timeount,定義失敗的逾時時間,也就是說在該時間段内達到max_fails,才算真正的失敗。預設是10秒。

負載均衡詳細配置

繼續閱讀