039.Nginx负载均衡

编程

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


  • 高并发连接。

    • 采用 epoll nio 的形式。

  • 内存消耗少。

    • 使用了大量自带的数据结构(自己设计的)。
    • 数据拷贝采用类零拷贝的形式降低内存的使用。

  • 配置文件非常简单。
  • 成本低廉。

    • 开源免费。

  • 支持 Rewrite 重写规则。
  • 内置的健康检查功能。
  • 节省带宽。
  • 稳定性高。

2. 正向代理和反向代理


正向代理

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

反向代理

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

反向代理的作用

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

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;

}

}

}

以上是 039.Nginx负载均衡 的全部内容, 来源链接: utcz.com/z/519056.html

回到顶部