前一段時間在負責實施一個項目,利用nginx的七層負載均衡的良好性能做調度器,后端兩臺PHP應用服務器,實現靜動態分離處理,在整個系統環境全部部署完后,把應用程序放上去測試時,發現一個問題,現把問題和解決辦法寫出來,與大家一起分享和討論。

  一、系統環境:

  1、nginx負載均衡/反向代理服務器(1臺)

  環境:CentOS 5.5 nginx-0.7.65

  IP:192.168.0.10

  2、后端PHP應用服務器(2臺)

  環境:CentOS 5.5 Apache + PHP

  Webserver1 IP:192.168.0.20

  Webserver1 IP:192.168.0.21

  二、安裝配置

  1、安裝nginx負載均衡/反向代理服務器

  安裝過程就不詳說了,可以參考我另一篇文章《nginx+tomcat負載均衡集群安裝配置》,nginx負載均衡/反向代理配置如下:

  …

  upstream phpserver {

  server 192.168.0.20:80 weight=5;

  server 192.168.0.21:80 weight=5;

  }

  …

  server {

  listen 80;

  server_name localhost;

  root /webroot;

  index index.php index.html index.htm;

  location ~ .*\.(php|php5)?$ {

  proxy_pass http://phpserver;

  include proxy.conf;

  }

  location ~ /\..+ {

  deny all;

  }

  access_log /var/log/nginx/access.log;

  }

  2、后端PHP應用服務器的詳細安裝配置遲些再寫出來;

  三、測試發現的問題及解決辦法

  1、當后端兩臺PHP應用服務器都正常時,訪問速度非常快,查看日志,原來一個請求,是后端兩臺服務器同時響應的;

  2、為了模仿故障測試,停掉一臺PHP應用服務器,這時再訪問,請求打開一頁面時,發現有一半響應比較快,另一半響應很慢,最后頁面是可以打開,但速度不理想,很慢,查看error日志,發現nginx還是把請求的一半發往已停掉的那臺服務器,難怪會這么慢;但當很快(10秒內)再打開一個請求頁面時,速度又非常快了,查看日志,發現nginx不會把請求的一半發往已停掉的那臺服務器;過一會再發起一個請求時,又出現有一半響應比較快另一半響應很慢的現象了,查看日志,nginx又把請求的一半發往已停掉的那臺服務器;

  3、到這里,我明白了nginx檢查后端應用服務器的健康時是有一個時間間隔的,應該怎樣處理這個問題呢,當后端有一臺服務器down機時,用戶訪問感覺不出有慢的現象?原來在nginx負載均衡配置里加上下面兩個參數時可以有效的解決這個問題:

  upstream phpserver {

  server 192.168.0.20:80 weight=5 max_fails=2 fail_timeout=600s;

  server 192.168.0.21:80 weight=5 max_fails=2 fail_timeout=600s;

  }

  3.1)max_fails = NUMBER ---- 在一定時間內(這個時間在fail_timeout參數中設置)檢查這個服務器是否可用時產生的最多失敗請求數,默認為1,將其設置為0可以關閉檢查,這些錯誤在proxy_next_upstream或fastcgi_next_upstream(404錯誤不會使max_fails增加)中定義;

  3.2)fail_timeout = TIME ---- 在這個時間內產生了max_fails所設置大小的失敗嘗試連接請求后這個服務器可能不可用,同樣它指定了服務器不可用的時間(在下一次嘗試連接請求發起之前),默認為10秒,fail_timeout與前端響應時間沒有直接關系,不過可以使用proxy_connect_timeout和 proxy_read_timeout來控制。

  我設置當有2個請求失敗,就表示后端的服務器不可用,在以后的600S時間內nginx不會再把請求發往已檢查出標記為不可用的服務器,再次測試時,把后端一臺PHP應用服務務器停掉,只是有一個請求打開頁面時出現上面的現象,以后10分鐘內都不會出現了,請求頁面打開速度正常,fail_timeout的值可以根據你的實際情況而定。