本节学习目标
1: 什么是正向与反向代理.
2: 如何配置反向代理.
3: 负载均衡的理解, 策略配置.
4: 对特定资源实现负载均衡.
5: 对不同域名实现负载均衡.
6: 实现对带有url 重写的负载均衡.
1. 反向代理和正向代理服务器
代理模式
其中代理又分为 正向代理和反向代理.
正向代理,指的是通过代理服务器 代理浏览器/客户端去重定向请求访问到目标服务器 的一种代理服务。
正向代理服务的特点是代理服务器 代理的对象是浏览器/客户端,也就是对于目标服务器 来说浏览器/客户端是隐藏的。
反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问代理服务器 ,代理服务器再通过反向代理 +负载均衡实现请求分发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器 代理的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。
总结: 所谓正向代理/反向代理, 只是各自角色不同.
2. 如何配置反向代理
一般情况下,是单独配置一个server
块来设置反向代理服务.
proxy_
开头的一系列指令由nginx
的标准http
模块ngx_http_proxy_module
来解析.
- 关键指令:
proxy_pass
proxy_pass URL;
(一般出现在location
中,也可以出现在server
中).
该指令用来设置被代理服务器的地址,可以是主机名,IP:端口号等形式.如:
proxy_pass http://www.myserver.com/uri;
proxy_pass http://192.168.226.100:8080/uri;
在配置 proxy_pass
的过程中, 应该注意 url
中是否包含 uri
, 两者的处理方式不同.
-
url
中不包含uri
,nginx
服务器不会改变原地址的uri
. - 包含了,
nginx
将会使用新的uri
来代替代替原来的uri
.
location /server{
# 配置1 不包含uri
proxy_pass http://192.168.110.2;
# 或者配置2 包含URI
proxy_pass http://192.168.110.2/new/;
}
如果请求的地址为: http://localhost/server/hi.html
,
- 针对配置1, 转发的结果为:
http://192.168.110.2/server/hi.html
. - 针对配置2, 转发的结果为:
http://192.168.110.2/new/hi.html
3. 负载均衡
在反向代理的图中, 可以看到有个 负载均衡 的概念, 它的主要作用就是采用了一定的分配策略将请求平衡分配到网络集群的各个服务器节点上, 使得大量并发访问或数据流量被分担到多个单元上,减少用户响应时间.
负载均衡的策略
常用策略有: 轮询, 权重和 ip_hash
. 默认为轮询.
-
轮询
原理是每一个请求按时间顺序逐一被分发到不同的应用服务器,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails
(1次),则在失效时间fail_timeout
(10秒)内不会再转发请求到该节点.
upstream proxy_group1{
#分配到的概率是一样的
server 192.168.xx.xx:xxxx
server 192.168.xx.xx:xxxx
server 192.168.xx.xx:xxxx
}
-
权重
原理是每一个请求按权重被分发到不同的应用服务器,同样,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails
(默认1次或可设置N次), 则在失效时间fail_timeout
(默认10秒,可设置N秒) 内, 不会再转发请求到该节点. 默认的权重为 1
upstream proxy_group1{
server xxx.xxx.xx.xx weight =5;
# 重试最多2次,超时时间30s
server xxx.xxx.xx.xx weight =2 max_fails=3 fail_timeout=30s;
server xxx.xxx.xx.xx #默认weight=1
# down 需要休息,不再处理请求
server xxx.xxx.xx.xx down;
# backup 备用服务器,当所有其他服务器不能工作,或者宕机的时候,开始启用这台服务器
server xxx.xxx.xx.xx backup;
}
-
ip_hash
原理是每一个请求按用户访问IP
的哈希结果分配, 如果请求来自同一个用户IP
则固定这台IP
访问一台应用服务器, 该策略可以有效解决动态网页中存在的session
共享问题.
注意: 使用这个指令后无法保证服务器的负载均衡.
upstream proxy_group1{
# 解决seeison 共享把后续请求定位到同一服务器,使用这个指令后无法保证服务器的负载均衡.
ip_hash;
server xxx.xxx.xx.xx
server xxx.xxx.xx.xx
}
总结: 一般使用的都是权重策略, 因为现在很多情况下都是集群部署, 而且集群下的各个服务器资源大多都是不均匀的, 资源高的则分配权重高一些,资源低的则分配权重低一些,这种情况使用基于权重的负载均衡算法,可以更高效的利用资源和提高并发处理能力~.
4. 对特定资源实现负载均衡
upstream proxy_group1{
server xxx.xxx.xxx.xx1;
server xxx.xxx.xxx.xx2;
}
upstream proxy_group2{
server xxx.xxx.xxx.xx3;
server xxx.xxx.xxx.xx4;
}
server{
location /mp3/ {
proxy_pass http://proxy_group1;
......
}
location /video/ {
proxy_pass http://proxy_group2;
......
}
}
5. 对不同域名实现负载均衡.
upstream proxy_group1{
server xxx.xxx.xxx.xx1;
server xxx.xxx.xxx.xx2;
}
upstream proxy_group2{
server xxx.xxx.xxx.xx3;
server xxx.xxx.xxx.xx4;
}
server{
server_name bbs.com
location / {
proxy_pass http://proxy_group1;
......
}
}
server{
server_name news.com
location / {
proxy_pass http://proxy_group2;
......
}
6. 实现对带有url 重写的负载均衡.
upstream proxy_group1{
server xxx.xxx.xxx.xx1;
server xxx.xxx.xxx.xx2;
}
server{
location /file/ {
rewrite ^(file/.*)/media/(.*)\.*$ /map3/.map3 last;
# 匹配 http://domain.com/file/dl/media/1.map3
http://domain.com/file/abc/media/1.map3
http://domain.com/file/efg/media/1.map3
# last 匹配到以后,会继续向下匹配
......
}
location / {
proxy_pass http://proxy_group1;
...
}
部分内容参考链接, 关于正向与反向, 写的还是非常详细的.