配置Nginx实现负载均衡方法

一、Nginx的介绍

1.跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术。可以将nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用nginx改善Web应用程序的性能,可伸缩性和可靠性

二、Nginx优点

1. 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。在高连接并发的情况下,Nginx是Apache服务器不错的替代品,能够支持高达 50000 个并发连接数的响应。
2. Nginx 配置简洁, Apache 复杂 ,Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 . Nginx 静态处理性能比 Apache 高 3倍以上 ,Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端来使用 ,Apache 的组件比 Nginx 多.
3. 最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;Nginx是异步的,多个连接(万级别)可以对应一个进程 .
4. Nginx的优势是处理静态请求,cpu内存使用率低,apache适合处理动态请求,所以现在一般前端用Nginx作为反向代理抗住压力,apache作为后端处理动态请求。

三、Nginx 工作原理

Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、 cache loader和cache manager均应以非特权用户身份运行 如下图:

配置Nginx实现负载均衡方法

四、负载均衡的策略

Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html    三种负载策略如下:
1 轮循(默认) 
Nginx根据请求次数,将每个请求均匀分配到每台服务器
2 最少连接 
将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
3 IP Hash 
绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。

五、配置Nginx在项目中的使用

1.以下是我在实际项目中的完整配置    用的是轮询策略     nginx.conf完整代码如下:


user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

   # include /etc/nginx/conf.d/*.conf;
        client_max_body_size     50m; 
        client_header_timeout    1m;
       client_body_timeout      1m;
       proxy_connect_timeout     60s;
       proxy_read_timeout      1m;
        proxy_send_timeout      1m;
     
      upstream westos{ 
          server 192.168.10.230;    #这里没有写端口号   所以默认配置端口号是80  
          server 192.168.10.231; 
          server 192.168.10.232;
          }

    server {
        listen       443 ssl;  端口号
        server_name  www.baidu.com; // 域名地址  

        ssl_certificate     /etc/nginx/serverpem.pem;    #域名pem秘钥文件
        ssl_certificate_key  /etc/nginx/serverkey.key;   #域名key秘钥文件

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
         proxy_pass http://westos;
        }
    }
    
}

2.以上proxy_pass http://westos:表示将所有请求转发到westos服务器组中配置的某一台服务器上。upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。westos是服务器组的名称。upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给230,231,232来处理,可以通过weight(默认为1,将请求平均分配给每台server修改下面这些参数来改变默认的分配策略:

 upstream westos{ 
          server 192.168.10.230  weight=1;   # 1/6次
          server 192.168.10.231  weight=2;  # 2/6次
          server 192.168.10.232  weight=3;  # 3/6次
          }

 

上例配置,表示6次请求中,230分配1次,231分配2次   ,232分配3次   然后可以继续如下两个参数:

max_fails :默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。

fail_timeout :默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它

 upstream westos{ 
          server 192.168.10.230  weight=1 max_fails=3 fail_timeout=15;  
          server 192.168.10.231  weight=2;  
          server 192.168.10.232  weight=3;  
          }

server 192.168.10.230这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它

backup :备份机,所有服务器挂了之后才会生效

 upstream westos{ 
          server 192.168.10.230  weight=1 max_fails=3 fail_timeout=15;  
          server 192.168.10.231  weight=2;  
          server 192.168.10.232  weight=3 backup;  
          }

以上在230和231都挂了之前,232为不可用状态,不会将请求分配给它。只有当230和231都挂了,232才会被启用,其他的参数就不一一讲了   具体要是在实际中用到了    可以参考官网的API文档      注意  这几台服务的jar和前端代码包路径都得一模一样,最后启动nginx  从控制台可以看负载均衡的效果