使用Nginx、Keepalived构建负载均衡

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

对于一个访问量日益增加的网站架构而言,从单机到集群、从集群到分布式,架构演化是必然的。

接手环境,分析瓶颈,扩展架构

笔者现在的环境在刚接手时算是单机LAMP环境。在单机LAMP环境时,由于访问量逐渐变大,网站会经常出现打不开的情况,为了解决这个问题在LAMP前端临时加了一台vanish来缓存一些静态文件,从而减轻了web服务器的负载。再到后来为了满足业务访问需求,将架构改为CDN+Nginx负载均衡(反向代理)+LNMP+代码层缓存+MySQL主从,从而将网站整体负载性能提升15倍,且访问速度也得到很大提升。

负载均衡为什么要选择使用Nginx呢?

普通负载均衡用LVS,文艺负载均衡用Nginx/F5/HAproxy,XX负载均衡用NLB

LVS:四层负载均衡的典型代表,目前已经被添加到linux发行版的内核。LVS用于较为成熟,因此不再做类述,在此推荐一篇不错的LVS文章:《互联网运营智慧》第六章负载均衡及服务器集群(LVS)

Nginx/F5/HAproxy:均为七层负载均衡,F5为商业设备,功能强大,但价格不菲,所以在此不做讨论;HAproxy为重量级的七层负载均衡/反向代理程序,一般应用于大中型站点;而Nginx虽然属于轻量级产品,但是功能毫不逊色与HAproxy,如可以对静态文件可以实现缓存、可以通过URL、目录结构、静动分离对网站实现分流,还可以实现对后端服务器状态码健康检测、对网络依赖较小、对虚拟主机支持友好等等,这也是笔者选择Nginx来做负载均衡的原因。

NLB:windows下的东东,性能、可操作性可想而知。在此也提醒一下各位同仁,针对HTTP类的应用千万不要选择使用windows,如同样的业务放linux上只需两台服务器,而放windows上可能会需要三台甚至更多,运维/硬件采购成本也会增加,同时license也是一笔不小的费用。国内较大的一些web站点后端架构为windows的分别有京东商城、当当网、凡客诚品、麦包包。

使用Nginx构建负载均衡时需要注意的几个问题

Session同步:由于笔者所维护的架构硬件预算受限,所以在整个架构中没有共享存储,针对于session处理,笔者使用ip_hash来解决后端服务器session问题。另外,关于存储session,推荐使用redis或memcached(感谢小卫小灰狼 两位兄弟的建议)。

网站代码存储:还是由于没有共享存储,所以笔者每台web服务器本地均存放一份代码,为了保证多台web服务器的代码数据一致性,使用rsync+inotify实现动态同步(具体实现方法会在后面的文章中介绍)。倘若硬件条件允许的情况下,推荐使用NFS来存储;若考虑到NFS无法满足性能需求,可以将NFS的硬盘换成SSD或者使用分布式文件系统来解决。

负载均衡模式选择:在不受session困扰的情况下,负载均衡模式可以使用weight,因为ip_hash会有导致后端服务器负载不均的情况出现。

开始部署Nginx和Keepalived

为了避免负载均衡出现单点故障,所以使用keepalived对Nginx负载均衡做了HA,也就是说当主负载均衡发生软硬件故障时,负载均衡服务将有备用负载均衡服务器自动接管服务,环境拓扑如下:

Vip:192.168.1.100

Nginx-proxy-master:192.168.1.101

Nginx-proxy-backup:192.168.1.102

安装Nginx与Keepalived

在Nginx-proxy-master和Nginx-proxy-backup上分别安装Nginx、Keepalived,两台主机安装步骤相同

安装Nginx

#yum -y install pcre pcre-devel
#useradd www -s /sbin/nologin
#tar zxvf nginx-0.7.62.tar.gz
#cd nginx-0.7.62
#./configure \
--prefix=/usr/local/nginx \
--user=www \
--group=www \
--with-http_stub_status_module \
--with-http_ssl_module
#make && make install

