039. Nginx 负载均衡

你离开我真会死。 提交于 2020-08-18 10:43:17

1. 基于反向代理的功能,Nginx 作为负载均衡主要有以下几点理由:


  • 高并发连接。
    • 采用 epoll nio 的形式。
  • 内存消耗少。
    • 使用了大量自带的数据结构(自己设计的)。
    • 数据拷贝采用类零拷贝的形式降低内存的使用。
  • 配置文件非常简单。
  • 成本低廉。
    • 开源免费。
  • 支持 Rewrite 重写规则。
  • 内置的健康检查功能。
  • 节省带宽。
  • 稳定性高。

2. 正向代理和反向代理


正向代理

  • 正向代理类似一个跳板机,代理访问外部资源。

image-20200804071002007

反向代理

  • 实际运行方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外表现为一个服务器。

image-20200804071058263

反向代理的作用

  • 保证内网的安全,可以使用反向代理提供 WAF 功能,阻止 web 攻击。大型网站,通常将反向代理作为公网访问地址,web 服务器是内网。
  • 负载均衡,通过反向代理服务器来优化网站的负载。

image-20200804071451280

3. 负载均衡原理


负载均衡,单从字面的意思来理解就可以解释 N 台服务器平均分担负载,不会因为某台服务器负载高宕机和某台服务器闲置的情况。那么负载均衡的前提就是要 2 台以上服务器才能实现。

1. 4 种配置方案

  • 轮询。

    • 轮询即 Round Robin,根据 Nginx 配置文件中的顺序,依次把客户端的 Web 请求分发到不同的后端服务器上。
  • 最少连接 least_conn。

    • Web 请求会被转发到连接数最少的服务器上。
  • IP 地址哈希 ip_hash。

    • 前述的两种负载均衡方案中,同一客户端连续的Web请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话 Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于IP地址哈希的负载均衡方案。这样的话,同一客户端连续的Web请求都会被分发到同一服务器进行处理。
  • 基于权重 weight。

    • 基于权重的负载均衡即 Weighted Load Balancing,这种方式下,我们可以配置 Nginx 把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。

4. 负载均衡配置


1. 配置基于 Round Robin 轮询的负载均衡

  • 缺省配置就是轮询策略;
  • nginx 负载均衡支持 http 和 https 协议,只需要修改 proxy_pass 后协议即可;
  • nginx 支持 FastCGl,uwsgi,SCcl,memcached 的负载均衡,只需将 proxy_pass 改为 fastcgi-passuwsgi_passscgi_passmemcached_pass 即可。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。
user  www-data;
worker_processes  auto;
pid /run/nginx.pid

events {
    use epoll;
    worker_connections  65535;
}


http {
    
    upstream zp.com {
        server 127.0.0.1:8881;
        server 127.0.0.1:8882;
        server 127.0.0.1:8883;
    }
    
    server {
        listen 80;
        server_name zp.com;
        
        location / {
            proxy_pass http://zp.com
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

}

2. 配置基于 ip_hash 的负载均衡

  • ip 哈希负载均衡使用 ip_hash 指令定义;
  • nginx 使用请求客户端的 ip 地址进行哈希计算,确保使用同一个服务器的请求;
  • 此策略适合有状态的服务,比如 session。
user  www-data;
worker_processes  auto;
pid /run/nginx.pid

events {
    use epoll;
    worker_connections  65535;
}


http {
    
    upstream zp.com {
        ip_hash;
        server 127.0.0.1:8881;
        server 127.0.0.1:8882;
        server 127.0.0.1:8883;
    }
    
    server {
        listen 80;
        server_name zp.com;
        
        location / {
            proxy_pass http://zp.com
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

}

3. 配置基于 least_conn 的负载均衡

  • 最少链接负载均衡 least_conn 指令定义;
  • 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
user  www-data;
worker_processes  auto;
pid /run/nginx.pid

events {
    use epoll;
    worker_connections  65535;
}


http {
    
    upstream zp.com {
        least_conn;
        server 127.0.0.1:8881;
        server 127.0.0.1:8882;
        server 127.0.0.1:8883;
    }
    
    server {
        listen 80;
        server_name zp.com;
        
        location / {
            proxy_pass http://zp.com
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

}

4. 配置基于权重的负载均衡

  • 权重负载均衡需要使用 weight 指令定义;
  • 权重越高分配到需要处理的请求越多;
  • 此策略可以与最少链接负载和 ip 哈希策略结合使用;
  • 此策略比较适合服务器的硬件配置差别比较大的情况。
user  www-data;
worker_processes  auto;
pid /run/nginx.pid

events {
    use epoll;
    worker_connections  65535;
}


http {
    
    upstream zp.com {
        server 127.0.0.1:8881 weight=3;
        server 127.0.0.1:8882 weight=2;
        server 127.0.0.1:8883 weight=1;
    }
    
    server {
        listen 80;
        server_name zp.com;
        
        location / {
            proxy_pass http://zp.com
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!