nginx - 反向代理和负载均衡

Parker

1. nginx 反向代理

1.1 介绍

nginx 反向代理:就是将前端发送的动态请求由 nginx 转发到后端服务器

那为什么不直接通过浏览器直接请求后台服务端,需要通过nginx反向代理呢?

1.2 作用

  • 提高访问速度

    因为nginx本身可以进行缓存,如果访问的同一接口,并且做了数据缓存,nginx就直接可把数据返回,不需要真正地访问服务端,从而提高访问速度。

  • 进行负载均衡

    所谓负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器。

  • 保证后端服务安全

    因为一般后台服务地址不会暴露,所以使用浏览器不能直接访问,可以把nginx作为请求访问的入口,请求到达nginx后转发到具体的服务中,从而保证后端服务的安全。

1.3 配置方式

通过[nginx安装目录]/conf/nginx.conf配置文件进行配置,形如:

1
2
3
4
5
6
7
8
server{
listen 80;
server_name localhost;

location /api/{
proxy_pass http://localhost:8080/admin/; #反向代理
}
}

proxy_pass:该指令是用来设置代理服务器的地址,可以是主机名称或IP地址加端口号等形式。

如上代码的含义是:监听80端口号, 当访问http://localhost:80/api/../..这样的接口的时候,它会通过 location /api/ {} 这样的反向代理到http://localhost:8080/admin/上来。

2. nginx 负载均衡

当如果服务以集群的方式进行部署时,那 nginx 在转发请求到服务器时就需要做相应的负载均衡。其实,负载均衡从本质上来说也是基于反向代理来实现的,最终都是转发请求。

2.1 负载均衡策略

名称 说明
轮询 默认方式
weight 权重方式,默认为1,权重越高,被分配的客户端请求就越多
ip_hash 依据ip分配方式,这样每个访客可以固定访问一个后端服务
least_conn 依据最少连接方式,把请求优先分配给连接数少的后端服务
url_hash 依据url分配方式,这样相同的url会被分配到同一个后端服务
fair 依据响应时间方式,响应时间短的服务将会被优先分配

2.2 配置方式

通过[nginx安装目录]/conf/nginx.conf配置文件进行配置,形如:

1
2
3
4
5
6
7
8
9
10
11
12
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
server{
listen 80;
server_name localhost;

location /api/{
proxy_pass http://webservers/admin;#负载均衡
}
}

如上代码的含义是:监听80端口号, 当访问http://localhost:80/api/../..这样的接口的时候,它会通过 location /api/ {} 这样的反向代理到http://webservers/admin,根据 webservers 名称找到一组服务器,根据设置的负载均衡策略(默认是轮询)转发到具体的服务器。

upstream:如果代理服务器是一组服务器的话,我们可以使用 upstream 指令配置后端服务器组。

:upstream后面的名称可自定义,但要上下保持一致。

不同策略的具体配置方式

轮询

1
2
3
4
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}

weight

1
2
3
4
upstream webservers{
server 192.168.100.128:8080 weight=90;
server 192.168.100.129:8080 weight=10;
}

ip_hash

1
2
3
4
5
upstream webservers{
ip_hash;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}

least_conn

1
2
3
4
5
upstream webservers{
least_conn;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}

url_hash

1
2
3
4
5
upstream webservers{
hash &request_uri;
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}

fair

1
2
3
4
5
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
fair;
}
评论