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


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

2. 正向代理和反向代理


正向代理

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

image.png

反向代理

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

image.png

反向代理的作用

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

image.png

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 {

  1. upstream zp.com {
  2. server 127.0.0.1:8881;
  3. server 127.0.0.1:8882;
  4. server 127.0.0.1:8883;
  5. }
  6. server {
  7. listen 80;
  8. server_name zp.com;
  9. location / {
  10. proxy_pass http://zp.com
  11. proxy_set_header Host $host;
  12. proxy_set_header X-Real-IP $remote_addr;
  13. }
  14. }

}


<a name="8472b965"></a>
#### 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;
    }
}

}


<a name="3c37d829"></a>
#### 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;
    }
}

}


<a name="1ea52e39"></a>
#### 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;
    }
}

} ```