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調用這個集。
- 一個簡單的負載均衡
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秒。
負載均衡詳細配置