1. 程式人生 > >實現nginx的負載均衡

實現nginx的負載均衡

現在很多企業都採用多臺伺服器來共同支撐企業的網站,這樣不僅可以加快企業網站的訪問速度,還可以避免突發情況造成的災難,但是會由於伺服器本身原因或者某些外界因素會造成各個伺服器的訪問速度不一,這時候我們就需要配置http伺服器的負載均衡來降低資源的浪費,下文就為大家介紹一下主流http伺服器之一的nginx如何配置負載平衡。
一、Nginx負載均衡原理簡介:

  能實現nginx負載均衡的好處有很多,其中有如果您的伺服器中的一臺壞了,他可以自動識別,可以讓您在第一時間瞭解情況,還有可以實現伺服器訪問速度均衡,比如說你有兩個伺服器甲和乙,甲的響應時間為2,乙的響應時間為1,這時候nginx就會自動調整訪問乙的概率是甲的兩倍,真正做到最大程度的降低資源的浪費。


二、nginx負載均衡配置基礎知識簡介:

如果只有一臺伺服器時,這個伺服器掛了,那麼對於網站來說是個不小的損失.因此,這時候的負載均衡就會大顯身手了,它會自動剔除掛掉的伺服器.

nginx 的 upstream目前支援 4 種方式的分配

1、輪詢(預設)

  每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

2、weight

  指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。

3、ip_hash

  每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。 

4、fair(第三方)

  按後端伺服器的響應時間來分配請求,響應時間短的優先分配。 


5、url_hash(第三方)



配置:

在http節點裡新增:

#定義負載均衡裝置的 Ip及裝置狀態
upstream myServer {  

    server 127.0.0.1:9090 down;

    server 127.0.0.1:8080 weight=2;

    server 127.0.0.1:6060;

    server 127.0.0.1:7070 backup;

}
在需要使用負載的Server節點下新增

proxy_pass http://myServer;

upstream 每個裝置的狀態:

down 表示單前的server暫時不參與負載

weight  預設為1.weight越大,負載的權重就越大。


max_fails :允許請求失敗的次數預設為1.當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤

fail_timeout:max_fails 次失敗後,暫停的時間。

backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

Nginx還支援多組的負載均衡,可以配置多個upstream  來服務於不同的Server.

配置負載均衡比較簡單,但是最關鍵的一個問題是怎麼實現多臺伺服器之間session的共享



下面有幾種方法(以下內容來源於網路,第四種方法沒有實踐.)

1、不使用session,換作cookie

  能把session改成cookie,就能避開session的一些弊端,在從前看的一本J2EE的書上,也指明在集群系統中不能用session,否則惹出禍端來就不好辦。如果系統不復雜,就優先考慮能否將session去掉,改動起來非常麻煩的話,再用下面的辦法。

2、應用伺服器自行實現共享

  asp.net可以用資料庫或memcached來儲存session,從而在asp.net本身建立了一個session叢集,用這樣的方式可以令 session保證穩定,即使某個節點有故障,session也不會丟失,適用於較為嚴格但請求量不高的場合。但是它的效率是不會很高的,不適用於對效率 要求高的場合。

以上兩個辦法都跟nginx沒什麼關係,下面來說說用nginx該如何處理:

3、ip_hash

  nginx中的ip_hash技術能夠將某個ip的請求定向到同一臺後端,這樣一來這個ip下的某個客戶端和某個後端就能建立起穩固的session,ip_hash是在upstream配置中定義的:

upstream backend {

  server 127.0.0.1:8080 ;

  server 127.0.0.1:9090 ;

   ip_hash;

}
ip_hash是容易理解的,但是因為僅僅能用ip這個因子來分配後端,因此ip_hash是有缺陷的,不能在一些情況下使用:

    1)nginx不是最前端的伺服器。ip_hash要求nginx一定是最前端的伺服器,否則nginx得不到正確ip,就不能根據ip作hash。譬如使用的是squid為最前端,那麼nginx取ip時只能得到squid的伺服器ip地址,用這個地址來作分流是肯定錯亂的。

    2)nginx的後端還有其它方式的負載均衡。假如nginx後端又有其它負載均衡,將請求又通過另外的方式分流了,那麼某個客戶端的請求肯定不能定位到同一臺session應用伺服器上。這麼算起來,nginx後端只能直接指向應用伺服器,或者再搭一個squid,然後指向應用伺服器。最好的辦法是用location作一次分流,將需要session的部分請求通過ip_hash分流,剩下的走其它後端去。

4、upstream_hash

  為了解決ip_hash的一些問題,可以使用upstream_hash這個第三方模組,這個模組多數情況下是用作url_hash的,但是並不妨礙將它用來做session共享。

三、nginx.conf配置檔案的配置:

  配置負載均衡最重要的是要配置好nginx配置檔案,下文就舉一個例項說明nginx.conf配置檔案如何配置:

user  www www;

worker_processes 10;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid  logs/nginx.pid;

#最大檔案描述符

worker_rlimit_nofile 51200;

events {

  use epoll;

  worker_connections 51200;

}

http {

  include conf/mime.types;

  default_type  application/octet-stream;

  keepalive_timeout 120;

  cp_nodelay on;

upstream  www.hws.com  {

   server   192.168.1.2:80;

   server   192.168.1.3:80;

   server   192.168.1.4:80;

   server   192.168.1.5:80;

}

upstream  blog.hws.com  {

    server   192.168.1.7:8080;

    server   192.168.1.7:8081;

    server   192.168.1.7:8082;

    }

server{

        listen  80;

        server_name  www.hws.com;

location / {

            proxy_pass        http://www.hws.com;

            proxy_set_header   Host    $host;

            proxy_set_header   X-Real-IP    $remote_addr;

            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

              }

log_format  www_s135_com  '$remote_addr - $remote_user [$time_local] $request '

''$status' $body_bytes_sent '$http_referer' '

''$http_user_agent' '$http_x_forwarded_for'';

access_log  /data1/logs/www.log  www_hws_com;

     }

server{

        listen  80;

        server_name  blog.hws.com;

location / {

            proxy_pass   http://blog.hws.com;

            proxy_set_header   Host             $host;

            proxy_set_header   X-Real-IP        $remote_addr;

            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            }

log_format  blog_s135_com  '$remote_addr - $remote_user [$time_local] $request '

''$status' $body_bytes_sent '$http_referer' '

''$http_user_agent' '$http_x_forwarded_for'';

access_log  /data1/logs/blog.log  blog_hws_com;

      }

}
注:由於windows和Linux下的nginx的負載均衡配置相同,所以童鞋們不用擔心。