Nginx:负载均衡与反向代理
一、负载均衡
1、什么是负载均衡
随着请求数的快速增长,单服务器已经无法承担大量用户的并发访问,这个时候,就需要建立服务器集群,来让多台服务器协同工作,提高整体项目的吞吐量和QPS。假设一台设备资源占有率已经饱和,而另一台服务器缺只有零星几个请求处理,这显然是不合理的。我们期望多台服务器需要平均承担客户端发来的请求,使每台机器都充分利用。这时,我们就需要用到一种技术,叫做负载均衡。
负载均衡是多台服务器组合为一个集群,其中每台机器可以单独运行,服务器之间地位相同,通过负载均衡技术,将客户端发来的请求平均分配到每台服务器中,使得项目的负载能够均衡的分布,每台服务器的资源使用量也基本相同。直白的说,通过负载均衡技术,使得项目巨额访问量从单台服务器均匀的分摊到每台服务器上。这种思想,也是高性能网站结构的核心思想:分!
2、负载均衡之DNS轮询
我们对同一个域名添加多个A记录解析。DNS服务器会将请求随机分配到其中一条记录中。DNS轮询是否支持需要询问域名注册商。比如,我对博客www.lanecn.com添加了一个二级域名nginx.lanecn.com。在万网的操作后台,对这个域名添加了4条A记录解析,分别为10.10.10.1、10.10.10.2、10.10.10.3、10.10.10.4。如果有请求来访问nginx.lanecn.com,域名会随机被解析到10.10.10.1 – 10.10.10.4中的其中一台。这就是用DNS轮询的方式来做负载均衡。
优点:DNS轮询的成本非常低。
缺点:1)分配不均匀。首先本地浏览器缓存问题会使下次请求根本不会去查询域名解析的IP,其次最简单的随机分配算法,不能根据服务器的性能差异来为某台高配机器多分,低配机器少分。这使得低配机器已经高负荷运行了,而高配机器只有10%的资源消耗。2)不可靠。DNS轮询没有心跳检测,假设其中一台服务器宕机,域名供应商是不可知的。其次DNS生效时间过长,而且各级都有缓存。
应用:在可靠性要求不高的服务器集群可以使用DNS轮询
3、负载均衡之四\七层负载均衡设备
在可靠性要求高的应用场景,硬件层面通常采用四\七层负载均衡设备。鼎鼎大名的就是F5负载均衡设备。
在网络中,有一个叫做开放系统互联模型,也就是OSI七层模型。一到四层和数据传输相关,五到七层是和应用程序数据相关,数据一层层的传输。从第一层到第七层名称依次为:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。其中,我们熟知的IP协议位于第三层网络层,TCP协议位于第四层传输层,HTTP/FTP等协议位于最高的一层第七层应用层。
常见的负载均衡交换机有F5 BIG-IP、Cisco CSS等,价格高昂。这些设备通常应用在第四层或者第七层。因此,被成为四\七层负载均衡设备。
4、负载均衡之软件层面
1)应用在第四层的负载均衡软件的代表是Linux Virtual Server,简称为LVS。LVS根据IP和内容进行请求奋发。并且可以自动识别并屏蔽故障服务器,使得服务器集群更加高可用。
2)、应用在第七层的负载均衡软件的代表是基于HTTP反向代理的Nginx、HA Proxy等。Nginx的反向代理支持虚拟主机,可配置。能够按照轮询、IP、URL等方式进行负载均衡,和LVS一样,也支持故障检查。
二、反向代理
1、什么是反向代理
我们先来看看什么叫代理:客户端使用代理服务器,来访问一些在国家政策不允许访问的国外网站。基本流程是:客户端发送请求给代理服务器去,代理服务器去访问目标网站,然后代理服务器将目标网站返回的结果发送给客户端。
现在,我们来看看什么叫反向代理:网站内部使用代理服务器,来中转客户端发来的请求。基本流程是:客户端发送请求给目标网站,目标网站先经过反向代理服务器,然后将请求转发给内部网络的其他服务器来处理,最后将数据返回。
通俗的讲:代理,就是客户端使用的,对目标网站来说,代理服务器就是一个客户。而反向代理,就是目标网站使用的,对于用户来讲,反向代理服务器就是一个网站服务器。
定义:反向代理就是客户端发送请求给代理服务器,代理服务器再转发给内部的Web服务器集群,然后将Web服务器集群返回的数据发送给客户端。在客户端看来,代理服务器的表现就是一个真正的Web服务器。
反向代理服务器并不能处理静态网页或CGI程序,也不保存任何数据。网站数据都是保存在内部网络的Web服务器中。因此,如果暴露在公网的反向代理服务器被攻击,也不会使网站数据遭到破坏,这就增强了Web服务器的安全性。
三、Nginx的负载均衡和反向代理
Nginx的反向代理通过设置Upstream指令。Upstream指令包含一组目标服务器IP、权重等信息。在Nginx的配置文件中server{}模块中的proxy_pass和fastcgi_pass指令来使用Upstream定义的一组服务器集群。
值得一提的是,在PHP中,我们可以通过超全局变量$_SERVER[“REMOTE_ADDR”]来获取客户端的IP地址。但是,在反向代理环境中,我们的PHP程序获取到的时候反向代理服务器IP,而非真实客户端的IP。这时,通过在配置文件中添加proxy_set_header X-Forwarded-For $remote_addr; 可以使代理服务器收到的客户端IP传递给后端Web服务器。
« 四种常见的 POST 提交数据方式
|
批量修改文件名»