實現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及設備狀態

[html] view plain copy
 


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配置中定義的:
[html] view plain copy

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配置文件如何配置:

[html] view plain copy
 


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的負載均衡配置相同,所以童鞋們不用擔心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章