nginx各種新技巧

最近由於升級服務並且涉及到域名的更改,架構也同時進行升級。
首先碰到的一個問題,用戶在輸入老的域名比如www.abc.com,雖然我在DNS上做了CNAME, www IN CNAME www.cba.com.
但是用戶在輸入www.abc.com后在流覽器地址欄中還是原來的www.abc.com,雖然也能正常訪問新網站,但是這樣用戶體驗并不特別好。
所以在用戶輸入www.abc.com按回車后直接在流覽器地址欄中變為www.cba.com。這樣應該是讓用戶更接受新的域名。在這之前我一般都是通過程序文件來執行的,但是這裡都是JSP

文件,對於這個實在不擅長了,所以想直接用nginx來進行實現了。結果還真是成了。
在nginx的location部份添加以下內容就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 if ( $host ~* (.*).(abc).(com)) { set $domain $1; rewrite ^(.*) http://$domain.cba.com$1 permanent; } 
```
解釋一下 (.*)表示任何二級域名,abc.com表示原來的域名。.表示轉移為.這個標點符號。 set $domain $1, 這個$domain表示是二級域名的變量,$1表示abc.com後面接著的地址。rewrite部份就十分好理解了。需要更進一步學習就只能看[http://wiki.nginx.org/NginxHttpRewriteModule](http://wiki.nginx.org/NginxHttpRewriteModule)


由於使用nginx作為代理轉發器,所以對nginx的upstream和proxy也更多了瞭解。在upsteam中我們可以設置多個機器的不同權重以及失效的時間。但是在實際測試中發現,由於後端機器不夠穩定,出現404或者503502這種情況,這個時候Nginx也會轉發到這個機器上,這樣用戶體驗會非常不好。
放狗找了下,還真給找到了解決方法。
在location部份加上
```c
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
```
這樣一句。這樣後端一台機器出現500503404等錯誤的時候也就會

轉發到其他機器上了。這樣用戶體驗就會更好一點。

nginx還有一個需要手動添加的模塊NginxHttpUpstreamFairModule,這個需要自己編譯的時候通過--add-module=來手動添加進來。這個模塊的作用其實可以把用戶的請求發送到後

端負載最輕的機器上。只需要在upstream中這樣修改就行:
```c
upstream www { fair; server 10.2.9.99:9090 weight=1; server 10.2.8.227:8080 weight=5; }