Nginx可以作为反向代理和负载均衡服务器
正向代理
在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
上述这样的代理模式称为正向代理,这里是我们通过正向代理服务器向外访问。正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
反向代理
多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。
反向代理,主要用于服务器集群分布式部署的情况下,服务器通过反向代理接收访问请求,并且隐藏了自己的信息。
隐藏服务器真实 IP
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。客户端只需要于代理服务器打交道,统一的入口使得后端服务器的IP不会暴露在公网上。
负载均衡
让代理服务器将请求 均匀转发给多台内部Web服务器之一上,从而达到负载均衡的目的。反向代理是手段,负载均衡是目的。
通过缓存加速访问资源
当nginx作为反向代理时,可以将只有动态的请求交由上游服务器处理,但是有些内容可能是一段时间内是不会变化的,这个时候为了减轻上游服务器的压力,那么就让nginx把上游返回的内容缓存一段时间,比如缓存一天,在一天之内即是上游服务器内容发生了变化也不管,nginx之返回缓存到的内容给用户。
提供安全保障
Nginx反向代理的隐藏服务器的IP地址和端口号可以增加服务器的安全性和稳定性。DDos攻击的处理、IP黑名单等交给反向代理负责,反向代理可以从源头限制后端服务器可以接收的连接数量。
负载均衡(Load Balance)是由多台服务器组成一个服务器集群,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种策略,将外部发送来的中央请求分配到集群中的某一台服务器上。
负载均衡器通常称为四层交换机(L4 switch)或七层交换机(L7 switch)。四层交换机主要分析IP层及TCP/UDP层,实现四层流量负载均衡,实现方法有比如:F5,LVS等。七层交换机除了支持四层负载均衡以外,还有分析应用层的信息,如HTTP协议URI或Cookie信息,实现方法有 haproxy,MySQL Proxy等。有些Load Balancer既可以做四层交换,也可以做七层交换,比如F5,Nginx。
负载均衡器是为了分配请求,解决单点问题而生的,因此负载均衡器必须是两个或者以上才有意义。而反向代理一个服务器也可以
负载均衡器(Load Balance,下文简称 LB)像是一个请求调度中心,主要是为了分发请求,这一角色使得它可以:
nginx支持的负载均衡调度算法方式如下:
轮询算法(rr)
根据请求,均匀分配到资源池的各个节点。特点是平均分配,用于配置相同的服务器。
加权轮询(wrr)
接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
IP地址哈希(ip_hash)
每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下会话保持的问题。弊端是可能会导致某一个节点压力过大,而其他节点没有流量。
如果既想使用轮询负载算法,又不想某个节点压力过大,同时解决会话保持的问题,可以使用redis缓存,存储所有节点的session会话信息。
智能调整调度算法(fair)
智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
URL哈希(url_hash)
按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包。URL哈希主要用于缓存服务器集群,缺点是当节点宕机或增加节点时容易出现缓存数据大面积动荡。解决方式是一致性哈希算法(Nginx默认不支持一致性哈希算法,淘宝的tengine支持)。
Nginx官网提供了部署反向代理的操作文档:
official document of proxy : http://nginx.org/en/docs/http/ngx_http_proxy_module.html
反向代理功能由ngx_http_proxy_module
模块实现:
The ngx_http_proxy_module
module allows passing requests to another server.
Example Configuration :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 server {
listen 80; # 监听80端口
server_name 192.168.17.129; # 监听的访问IP或者域名
location ~ /edu/ { # 当用户访问的URL包含/edu/时,由此location处理请求
proxy_pass http://192.168.11.135:80 # proxy_pass 后面跟一个需要转发到的主机节点地址及端口
proxy_set_header Host $host; # 转发时携带主机头字段
proxy_set_header X-Real-IP $remote_addr; # 转发时携带远端IP地址
}
location ~ /vod/ { # 当用户访问的URL包含/vod/时,由此location处理请求
proxy_pass http://192.168.11.136:80 # 转发到192.168.11.136节点进行处理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
1 | proxy_method get; # 支持客户端的请求方法。post/get; |
Nginx官网提供了部署负载均衡的操作文档:
offical document of upstream : Module ngx_http_upstream_module (nginx.org)
负载均衡功能由ngx_http_upstream_module
模块实现:
The ngx_http_upstream_module
module is used to define groups of servers that can be referenced by the proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, and grpc_pass directives.
Example Configuration :
1
2
3
4
5
6
7
8
9
10
11
12
13
14 upstream backend { # upstream固定字段,代表负载均衡,backend是自定义区段名
server backend1.example.com weight=5; # 配置一个服务器节点,默认端口80,权重为5
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup; # backup是热备节点
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend; # 通过反向代理将请求转向backend定义的负载均衡服务器组
}
}
upstream模块的内容应该放置在nignx.conf配置的http区段内,默认调度算法是权重轮询wrr(Weighted Round-Robin)
1 | server # 承担负载均衡的节点,后面可以是IP地址或者域名,可以指定端口,默认是80端口。IP换成域名可以通过DNS做负载均衡 |