文章目录
正向代理与反向代理
我们大多应该使用过代理服务器,如shadowsocks翻墙软件,就需要配置一个代理服务器地址,我们不能访问到的网址,通过将请求发到代理服务器,再由代理服务器去代为访问目标网址,返回最终内容。
上面例子中的代理服务器,就是一个正向代理的过程,它不是我们最终要访问的内容服务器,只是起到一个跳板的作用。
正向代理的作用:
- 访问原来无法访问的资源,如google
- 可以做缓存服务器,加速访问资源
- 对客户端访问授权,上网进行认证
- 代理服务器可以记录用户的访问记录,对外隐藏用户信息
那么反向代理表现得更像是一个真正的服务器,隐藏了背后的内容服务器,客户端无法感知到内容服务器的存在。
反向代理的作用:
- 保证内网的安全性,通常反向代理服务器就是对外的公网地址,而真正的内容服务器隐藏于内网中
- 通过反向代理,可以实现负载均衡,反向代理服务器通过负载均衡策略将请求分发到不同内容服务器进行处理
相同之处:
正向代理和反向代理,都离不开代理二字,其原理都是转发请求到真正的内容服务器
不同之处:
正向代理中,客户端需要配置代理服务器地址,请求url指向内容服务器;
反向代理中,代理服务器即对外的服务器地址,客户端无法感知背后的内容服务器地址及数量,通过反向代理可以实现负载均衡;
nginx配置反向代理、负载均衡
原理
- nginx内置tcp代理模块,能透明转发tcp数据
- nginx内置负载均衡模块
- grpc基于http2.0
- 1.13.10后版本的原生支持http2.0,加入对grpc的代理配置
配置示例
worker_processes 2;
pid logs/readface_grpc_nginx.pid;
error_log logs/readface_grpc_error.log;
events {
worker_connections 1024;
}
http {
access_log logs/readface_grpc_access.log;
upstream grpc_servers {
round-robin;
server localhost:11001 weight=3;
server localhost:11002 weight=3;
server localhost:11003 weight=2;
server localhost:11004 weight=2;
}
server {
listen 12000 http2;
location / {
# proxy_pass grpc_servers;
grpc_pass grpc://grpc_servers;
}
}
}
通过upstream域配置内容服务器地址和权重;
以上是对grpc服务的代理配置,如果是对普通自定义tcp通信协议的代理,将http域换成tcp域,去掉http2协议说明,grpc_pass替换成proxy_pass即可;
负载均衡策略:
-
round-robin(轮询)
nginx默认的负载均衡策略,请求按时间顺序逐一分配服务器,如果服务器挂机,自动被剔除。
缺点:轮询策略会导致同一客户端多次访问分配到不同的服务器,如果集群没有对session做处理,会导致客户端访问的session丢失。建议用作静态资源的分配策略,如图片服务器。 -
fair
按服务器的响应时间来分配请求,响应时间短的优先分配。 -
ip_hash
按请求的客户端ip计算hash,按hash结果分配服务器。这样每一个客户端固定访问同一服务器,一定程度上解决轮询策略session丢失的问题。 -
url_hash
计算请求url的hash,按hash的结果来分配服务器。这样每个url定向到同一服务器,此策略适用于服务器缓存url请求的场景
其它可配置项:
- weight:设置权重,默认为1,数值越大,负载分配到的机率越高。
- max_fails:最大失败连接次数,失败连接的超时时长由fail_timeout指定;
- fail_timeout:等待请求的目标服务器发送响应的时长;
- backup:用于fallback的目的,所有服务均故障时才启动此服务器;
- down:手动标记其不再处理任何请求;