美文网首页
Nginx负载均衡实践

Nginx负载均衡实践

作者: Evtion | 来源:发表于2017-04-08 11:32 被阅读0次

当在业务增长,生产环境里有很大的流量产生和比较高的并发量产生时,一般单机模式的服务已经不再适合业务的需求。所以多机的负载均衡技术来做负载优化就很有必要了。Nginx不光可以实现web Server,还可以作为HTTP反向代理服务器分发客户端请求和流量给后端RS,以此提高服务的性能和降低服务器的压力。Nginx的负载均衡依赖于ngx-http-upstream-module模块,所支持的代理模式有proxy-pass、fastcgi-pass、memcache-pass。Nginx的反向代理效果充当了负载均衡的流量分发效果,类似的负载均衡效果的软件有LVS集群、haproxy。为了高可用集群,LVS+Keepalived和Nginx+Keepalived、haproxy+Keepalived集群保证高可用容灾负载均衡集群。下面介绍Nginx负载均衡。

1. Nginx常用负载均衡算法:
  • 轮询(默认算法):简称RR---每个请求会依次分配给后端RS不同应用程序服务器,后端RS实际的压力会忽略不计。
  • 加权轮询:权重越大的服务器,被Nginx分配的请求次数会越多,适合用于后端RS中性能不一致的情况,这种算法可以充分利用不同后端RS的配置性能。
  • IP HASH:当同IP进行重复访问时会被指定到上次访问的服务器,如果后端超载,请求分发到别的服务器。可以解决session动态网站共享问题。
2. Nginx配置文件常用配置参数:
  • server 192.168.74.1:80 负载均衡后端RealServer的IP或者域名,端口默认为80,;在高并发请求下写域名,再通过DNS进行负载均衡。
  • weight:权重,默认为1,在配置文件里面,权重越大的服务器接收的请求越多。
  • max_fails:失败尝试的失败次数,默认是1,禁止失败尝试是0。
  • fail_timeout:失败超时时间,默认是10秒,通常3秒比较好。
  • backup:热备配置,master负载均衡器出现问题后会自动接收Master的所有资源和VIP(Virtual IP address);backup服务器。
  • down:标志服务器不可用,这个参数通常配合IP_hash使用。
3. Ngxin负载均衡设置:
  • 默认负载均衡设置:
http{#upstream模块包含在http模块下
      upstream  kiwis{#定义upstream名字,下面会引用
           server 192.168.74.133;#后端负责处理真正请求的RS的ip地址
           server 192.168.74.128;
           server 192.168.74.130;
      }
      server {
           listen 80;
           server name  www.kiwis.com;
           location /{
               proxy_pass http://kiwis; #引用upstream
           }
      }
}
  • 当用户访问www.kiwis.com时,Nginx会把请求分发给后端的三个RS。
  • 加权负载均衡设置。
http{#upstream模块包含在http模块下
      upstream  kiwis{#定义upstream名字,下面会引用
           server 192.168.74.133 weight=3;#后端负责处理真正请求的RS的ip地址;权重为3
           server 192.168.74.128;
           server 192.168.74.130;
      }
      server {
           listen 80;
           server name  www.kiwis.com;
           location /{
               proxy_pass http://kiwis; #引用upstream
           }
      }
}
  • 加权负载均衡中,每5个请求分配给192.168.74.133,然后第4、5个请求依次分配给后两个服务器,如此循环操作。
  • IP HASH负载均衡:
http{#upstream模块包含在http模块下
      upstream  kiwis{#定义upstream名字,下面会引用
           ip_hash;#采用IP HASH算法
           server 192.168.74.133;#后端负责处理真正请求的RS的ip地址
           server 192.168.74.128;
           server 192.168.74.130;
      }
      server {
           listen 80;
           server name  www.kiwis.com;
           location /{
               proxy_pass http://kiwis; #引用upstream
           }
      }
}
  • 如果需要将同一个客户端请求绑定到相同得到后端服务器上,可以使用ip_hash负载均衡,除非该服务器不可用。
  • Nginx高可用实现,利用backup标签,可以实现高可用;Master服务器故障;backup服务器可以自动接管服务;期间接管服务的时间是1秒甚至更短,可以保证服务不中断;对于客户端来说是透明的。当Matser服务器修复,backup会自动放弃服务。
