美文网首页
反向代理与负载均衡

反向代理与负载均衡

作者: hellomyshadow | 来源:发表于2019-03-26 17:48 被阅读0次

    反向代理

    // nginx/conf/nginx.conf
    http {
        // ......
        upstream local {    # 配置上游服务器
            server 127.0.0.1:8080;  --> 转发给本机上的监听8080端口的服务
        }
        server {
            server_name test.abc.cn;
            listen 80;
            location / {
                proxy_redirect   off;   # 禁用所有 proxy_redirect 指令
                # 让上游服务器获得真实的用户IP
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
                proxy_pass http://local; #Nginx代理转发给上游服务器
            }
        }
    }
    
    1. 配置了反向代理之后,浏览器是和Nginx服务器直接建立的连接,Nginx又和上游服务器建立连接,那么上游服务器获取的域名和 IP 其实是Nginx服务器的,而不是浏览器的;
           # 把浏览器的域名和`IP`转交给上游服务器的配置
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      
    2. proxy_cache:缓存配置,让Nginx缓存一些不常变化的数据,利用Nginx的高性能,高效处理请求;
          proxy_cache_path /tmp/nginx levels=1:2 
              keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
          server {
              //...
              location / {
                  //......
                  proxy_cache my_cache;  #缓存的共享内存名
                  proxy_cache_key $host$uri$is_args$args; 
                  proxy_cache_valid 200 304 302 ld;  #指定不返回的响应
                  proxy_pass http://local;  #反向代理
              }
          }
      
      1. proxy_cache_path 设置缓存路径,大小,文件命名方式等信息;共享内存命名为my_cache,大小为10M,路径为/tmp/nginx
      2. proxy_cache_key 设置缓存的key,同一个URL对不同用户的展示内容可能是不同的,用户作为一个变量,以 key-value 的形式缓存共享内存中;
      3. proxy_cache_valid 状态为 200 304 302 的缓存内容,在 1天 后过期;
      4. proxy_ignore_headers Set-Cookie Cache-Control; 尤其要忽略set-cookie
    3. proxy_redirect 在做反向代理功能时,有时会出现重定向的url不是期望的,使用proxy_redirect可以设置url重定向,其作用是对发送给客户端的URL进行修改。
      # 语法:proxy_redirect [ default|off|redirect replacement ];
      # 配置块:http、server、location
      proxy_redirect default;  # 默认
      

    负载均衡

    反向代理引出了服务器集群的负载均衡

            http {
                upstream nodes {
                    // ...
                }
                server {
                    // ...
                }
            }
    
    • upstream指令用于配置上游服务器,可以有多个 upstream 指令,一个 upstream 指令又可以配置多个上游服务器;
    • upstream指令对配置的上游服务器按照默认的轮询方式进行请求。如果上游服务器挂掉,能自己主动剔除,无需手动干预;
    • 但如果上游服务器在配置不均衡的情况下,是解决不了负载均衡的,所以还需要nginx的其他配置。

    负载均衡的常用算法

    1. 轮循
      轮询是负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。
      假设配置文件中共有 M 台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。
      特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。

    2. 加权轮询
      为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的 weight。一般情况下,weight 的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。
      特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。

    3. IP哈希
      ip_hash 依据发出请求的客户端 IPhash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,或具有相同 hash 值的不同 IP 映射到同一服务器。
      特点:该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。

      Session不共享问题是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。

      实际应用中,我们可以利用 ip_hash,将一部分 IP 下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用 ip_hash 进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。

    4、其他算法

    • URL hash
      url_hash 是根据请求的 URLhash 值来分配服务器。
      特点:相同 URL 的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。然而 Nginx默认不支持这种负载均衡算法,需要依赖第三方库。
    • 最小连接数(Least Connections)
      假设共有M台服务器,当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。连接数可以理解为当前处理的请求数。

    upstream配置

    1. 权重配置
      1. weight 和请求数量成正比,主要用于上游服务器配置不均衡的情况下
         upstream nodes {
             server 192.168.10.1:8668 weight=5;
             server 192.168.10.2:8668 weight=10;
         }
      
      1. 192.168.10.2机器的请求量是192.168.10.1机器的 2 倍。
    2. ip_hash配置
      每一个请求按照请求 iphash 结果分配,这样每一个请求固定访问同一个上游服务器,能够解决 ip 会话session在同一台服务器的问题。
          upstream nodes {
              ip_hash;
              server 192.168.10.1:8668 weight=5;
              server 192.168.10.2:8668 weight=10;
          }
      
    3. fair配置
      按上游服务器的响应时间来分配请求,响应时间短的优先分配
          upstream nodes {
              server 192.168.10.1:8668 weight=5;
              server 192.168.10.2:8668 weight=10;
              fair;
          }
      
    4. url_hash配置
      按照访问 urlhash 结果来分配请求,使每一个 url 定向到同一个上游服务器
          upstream nodes {
              server 192.168.10.1:8668 weight=5;
              server 192.168.10.2:8668 weight=10;
              hash $request_uri;
              hash_method crc32;  #使用的hash算法
          }
      

    upstream的常用配置项

    1. down:表示当前的server不參与负载均衡
    2. weight:默认1weight越大,负载的权重就越大,分配到请求的几率越大
    3. max_fails:请求失败的次数,默认1
    4. fail_timeout : max_fails次失败后,暂停请求此台服务器的时间
    5. backup:其他全部的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻
      upstream nodes {
          ip_hash;
          server 192.168.10.1:8668 down;
          server 192.168.10.2:8668 weight=2;
          server 192.168.10.3:8668;
          server 192.168.10.4:8668 backup;
      }
      

    server指令节点

        server {
            listen       80;    #Nginx监听的端口号
            server_name  www.test.com;  # 访问的域名
    
            location / {
                root   /root;   #定义服务器的默认网站根目录位置
                index index.php index.html index.htm;   #定义首页索引文件的名称
    
                #以下是一些反向代理的配置可删除.
                proxy_redirect off;
    
                #让上游Web服务器可以获取用户的真实IP
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
                client_max_body_size 10m;   #允许客户端请求的最大单文件字节数
                client_body_buffer_size 128k;   #缓冲区代理缓冲用户端请求的最大字节数,
                proxy_connect_timeout 90;   #nginx跟后端服务器连接超时时间(代理连接超时)
                proxy_send_timeout 90;  #后端服务器数据回传时间(代理发送超时)
                proxy_read_timeout 90;  #连接成功后,后端服务器响应时间(代理接收超时)
                proxy_buffer_size 4k;   #设置代理服务器(nginx)保存用户头信息的缓冲区大小
                proxy_buffers 4 32k;    #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
                proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
                proxy_temp_file_write_size 64k; #设定缓存大小,大于这个值,将从upstream服务器传
                ......
    
                proxy_pass  http://nodes;  #请求转向
                proxy_connect_timeout  500ms;  #Nginx连接上游服务器的超时时间,默认60s
            }
    
            location /buy {
                proxy_pass   http://172.18.144.23:5789/;  # 转发到指定服务器
            }
            
            error_page   500 502 503 504  /50x.html;
            
            location = /50x.html {
                root   html;
            }
        }
    
    1. 为了便于管理,可以在 nginx/conf 下创建目录如vhost
    2. vhost 目录下新建一些文件,如a.conf,b.conf,c.conf,在其中管理server等指令节点
    3. 在主配置配置文件 nginx/conf/nginx.conf 中,使用 include 引入其他配置文件
    http {
        include vhost/*.conf;   #引入nginx/conf/vhost目录下的、后缀名为.conf的文件
    }
    

    相关文章

      网友评论

          本文标题:反向代理与负载均衡

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