码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx反向代理及负载均衡

时间:2018-04-06 15:33:26      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:Nginx

反向代理(Reverse Proxy):

是指代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将服务器得到的结果返回给internet上请求连接的客户端;
技术分享图片

基本的反向代理:

location [option] URI {
proxy_pass    http://192.168.122.1/;
}

其中 option 包括:
= 路径精确匹配,只包含当前路径,不包含其它任何路径。
^~ 不做正则表达式元字符匹配,做逐个字符搜索匹配
~* 不区分大小写,元字符匹配
~ 区分大小写,元字符匹配
例:
location /forum/ {
proxy_pass http://192.168.122.1:8080/maiya/;
}
http://www.example.com/forum/http://192.168.122.1:8080/maiya/;
如果location的URI前没有任何操作符[op],上游服务器的URL中必须以"/"结尾或明确指定URI;否则nginx会将客户端输入的URI追加到上游服务器的URL上,导致访问异常。
如果location的URI是通过模式匹配定义的,其URI将直接被传递至上游服务器,而不能为上游服务器指定转换后的URI; 而且后端服务器URL中不能包含任何URI信息。

Nginx负载均衡:

upstream 指令:
后端服务器组,可以定义多个
语法:

 upstream name { 
             server IP [option];
  }

name 是给后端服务器组起的名字,名字不能重复,花括号中列出后端服务器组中包含的服务器
默认情况下,某个服务器收到请求后,按照轮训调度(RR)策略选择组内服务器的请求
定义位置:
在http上下文的下方定义upstream
server:定义一个upstream服务器的地址,还可包括一系列可选参数
keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数;

1.upstream模块的负载均衡算法主要有三种(调度策略):

round-robin轮询(默认): 每个请求按照时间顺序逐一分配到不同的后端服务器
ip_hash(哈希算法): 保持会话-每个访客固定一个后端服务器
least_conn(最少连接): 有的服务器负载较高,在这种情况下把请求转发给连接数较少的后端,能够达到更好的负载均衡的效果

2.upstream模块常用的指令有:

weight:权重; 按比例分发,可以根据服务器配置的高低来设置权重的大小
maxfails:最大失败连接次数,默认为1,失败连接的超时时长由fail_timeout指定;
failtimeout:等待请求的目标服务器发送响应的时长;
backup:用于fallback的目的,所有服务均故障时才启动此服务器,类似于LVS Sorry Server;
down: 暂停对该服务器的调度
注:当使用ip_hash时可以解决clientsession问题,但服务器状态不可使用weight和backup。

fair: 可以根据请求页面的大小和加载时间长短进行调度,使用第三方的upstream_fair模块
url_hash: 按请求的url的hash进行调度,从而使每个url定向到同一服务器,使用第三方的hash模块
例1:

     upstream backserver {
                    server 192.168.1.2 max_fails=3 fail_timeout=2;
                    server 192.168.1.3 max_fails=3 fail_timeout=2;
                    server 192.168.1.4 max_fails=2 fail_timeout=5 down;
                    server 127.0.0.1:8080 backup;
         }

同样upstream模块也能为非http类的应用实现负载均衡,如下面的示例定义了nginx为memcached服务实现负载均衡的目的。

upstream memcachesrvs {
server 192.168.122.85:11211;
server 192.168.122.86:11211;
}

如何正确获取客户端的IP地址?

在实际应用中,我们的程序可能需要获取用户的真实的IP地址,比如做异地登陆的判断,或者统计IP的访问次数等
(1).proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#我们通常将真实的IP地址赋值给 X-Real-IP或者X-Forwarded-For,然后upstream服务器组中的程序通过这两个字段获取真实的客户端的IP地址
(2).有后端服务器上配置:
LogFormat "%{X-Real-IP}i ......."

Nginx反向代理及负载均衡

标签:Nginx

原文地址:http://blog.51cto.com/13581826/2095210

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!