• Nginx做负载均衡的几种轮询策略


    集群环境为了解决单点无法支撑高并发的情况,集群采用多台服务器提供服务,一般在集群中使用nginx 将来自客户端的请求转发给服务器端

    nginx负载均衡可用提高网站的吞吐量,缓解单台服务器的压力。

    一. Nginx是什么

    Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务

    1. IO多路复用epoll(IO复用)

    如何理解呢?举个例子吧! 有A、B、C三个老师,他们都遇到一个难题,要帮助一个班级的学生解决课堂作业。 老师A采用从第一排开始一个学生一个学生轮流解答的方式去回答问题,老师A浪费了很多时间,并且有的学生作业还没有完成呢,老师就来了,反反复复效率极慢。 老师B是一个忍者,他发现老师A的方法行不通,于是他使用了影分身术,分身出好几个自己同一时间去帮好几个同学回答问题,最后还没回答完,老师B消耗光了能量累倒了。老师C比较精明,他告诉学生,谁完成了作业举手,有举手的同学他才去指导问题,他让学生主动发声,分开了“并发”。 这个老师C就是Nginx。

    2. 轻量级

    • 功能模块少 - Nginx仅保留了HTTP需要的模块,其他都用插件的方式,后天添加

    • 代码模块化 - 更适合二次开发,如阿里巴巴Tengine

    3. CPU亲和

    把CPU核心和Nginx工作进程绑定,把每个worker进程固定在一个CPU上执行,减少切换CPU的cache miss,从而提高性能。

    二.Nginx安装和启动

     

    windos环境下安装,下载地址http://nginx.org/en/download.html

     

    通过cmd定位到Nginx所在目录

    开启:start nginx.exe

    快速停止:nginx.exe -s stop

    重新加载配置: nginx.exe -s reload

    完整停止:nginx.exe -s quit

    三. Nginx提供的5种策略

    • 轮询 (每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除)

    • 权重 (weight权重,权重越大,表示访问几率越大,用于后端服务器性能不均的情况)

    • ip_hash(每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题)

    • fair(第三方)

      按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    • upstream backend {
      server server1.linuxany.com;
      server server2.linuxany.com;
      fair;
      }

      url_hash(第三方)

      upstream backend {
      server squid1:3128;
      server squid2:3128;
      hash $request_uri;
      hash_method crc32;
      }
      
      upstream web {   
           server 192.168.1.116:80 down;
           server 192.168.1.118:80 weight=2;
           server 192.168.1.113:80;
           server 192.168.1.112:80 backup;
      }

      配置详解:

       

    • down 表示当前的Web Server暂时不参与负载 

    • weight 默认为1.weight越大,负载的权重就越大

    • backup: 其它所有的非backup Server down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

      配置文件nginx.conf:

      #定义nginx运行的用户和用户组
      user  www www;
       
      #设置nginx进程数,一般设置为cpu核心数,auto为自动检测
      worker_processes  auto;
       
      #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
      error_log  logs/error.log;
      #error_log  logs/error.log  warn;
      #error_log  logs/error.log  info;
      #error_log  logs/error.log  debug;
      #error_log  logs/error.log  notice;
      #error_log  logs/error.log  crit;
       
      #守护进程pid文件
      pid        logs/nginx.pid;
       
      #events模块中包含nginx中所有处理连接的设置
      events {
          #单个进程最大连接数(最大连接数=连接数*进程数)
          worker_connections  1024;
          #设置nginx收到一个新链接通知后接受尽可能多的链接
          multi_accept on;
          #设置用于复用客户端线程的轮训方法
          use epoll;       
      }
       
       
      #http模块控制着nginx http处理的所有核心特性
      http {
       
          #文件扩展名与文件类型映射表
          include       mime.types;
       
          #默认文件类型
          default_type  application/octet-stream;
       
          #打开或关闭错误页面中的nginx版本号deng
          server_tokens on;
       
          #客户请求头缓冲大小
          large_client_header_buffers 4 64k;
       
          #设定通过nginx上传文件的大小
          client_max_body_size 1024M;
       
          
          client_body_buffer_size 2048k;
       
          #开启高效文件传输模式,优化磁盘IO设置
          sendfile        on;
       
          gzip  on;
       
          #允许或禁止压缩基于请求和相应的响应流,any代表压缩所有请求
          gzip_proxied any;
       
          #==设置数据压缩等级,1-9之间,9最慢压缩比最大
          gzip_comp_level 9;
       
          #设置需要压缩的数据格式
          gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;
          
          #服务器分发池列表(注意server只填IP+端口,要写入http里面,名字可以随便取,分发配置对应上即可)
          upstream web{
              server 192.168.2.6:8085 weight=1; #服务器1  weight权重(权重越大,表示访问几率越大)
              server 192.168.2.6:8086 weight=5;#服务器2
          }
          
          #负载均衡请求分发
          server {
              listen 80;
              #多域名用空格隔开baidu.com baidu2.com baidu3.com
              server_name 192.168.2.6;
       
              #设置默认访问首页
              index index.html index.php;
       
              location / {
                  #所有请求反向代理到服务器池中的服务器 proxy_pass 配置的名称是 upstream 定义的名称 如 web 则这里就是 http://web
                  proxy_pass  http://web;
                  proxy_set_header Host      $host;
                  proxy_set_header X-Real-IP $remote_addr;
              }
         #服务器分发池可以不用写到nginx.conf文件,可以另起一个conf文件,然后用下列代码引入即可
      
            include /etc/nginx/conf.d/*.conf;
          }
      }

      nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

      client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug

      client_body_temp_path 设置记录文件的目录 可以设置最多3层目录

      location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

  • 相关阅读:
    Mybatis中Log4j日志的使用
    Mybatis结果集ResultMap映射
    Mybatis中的基本对象的生命周期和作用域
    IAR瑞萨单片机开发加入printf调试函数
    【转】C语言mem.h中的函数介绍
    【转】c语言位域操作—_结构体内冒号:的使用
    串口数据传输当中的共用体和结构体转换
    【转】printf格式串中的%f的输出格式和内容
    【转】缓冲区设计--环形队列(C++)
    【转】环形队列理论(C语言)
  • 原文地址:https://www.cnblogs.com/yhq123/p/12618845.html
Copyright © 2020-2023  润新知