http{#upstream模块包含在http模块下
      upstream  kiwis{#定义upstream名字,下面会引用
           server 192.168.74.133;#后端负责处理真正请求的RS的ip地址
           server 192.168.74.128;
           server 192.168.74.130 backup;
      }
      server {
           listen 80;
           server name  www.kiwis.com;
           location /{
               proxy_pass http://kiwis; #引用upstream
           }
      }
}
3. Nginx的http_proxy_module模块常用参数。
  • Nginx的upstream模块相当于是建立一个函数库,把后端的服务器地址放在一个池子里面,而proxy模块则是从这个池子里调用了这些服务器,http_proxy_module模块常用参数:
    • proxy_set_header:让后端服务器能获取到前端用户真实IP,而不只是代理服务器的IP。
    • proxy_set_header Host $host:当后端服务器配置了多个应用时,该选项可以让服务器识别出具体要访问的是哪个应用,而不会将第一个站点作为默认应用传递给用户。
    • proxy_set_header X-Forward-For $remote_addr:如果后端服务器需要获取用户的真实IP,需要该选项。
    • client_body_buffer_size:客户端请求主体缓冲区大小。
    • proxy_connect_timeout:代理服务器和后端服务端握手链接时间。
    • proxy_send_timeout:后端服务器回传数据给Nginx的时间,需要在设置的时间内发送完所有的数据;如果没有发送完数据,Nginx将断开数据链接。
    • proxy_read_timeout:代理服务器和后端服务器连接成功后,等待后端服务器响应的时间。
      +Nginx作反向代理,获取客户端的真实IP地址,转发动态页面给Tomcat进行处理。
location ~\.( jsp | jspx )?${
    proxy_set_header Host $host;
    proxy_set_header x-Real-IP $remote_addr;
    proxy_set_header X-Forward-For $proxy-add_x_forward_for;
    proxy_pass http://tomcat.server
}
4. Nginx的配置文件说明:
  • 在此记录Nginx服务器nginx.conf的配置文件说明:
#定义运行用户和用户组,此用户必须在系统存在;可以是nologin
user nginx nginx;
#启动进程,通常设置为何cpu数量相等
worker_process 8;
#全局错误日志及pid文件
error_log  /var/log/nginx/error.log;#错误日志定义等级  [debug|info|notice|warn|error|crit]
pid        /var/run/nginx.pid;#指定进程id的存储文件位置
worker_rilimit_nofile 65535;#一个nginx进程最多打开的文件描述符数目,理论值是最大打开文件数(系统的值ulimit -n)与nginx进程数相除;nginx请求分配不均,网上有些博客建议与ulimit -n数目相等
#工作模式及连接上限
events{
    use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能;除此之外还有select、poll、kqueue、rtsig和/dev/poll模式 
    worker_connetctions 1024;#单个后台worker process进程的最大并发连接数
    #multi_accept on;
}
#设置http服务器,利用它反向代理功能提供负载均衡实现
http{
    #设定mime类型,类型有mime.type文件定义
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    #设定日志格式
    access_log /var/nginx/access.log;
    #sendfile指令指定nginx是否调用sendfile函数(zero copy)来输出文件,对于普通的应用。
    #必须设置为on,如果用来进行下载等应用磁盘IO负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime。
    sendfile on;
    # tcp_nopush  on;
    # 连接超时时间
    #Keepalive_timeout 0;
    Keepalive_timeout  65;
    tcp_nodelay  on;
    #开启gzip压缩
    gzip on;
    gzip_disable "MSIE[1-6]\.(?!.*SV1)";
    #设定请求缓冲
    client_header_buffer_size  1k;
    large_client_header_buffers 4 4k;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    # 设定负载均衡的服务器列表
    upstream myServer{
        #weight参数表示权值,权值越高被分配到的几率就越大
        #本机上开启80端口
        server 192.168.74.2:80  weight=5;
        server 192.168.74.3:80  weight=1;
        server 192.168.74.4:80  weight=8;
    }
    server{
        #侦听81端口
        listen 81;
        #定义使用www.kiwis.com访问
        server_name www.kiwis.com;
        #设定本虚拟机访问的日志
        access_log logs/www.kiwis.com.access.log main;
        #默认请求
        location / {
            root /root/www; #定义服务器的默认网站根目录位置
            index index.php index.html index.htm;# 定义首页索引文件的名称
            fastcgi_pass  www.kiwis.com;
            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
        }
        #定义错误提示页面
        error_page 500 502 503 504 /50.x.html;
        location =/50x.html{
            root /root/www;
        }
        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/{
            root  /var/www/virtual/htdocs/public;
            #过期20天,静态文件更新频率低,过期可以根据需要设置
            expires 20d;
        }
        #PHP脚本请求全部转发到FASTCGI处理,使用FastCGI默认设置
        location ~ \.php$ {
            root /root/www;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
            include fastcgi_params;
        }
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status  on;
            access_log  on;
            auth_basic  "NginxStatus";
            auth_basic_user_file conf/htpassword;
        }
        #禁止访问 .js文件
        location  ~ /\.js {
            deny all;
        }
    }
}

nginx的基本配置参数大概如上所示,安装Nginx实现负载均衡参见另外一篇文章。

相关文章

网友评论

      本文标题:Nginx负载均衡实践

      本文链接:https://www.haomeiwen.com/subject/nsklattx.html