安装Keepalived

#tar zxvf keepalived-1.1.17.tar.gz
#cd cd keepalived-1.1.17
#./configure --prefix=/usr/local/keepalived
#make && make install
#rm -rf /usr/local/keepalived/etc/keepalived/keepalived.conf
#mkdir /etc/keepalived

配置Nginx

注:Nginx-proxy-master和Nginx-proxy-backup的Nginx配置相同

#more /usr/local/nginx/conf/nginx.conf
user  www www;
worker_processes 4;
error_log  logs/error.log  crit;
pid        logs/nginx.pid;
worker_rlimit_nofile 51200;
 
events {
       use epoll;
       worker_connections 51200;
       }
 
http  {
      include       mime.types;
      default_type  application/octet-stream;
      server_names_hash_bucket_size 256;
      client_header_buffer_size 256k;
      large_client_header_buffers 4 256k;
      keepalive_timeout  120;
      client_max_body_size  50m;
      client_body_buffer_size  256k;
      server_tokens      off;
     
      gzip               on;
      gzip_min_length    1k;
      gzip_buffers  4 1024k;
      gzip_http_version 1.1;
      gzip_comp_level     6;
      gzip_types        text/plain application/x-javascript text/css application/xml;

      #gzip_vary          on;
      proxy_hide_header Vary;
 
      proxy_connect_timeout    600;
      proxy_read_timeout       600;
      proxy_send_timeout       600;
      proxy_buffer_size        16k;
      proxy_buffers            4 64k;
      proxy_busy_buffers_size 128k;
      proxy_temp_file_write_size 128k;
 
      sendfile on;
      tcp_nodelay on;
    # add_header Cache-Control no-cache;
 
upstream blog.luwenju.com  {

                ip_hash;
                server   192.168.1.201:80;
                server   192.168.1.202:80;
                server   192.168.1.203:80;
                }
 
server  {
         listen  80;
         server_name  blog.luwenju.com;
         location / {
         index        index.php;
              proxy_pass         http://blog.luwenju.com;
              proxy_set_header   Host             $host;
              proxy_next_upstream error timeout invalid_header http_500 http_502 http_504;

              proxy_set_header   X-Forwarded-For        $remote_addr;
                     }
         location /NginxStatus {
                  stub_status    on;
                  allow 192.168.1.0/24;
                  }
              log_format  blog.luwenju.com  '$remote_addr - $remote_user [$time_local] $upstream_addr $upstream_status $request'

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

                                '"$http_user_agent" "$http_x_forwarded_for"';

              access_log /usr/local/nginx/logs/blog.luwenju.com_access.log  blog.luwenju.com;
         }
}

说明:upstream为服务器池。以本配置文件为例,upstream中共包含三台web服务器,负载均衡方式为ip_hash。server为主机,用于为upstream内的三台web服务器实现反向代理,从而到达负载均衡的目的。在本配置文件中只设置了一个主机(server),如果要实现虚拟主机,将一个server分别对应一个upstream即可。

另外,还有两个关于日志设置的问题:

负载均衡上是否需要开启access_log:系统/程序刚上线时需要开启,用于Nginx调试,后期运行稳定后建议将日志打印关闭,因为对于访问量较大的网站来说大量日志写入磁盘也会导致磁盘性能下降。

如何设置日志格式:可能使用Nginx部署过负载均衡的朋友都知道,当把Nginx反向代理服务器部署在web前端时,web服务器的access_log就无法获取用户的真实ip地址了,针对这个问题的解决办法会放到后面的文章中<Nginx日志设置及日志分析>

在Nginx-proxy-master服务器上配置Keepalived

#more /etc/keepalived/keepalived.conf
! Configuration File for keepalived

     global_defs {
     router_id nginx-proxy-ha
     }
 
vrrp_script check_nginx {
     script "/etc/keepalived/check_nginx.sh"
     interval 2
     weight 2
     }
 
