nginx技术(3)反向代理和负载均衡

反向代理和负载均衡


一,传统的代理(apache/squid)的同步传输和nginx的异步传输的差异。

nginx技术(3)反向代理和负载均衡


二,同步传输和异步传输的比较

1
2
3
4
5
6
7
8
9
squid同步传输:浏览器发起请求,而后请求会立刻被转到后台,于是在浏览器和后台之间就建立了一个通道。在请求发起直到请求完成,这条通道都是一直存在的。
nginx异步传输:浏览器发起请求,请求不会立刻转到后台,而是将请求数据(header)先收到nginx上,然后nginx再把这个请求发到后端, 后端处理完之后把数据返回到nginx上,nginx将数据流发到浏览器,这点和lighttpd有点不同,lighttpd是将后端数据完全接收后才发 送到浏览器。
那么这到底有什么好处呢?
1) 假设用户执行一个上传文件操作,因为用户网速又比较慢,因此需要花半个小时才能把文件传到服务器。squid的同步代理在用户开始上传后就和后台建立了连 接,半小时后文件上传结束,由此可见,后台服务器连接保持了半个小时,占用了系统资源;而nginx异步代理就是先将此文件收到nginx上,因此仅仅是nginx和用户 保持了半小时连接,后台服务器在这半小时内没有为这个请求开启连接,半小时后用户上传结束,nginx才将上传内容发到后台,nginx和后台之间的带宽 是很充裕的,所以只花了一秒钟就将请求发送到了后台,由此可见,后台服务器连接保持了一秒。同步传输花了后台服务器半个小时,异步传输只花一秒,可见优化 程度很大。
2) 在上面这个例子中,假如后台服务器因为种种原因重启了,上传文件就自然中断了,这对用户来说是非常恼火的一件事情,想必各位也有上传文件传到一半被中断的 经历。用nginx代理之后,后台服务器的重启对用户上传的影响减少到了极点,而nginx是非常稳定的并不需要常去重启它,即使需要重启,利用kill -HUP就可以做到不间断重启nginx。
3) 异步传输可以令负载均衡器更有保障,为什么这么说呢?在其它的均衡器(lvs/haproxy/apache等)里,每个请求都是只有一次机会的,假如用 户发起一个请求,结果该请求分到的后台服务器刚好挂掉了,那么这个请求就失败了;而nginx因为是异步的,所以这个请求可以重新发往下一个后台,下一个 后台返回了正常的数据,于是这个请求就能成功了。还是用用户上传文件这个例子,假如不但用了nginx代理,而且用了负载均衡,nginx把上传文件发往 其中一台后台,但这台服务器突然重启了,nginx收到错误后,会将这个上传文件发到另一台后台,于是用户就不用再花半小时上传一遍。
4) 假如用户上传一个10GB大小的文件,而后台服务器没有考虑到这个情况,那么后台服务器岂不要崩溃了。用nginx就可以把这些东西都拦在nginx上, 通过nginx的上传文件大小限制功能来限制,另外nginx性能非常有保障,就放心的让互联网上那些另类的用户和nginx对抗去吧。
用异步传输会造成问题:
后台服务器有提供上传进度的功能的话,用了nginx代理就无法取得进度,这个需要使用nginx的一个第三方模块来实现。


三,nginx设置异步代理

在http域设置如下参数

参数说明

nginx技术(3)反向代理和负载均衡


三,负载均衡

nginx的负载均衡使用upstream模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
upstream   cluster{
server 192.168.100.238:80 weight=8 max_fails=2  fail_timeout=30s;
server 192.168.100.248:80 weight=8 max_fails=2 fail_timeout=30s;
}
server{
listen80;
server_name   localhost;
location  / {
root  html;
index  index.html  index.htm;
proxy_pass   http://cluster/;    //指定需要代理的URL,
proxy_redirect  off;//如果需要从后端打开location和Refresh字段,可以开启。
proxy_set_header X-Real-IP $remote_addr;//允许将发送到后端的服务器请求重新定义或者增加一个字段,这个可以是变量也是文本组合。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
//在后端web中就算加上$http_x_Forwarded_for这条,也得不到用户的IP,
所以在nginx反向代理添加Header头信息X-Forwarded-For在配合后端服务器日志文件的
$http_x_Forwarded_for这条就可以获得用户的IP地址了。
proxy_set_header Host  $host;//首先说明proxy_set_header指令在向反向代理的后端Web服务器发起请求时添加指定的Header头信息,
后端web服务器有多个基于域名的虚拟主机时,通过头信息Host,
用于指定请求的域名,这样后端web才能识别反向代理请求哪个虚拟主机处理。
proxy_next_upstream error timeout invalid_header http_500 http_502  http_503
http_504 http_404;服务器头部超时相应的各种状态
}
}
}


本文转自陈仲阳0 51CTO博客,原文链接:http://blog.51cto.com/wolfword/1205439