| 
       
	Nginx负载均衡器的优点: 
	实现看弹性化操作的架构,压力增大的时候可以临时添加后端Web服务器; 
	upstream具有负载均衡能力(默认使用轮询),可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器; 
	Keepalvied加Nginx监测脚本可保证单个nginx负载均衡器的有效性,避免单点故障 
	系统 
	  
	两台Nginx: 
	CentOS6.7 x86_64 
	两台Web: 
	Ubuntu15.04 desktop 
	拓扑 
	  
	IP地址 
	nginx(主LB):192.168.15.132 
	nginx(备LB):192.168.15.133 
	VIP地址:192.168.15.135 
	Real1的IP:192.168.15.128 
	Real2的IP:192.168.15.130 
	部署整个环境用到的软件为: 
	nginx-1.6.3.tar.gz   
	prce-8.38.tar.gz  
	zlib-1.2.8.tar.gz 
	①2台Web主机(Ubuntu)上部署Nginx+PHP-FPM+MySQL,此处省略。 
	②分别在二台Nginx负载均衡器上安装Nginx,配置 
	  
	安装GCC编译器等工具: 
	  
	yum install -y gcc gcc-c++ autoconf automake libtool make openssl openssl-devel 
	安装Nginx: 
	wget http://exim.mirror.fr/pcre/pcre-8.38.tar.gz 
	tar -zxvf pcre-8.38.tar.gz 
	cd pcre-8.38 
	./configure 
	make && make install 
	wget http://zlib.net/zlib-1.2.8.tar.gz 
	tar -zxvf zlib-1.2.8.tar.gz 
	cd zlib-1.2.8 
	./configure 
	make && make install 
	wget http://nginx.org/download/nginx-1.6.3.tar.gz 
	tar -zxvf nginx-1.6.3.tar.gz  
	cd nginx-1.6.3/   
	./configure --prefix=/usr/local/nginx 
	--sbin-path=/usr/local/nginx/sbin/nginx 
	--conf-path=/usr/local/nginx/conf/nginx.conf 
	  
	--pid-path=/usr/local/nginx/logs/nginx.pid \ 
	--with-http_ssl_module \ 
	--with-http_stub_status_module \ 
	--with-http_gzip_static_module \  
	make && make install  
	注:查询"./configure --help"相关模块,按需求指定启用 
	Nginx.conf配置文件,二个nginx负载均衡器的文件一样 
	
		
			? 
		
			
				
					| 
						 
							1 
						
							2 
						
							3 
						
							4 
						
							5 
						
							6 
						
							7 
						
							8 
						
							9 
						
							10 
						
							11 
						
							12 
						
							13 
						
							14 
						
							15 
						
							16 
						
							17 
						
							18 
						
							19 
						
							20 
						
							21 
						
							22 
						
							23 
						
							24 
						
							25 
						
							26 
						
							27 
						
							28 
						
							29 
						
							30 
						
							31 
						
							32 
						
							33 
						
							34 
						
							35 
						
							36 
						
							37 
						
							38 
						
							39 
						
							40 
						
							41 
						
							42 
						
							43 
						
							44 
						
							45 
						
							46 
						
							47 
						
							48 
						
							49 
						
							50 
						
							51 
						
							52 
						
							53 
						
							54 
						
							55 
						
							56 
						
							57 
						
							58 
						
							59 
						
							60 
						
							61 
						
							62 
						
							63 
						
							64 
						
							65 
						
							66 
						
							67 
						
							68 
						
							69 
						
							70 
						
							71 
						
							72 
						
							73 
						
							74 
						
							75 
						
							76 
						
							77 
						
							78 
					 | 
					
						
							
								user  www-data www-data; 
							
								worker_processes  1; 
							
								error_log  /usr/local/nginx/logs/error.log notice; 
							
								pid        /usr/local/nginx/logs/nginx.pid; 
							
								worker_rlimit_nofile 51200; 
							
								events { 
							
								    use epoll; 
							
								    worker_connections  51200; 
							
								} 
							
								http { 
							
								    include       mime.types; 
							
								    default_type  application/octet-stream; 
							
								    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
							
								                      '$status $body_bytes_sent "$http_referer" ' 
							
								                      '"$http_user_agent" "$http_x_forwarded_for"'; 
							
								    access_log  logs/access.log  main; 
							
								    server_names_hash_bucket_size 128; 
							
								    client_header_buffer_size 32k; 
							
								    large_client_header_buffers 4 32k; 
							
								    client_max_body_size 8m; 
							
								    sendfile        on; 
							
								    tcp_nopush     on; 
							
								    server_tokens off; 
							
								    keepalive_timeout  60; 
							
								    fastcgi_connect_timeout 300; 
							
								    fastcgi_send_timeout 300; 
							
								    fastcgi_read_timeout 300; 
							
								    fastcgi_buffer_size 64k; 
							
								    fastcgi_buffers 4 64k; 
							
								    fastcgi_busy_buffers_size 128k; 
							
								    fastcgi_temp_file_write_size 128k; 
							
								    gzip  on; 
							
								    upstream backend 
							
								    { 
							
								    server 192.168.15.128; 
							
								    server 192.168.15.130; 
							
								    } 
							
								    server { 
							
								        listen       80; 
							
								        server_name  192.168.15.135; 
							
								        location / { 
							
								            root   html; 
							
								            index  index.php index.html index.htm; 
							
								            proxy_redirect off; 
							
								            proxy_set_header Host $host; 
							
								            proxy_set_header X-Real-IP $remote_addr; 
							
								             
							
								            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
							
								            proxy_pass http://backend; 
							
								        } 
							
								        error_page   500 502 503 504  /50x.html; 
							
								        location = /50x.html { 
							
								            root   html; 
							
								        } 
							
								         
							
								        location /nginx_status { 
							
								            stub_status on;  
							
								            auth_basic "NginxStatus"; 
							
								            auth_basic_user_file /usr/local/nginx/htpasswd; 
							
								             
							
								             
							
								        } 
							
								        location ~* \.(ini|docx|txt|doc|pdf)$ { 
							
								         
							
								        root /usr/share/nginx/html; 
							
								        deny all; 
							
								        } 
							
								        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ { 
							
								        root /home/image; 
							
								        proxy_store on; 
							
								        proxy_store_access user:rw group:rw all:rw; 
							
								        proxy_temp_path /home/image; 
							
								        if ( !-e $request_filename) { 
							
								           proxy_pass  http://backend; 
							
								        } 
							
								    } 
							
								} 
							
								} 
						 
					 | 
				 
			
		 
	 
 
	③在二台Nginx上安装及配置keepalived: 
	  
	  
	wget http://www.keepalived.org/software/keepalived-1.2.15.tar.gz 
	tar -zxvf keepalived-1.2.15.tar.gz 
	cd keepalived-1.2.15 
	./configure --sysconf=/etc/  --with-kernel-dir=/usr/src/kernels/2.6.32-573.8.1.el6.x86_64 
	make && make install 
	ln -s /usr/local/sbin/keepalived  /sbin/   
	#这一步很重要,不执行ln -s会报错“Starting keepalived: /bin/bash: keepalived: command not found” 
	service keepalived start 
	  
	二台Nginx上keepalived.conf配置文件如下,配置完成后分别service keepalived start启动。检验keepalived配置是否成功 
	主: 
	
		
			? 
		
			
				
					| 
						 
							1 
						
							2 
						
							3 
						
							4 
						
							5 
						
							6 
						
							7 
						
							8 
						
							9 
						
							10 
						
							11 
						
							12 
						
							13 
						
							14 
						
							15 
						
							16 
						
							17 
						
							18 
						
							19 
						
							20 
						
							21 
						
							22 
						
							23 
						
							24 
						
							25 
						
							26 
						
							27 
						
							28 
						
							29 
						
							30 
						
							31 
						
							32 
						
							33 
						
							34 
					 | 
					
						
							
								global_defs { 
							
								   notification_email { 
							
								     test@163.com 
							
								   } 
							
								   notification_email_from keepalived@localhost  
							
								   smtp_server 127.0.0.1 
							
								   smtp_connect_timeout 30 
							
								   router_id LVS_MASTER 
							
								} 
							
								vrrp_script chk_http_port { 
							
								script "/usr/local/src/check_nginx_pid.sh" 
							
								interval 2                            
							
								weight 2 
							
								} 
							
								vrrp_instance VI_1 { 
							
								    
							
								    state BACKUP 
							
								    nopreempt                        
							
								     
							
								    interface bond0 
							
								    virtual_router_id 51 
							
								    priority 100 
							
								    advert_int 1 
							
								    authentication { 
							
								        auth_type PASS 
							
								        auth_pass 1111 
							
								} 
							
								track_script { 
							
								chk_http_port             
							
								} 
							
								    virtual_ipaddress { 
							
								        192.168.15.135/24 broadcast 192.168.15.255 dev bond0 label bond0:1 
							
								    } 
							
								} 
						 
					 | 
				 
			
		 
	 
 
	  
	备:  
	
		
			? 
		
			
				
					| 
						 
							1 
						
							2 
						
							3 
						
							4 
						
							5 
						
							6 
						
							7 
						
							8 
						
							9 
						
							10 
						
							11 
						
							12 
						
							13 
						
							14 
						
							15 
						
							16 
						
							17 
						
							18 
						
							19 
						
							20 
						
							21 
						
							22 
						
							23 
						
							24 
						
							25 
						
							26 
						
							27 
						
							28 
						
							29 
						
							30 
						
							31 
					 | 
					
						
							
								global_defs { 
							
								   notification_email { 
							
								     test@163.com 
							
								   } 
							
								   notification_email_from keepalived@localhost  
							
								   smtp_server 127.0.0.1 
							
								   smtp_connect_timeout 30 
							
								   router_id LVS_BACKUP 
							
								} 
							
								vrrp_script chk_http_port { 
							
								script "/usr/local/src/check_nginx_pid.sh" 
							
								interval 2                            
							
								weight 2 
							
								} 
							
								vrrp_instance VI_1 { 
							
								    state BACKUP 
							
								    interface bond0 
							
								    virtual_router_id 51 
							
								    priority 66 
							
								    advert_int 1 
							
								    authentication { 
							
								        auth_type PASS 
							
								        auth_pass 1111 
							
								} 
							
								track_script { 
							
								chk_http_port             
							
								} 
							
								    virtual_ipaddress { 
							
								        192.168.15.135/24 broadcast 192.168.15.255 dev bond0 label bond0:1 
							
								    } 
							
								} 
						 
					 | 
				 
			
		 
	 
 
	以下是针对nginx状态进行检测的脚本,第一次nginx服务死掉时,会重新启动,如果Nginx服务无法正常启动,则杀掉keepalived进程 
	vim  /usr/local/src/check_nginx_pid.sh 
	
		
			? 
		
			
				
					| 
						 
							1 
						
							2 
						
							3 
						
							4 
						
							5 
						
							6 
						
							7 
						
							8 
					 | 
					
						
							
								#!/bin/bash 
							
								A=`ps -C nginx --no-header |wc -l`         
							
								if [ $A -eq 0 ];then                             
							
								      /usr/local/nginx/sbin/nginx         
							
								      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then   
							
								              killall keepalived                     
							
								      fi 
							
								fi 
						 
					 | 
				 
			
		 
	 
 
	  
	Ok,开始nginx负载均衡测试,停掉其中一台的任何服务,不影响整个系统的运作。 
	注:两台LBServer也可分别添加一个VIP①②(Keepalived心跳监控,服务不可用或者宕机,VIP①被备LBServer接管),外部使用智能DNS轮询两个VIP①②,提高硬件资源利用率。 
 
 
 
      (责任编辑:IT) |