nginx的if判断语句

使用nginx cache也有很长一段时间了,原来没有想到用nginx cache会有那么多问题存在,还是在实际运用中才发现如下问题的。

首先是要禁止IP访问。我这里直接给它返回403

if ($host ~ "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}") {return 403;}

这个是为了监控需要才加上的。

if ($http_user_agent ~* "monitor") {break;}

这个是当用户直接访问域名下某个文件时候,那就直接退出

if ($request_uri !~* \/$ ){
break;
}

下面这些是由于这个网站是多语言网站,当用户语言是中文的时候就返回www.timoseven.com,但是当用户是手动选择其它语言的时候就不作判断

当用户访问的不是www.timoseven.com的时候就退出,防止出现循环错误。

if ($host !~* www.timoseven.com) {
break;
}

当用户的referer是timoseven.com的时候就退出,这个为了用户手动选择语言的时候不作判断

if ($http_referer ~ timoseven.com){
break;
}

当用户浏览器语言是法语的时候就转到french.timoseven.com等等。这里的$http_accept_language就是可以获取用户的浏览器语言,当然还可以$http_accept_encoding等等,只要是用户请求头部分的都是可以用$http_开头的进行获取并进行匹配。

if ($http_accept_language ~* fr) {
rewrite ^/(.*) http://french.timoseven.com redirect;
break;
}
if ($http_accept_language ~* de) {
rewrite ^/(.*) http://german.timoseven.com redirect;
break;
}
if ($http_accept_language !~* zh) {
rewrite ^/(.*) http://english.timoseven.com redirect;
break;
}

这个是为了有时候需要用到purge进行推送的使用的方法,具体推送的可以参考之前的文章。

if ($request_method = PURGE) {rewrite ^(.*)$ /purge$1$is_args$args;}

###########################################

Best regards
Timo Seven
blog:http://www.timoseven.com/
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

nginx各種新技巧

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

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

                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

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

proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;

這樣一句。這樣後端一台機器出現500,503,404等錯誤的時候也就會

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

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

端負載最輕的機器上。只需要在upstream中這樣修改就行:

        upstream www  {
		fair;
                server 10.2.9.99:9090 weight=1;
                server 10.2.8.227:8080 weight=5;
        }