Nginx在作为负载均衡器的同时也是反向代理服务器,其配置语法相当简单,有轮询、ip_hash、url_hash、权重等多种方法对后端的服务器做负载均衡,同时还支持后端服务器的健康检查。另外,它相对于LVS来说比较有优势的一点是,由于它是基于第七层即应用层的负载均衡,是根据包头内的信息来执行负载均衡任务的,因此对网络的依赖性很小,理论上能PING通就能够实现负载均衡。在实际应用上不仅作为一款性能优异的负载均衡器,同时也是一款适用于高并发环境的web应用软件。

优点如下:
配置文件非常简单,风格和程序一样通俗易懂。
成本低廉。Nginx为开源软件,可以免费使用。
支持Rewrite 重写规则:可以根据域名、URL的不同,将HTTP请求分配到不同的后端服务器群组上。
有内置的健康检查功能:即使后端某台Web服务器宕机,也不影响前端访问。
节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header
稳定性高:用于反向代理,宕机的概率微乎其微。
缺点:
目前只支持HTTP和MAIL的负载均衡。

负载均衡算法:
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,则会跳过该服务器分配至下一个健康的服务器。并且它无须记录当前所有连接的状态,所以它是一种无状态调度。
2、weight 权重
在轮询的基础上加上权重,weight和访问率成正比,适用于后端服务器性能不一致的情况下。
3、ip_hash
每个请求按访问IP的哈希结果进行分配,当新的请求到达时,先将客户端IP通过hash算法进行计算得出一个值,随后的请求客户端IP的hash值只要相同,就会被分配到同一台后端服务器上,该调度算法可以解决Session的问题,但会因为分配不均导致无法保证负载均衡。
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5、url_hash(第三方)
按访问URL的hash结果来分配请求,使每个URL定向到同一个后端服务器,后端服务器作为缓存时比较有效。
6、Tengine增加的一致性哈希算法
将每个Server虚拟成N个节点,均匀分布到哈希环上,每次请求时,根据配置的参数计算出一个hash值,在hash环上查找离这个hash值最近的虚拟节点,对应的Server作为该次请求的后端服务器,好处在于动态增加服务器或者服务器宕机时对集群的影响最小。

具体的实现:
1、轮询rr:
upstream test {
    server IP1:PORT;
    server IP2:PORT;
            .............
    }
2、权重weight:
upstream test {
    server IP1:PORT  weight=A; 
    server IP2:PORT  weight=B;
            ..............
    }
3、ip_hash
upstream test {
    ip_hash;
    server IP1:PORT;
    server IP2:PORT;
            .............
   }
4、fair//需要在编译安装时添加模块
upstream test {
    server IP1:PORT;
    server IP2:PORT;
            .............
     fair;
    }
5、url_hash//需要在编译时添加模块
upstream test {
    server IP1:PORT;
    server IP2:PORT;
            .............
    hash $request_url;
   }
Nginx的性能优势:
作为web服务器:Nginx处理静态文件、索引文件以及自动索引效率非常高。
作为代理服务器:Nginx可以实现快速高效的反向代理,提高网站性能。
作为负载均衡服务器:Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器,对外进行服务。同时支持简单的容错和利用算法进行负载均衡。
在性能方面:Nginx是专门为性能优化而开发的,在实现上非常注重效率。它采用内核epoll模型,可以支持更多的并发连接,并在大并发时占用很低的内存资源。
在稳定性方面:Nginx采用了分阶段资源分配技术,使得对CPU与内存的占用率非常低。
在高可用方面:Nginx支持热部署,启动速度迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24不间断运行。

几个优化Nginx的措施:

一、编译安装过程的优化
1、减小Nginx编译后的文件大小
    找到在源码目录下的auto/cc/gcc,删除#debug  CFLAGS="$CFLAGS -g
2、在编译过程指定CPU类型
    --with-cc-opt='03' --with-cpu-opt=cpu
    cat /proc/cpuinfo |grep “module name”//获得CPU的信息
二、利用谷歌开源工具TCMalloc进行优化
1、下载并编译安装libunwind、gperftools
2、配置gperftools
    echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf 
/sbin/ldconfig
3、重新编译安装Nginx并添加
    --with-google_perftools_module
4、添加gperftools线程目录
    mkdir /tmp/tcmalloc 
    chmod  777 /tmp/tcmalloc -R
5、修改Nginx配置文件
    在#pid logs/nginx.pid;这行的下面添加
    google_perftools_profiles /tmp/tcmalloc;
6、重启Nginx
7、测试:
    lsof -n | grep tcmalloc #测试tcmalloc
    lsof -n | grep nginx  #测试nginx
三、内核参数优化/etc/sysctl.conf内
    /sbin/sysctl -p //生效