vrrp_instance VI_1 {
     state MASTER
     interface eth0
     virtual_router_id 51
     priority 200
     advert_int 1
     authentication {
     auth_type PASS
     auth_pass 1234
     }
 
track_interface { 
     eth0  

     } 

 
track_script {
     check_nginx
     }
 
virtual_ipaddress {
     192.168.1.100
     }
}

有关check_nginx.sh的说明:如果Nginx-proxy-master上的nginx进程由于某种原因停止了,但是keepalived进程还正常运行着,这时候Nginx-proxy-backup上的keepalived会认为Nginx-proxy-master是正常的(因为master检测到backup的keepalived进程还存在),所以在这种情况下当Nginx进程死亡的时候Keepalived也不会发生故障转移。那么这个脚本的作用就是让keepalived实时监控Nginx进程,当发现Nginx进程不存在的时候自动将本机的keepalived进程杀死,从而实现故障转移,脚本内容如下(注:Nginx-proxy-master和Nginx-proxy-backup上此脚本内容均一样)

#more /etc/keepalived/check_nginx.sh
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]

 then
  killall -9  keepalived

fi

在Nginx-proxy-backup服务器上配置Keepalived

注:Nginx-proxy-backup上keepalived的配置与Nnginx-proxy-master只有两处不同,state为BACKUP、优先级低于master

#more /etc/keepalived/keepalived.conf
! Configuration File for keepalived

     global_defs {
     router_id nginx-proxy-ha
     }
 
vrrp_script check_nginx {
     script "/etc/keepalived/check_nginx.sh"

     interval 2
     weight 2
     }
 
vrrp_instance VI_1 {
     state BACKUP
     interface eth0
     virtual_router_id 51
     priority 180
     advert_int 1
     authentication {
     auth_type PASS
     auth_pass 1234
     }
 
track_interface { 
     eth0  

     } 

 
track_script {
     check_nginx
     }
 
virtual_ipaddress {
     192.168.1.100
     }
}

启动Nginx和Keepalived

#/usr/local/nginx/sbin/nginx
#/usr/local/keepalived/sbin/keepalived –D

#echo “/usr/local/nginx/sbin/nginx”>>/etc/rc.local
#echo “/usr/local/keepalived/sbin/keepalived –D” >>/etc/rc.local

测试负载均衡是否正常工作

1、打开浏览器,分别访问Nginx-proxy-master、Nginx-proxy-backup、vip,如都能访问到后端web内容,则说明如上所有配置正确

2、杀死Nginx-proxy-master服务器上的Nginx进程,观察keepalived进程是否自动消失、观察vip是否已经转移到了Nginx-proxy-backup服务器上,如杀死Nginx进程后,keepalived进程也随之消失,且vip已经转移到Nginx-proxy-backup服务器,则说明Nginx-proxy-master可正常实现故障转移

3、依次启动 Nginx-proxy-master的Nginx、Keepalived(必须先启动Nginx后启动Keepalived。如果先启动Keepalived,Keepalived检测到Nginx没有启动还是会执行杀死自己进程的脚本),然后将Nginx-proxy-backup的Nginx进程杀死,看vip是否会自动转移到Nginx-proxy-master服务器上,如杀死Nginx进程后,keepalived进程也随之消失,且vip已经转移到Nginx-proxy-master服务器,则说明Nginx-proxy-backup可正常实现故障转移

至此,Nginx负载均衡配置完毕。另外,Nginx非常稳定,笔者的Nginx负载均衡运行在HP DL380服务器上(一颗至强E5620CPU,16G内存,万转SAS硬盘),运行四个月以来,从未出现过任何问题。在负载性能上,2000并发情况下load average:仅为0.02, 0.01, 0.00,CPU使用率仅为3%,内存使用为1G(算上linux系统本身使用,系统为64bit)。














本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1617289 ,如需转载请自行联系原作者





