Nginx负载均衡实践

当在业务增长,生产环境里有很大的流量产生和比较高的并发量产生时,一般单机模式的服务已经不再适合业务的需求。所以多机的负载均衡技术来做负载优化就很有必要了。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实现负载均衡参见另外一篇文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 好久没写文章了,因为最近在安卓上写一个小东西,写完后,我发现我们编程的实在是没什么意思. 不管你在哪个平台编程,都...
    都是一家人阅读 597评论 0 0
  • 《老男孩Linux运维》Nginx Documentation 集群简介 集群就是指一组(若干)相互独立的计算机,...
    Zhang21阅读 3,373评论 0 51
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • nginx做负载均衡器以及proxy缓存配置 关于nginx的安装和基本配置请参考nginx,本文在原基础上完成以...
    meng_philip123阅读 1,582评论 1 16
  • 夜深星月静,秉烛探素馨。 卧枝含春泪,细裹鹅黄紧。 归期明日近,只惜未吐新。 应怜吾将去,曉日投花陰。
    比目的一条鱼阅读 121评论 0 0