相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
26天前
|
Java 应用服务中间件 Shell
Nginx+Keepalived+Tomcat 实现Web高可用集群
Nginx+Keepalived+Tomcat 实现Web高可用集群
64 0
|
7天前
|
负载均衡 网络协议 Unix
Nginx负载均衡与故障转移实践
Nginx通过ngx_http_upstream_module模块实现负载均衡与故障转移,适用于多服务器环境。利用`upstream`与`server`指令定义后端服务器组,通过`proxy_pass`将请求代理至这些服务器,实现请求分发。Nginx还提供了多种负载均衡策略,如轮询、权重分配、IP哈希等,并支持自定义故障转移逻辑,确保系统稳定性和高可用性。示例配置展示了如何定义负载均衡设备及状态,并应用到具体server配置中。
|
20天前
|
前端开发 应用服务中间件 nginx
[译] 面向 React 和 Nginx 的 Docker 多阶段构建
[译] 面向 React 和 Nginx 的 Docker 多阶段构建
[译] 面向 React 和 Nginx 的 Docker 多阶段构建
|
25天前
|
运维 负载均衡 监控
Nginx加Keepalived实现高可用
使用Nginx和Keepalived来实现高可用性的方案,对于确保关键服务的稳定性和可靠性来说是非常有效的。此配置涉及多个步骤,包括各个服务的安装、设置及测试,目标是在主服务器故障时能无缝切换,以确保服务的持续可用。正确的配置和充分的测试是实现高可用性的保证,这也要求管理员对这些工具和它们背后的原理有深入的了解。
40 1
|
29天前
|
负载均衡 应用服务中间件 Linux
"揭晓nginx的神秘力量:如何实现反向代理与负载均衡,拯救服务器于水火?"
【8月更文挑战第20天】在Linux环境下,nginx作为高性能HTTP服务器与反向代理工具,在网站优化及服务器负载均衡中扮演重要角色。本文通过电商平台案例,解析nginx如何解决服务器压力大、访问慢的问题。首先介绍反向代理原理,即客户端请求经由代理服务器转发至内部服务器,隐藏真实服务器地址;并给出配置示例。接着讲解负载均衡原理,通过将请求分发到多个服务器来分散负载,同样附有配置实例。实践表明,采用nginx后,不仅服务器压力得到缓解,还提升了访问速度与系统稳定性。
44 3
|
29天前
|
负载均衡 算法 应用服务中间件
在Linux中,nginx反向代理和负载均衡实现原理是什么?
在Linux中,nginx反向代理和负载均衡实现原理是什么?
|
1月前
|
负载均衡 应用服务中间件 nginx
Nginx怎么去做负载均衡?
Nginx的负载均衡器配置就完成了,而且由于Nginx的配置文件结构清晰而且简洁,调整和维护也相对方便。通过上述步骤,你可以将Nginx设置为一款强大的负载均衡器,提升服务器集群的处理能力及高可用性。
33 4
|
1月前
|
域名解析 负载均衡 网络协议
双重神器合璧,流量洪流中的稳如磐石:揭秘Bind+Nginx负载均衡的超级力量!
【8月更文挑战第9天】在现代网站架构中,负载均衡至关重要,它通过分散客户端请求至多台服务器,确保了系统的高可用性和稳定性。本文介绍如何结合Bind与Nginx实现高效负载均衡。Bind作为DNS服务器,可为单一域名解析出多个IP地址;Nginx作为高性能HTTP服务器,则在这些IP对应的服务器间智能分配流量。通过配置Bind的A记录与Nginx的`upstream`和`proxy_pass`指令,我们能够构建一个既稳定又易扩展的负载均衡系统,显著提升用户体验与系统可靠性。
46 11
|
1月前
|
负载均衡 监控 算法
Nginx:负载均衡小专题(二)
Nginx:负载均衡小专题(二)
36 2
|
1月前
|
负载均衡 监控 网络协议
Nginx:负载均衡小专题(三)
Nginx:负载均衡小专题(三)
76 1