Nginx+Apache反向代理
反向代理负载均衡
使⽤代理服务器可以将请求转发给内部的Web服务器,使⽤这种加速模式显然可以提升静态⽹页的访问速度。因此也可以考虑使⽤这种技术,让
这种代理⽅式与普通的代理⽅式有所不同,标准代理⽅代理服务器将请求均匀转发给多台内部Web服务器之⼀上,从⽽达到负载均衡的⽬的。这种代理⽅式与普通的代理⽅式有所不同,标准代理⽅式是客户使⽤代理访问多个外部Web 服务器,⽽这种代理⽅式是多个客户使⽤它访问内部Web服务器,因此也被称为反向代理模式。
1、概念
每针对⼀次实现这个反向代理能⼒并不能算是⼀个特别复杂的任务,但是在负载均衡中要求特别⾼的效率,这样实现起来就不是⼗分简单的了。每针对⼀次代理,代理服务器就 必须打开两个连接,⼀个为对外的连接,⼀个为对内的连接,因此对于连接请求数量⾮常⼤的时候,代理服务器的负载也就⾮常之⼤了,在最后反向代理服务器会成 为服务的瓶颈。例如,使⽤Apache的mod_rproxy模块来实现负载均衡功能时,提供的负载也就⾮常之⼤了,在最后反向代理服务器会成 为服务的瓶颈。
并发连接数量受Apache本⾝的并发连接数量的限制。⼀ 般来讲,可以使⽤它来对连接数量不是特别⼤,但每次连接都需要消耗⼤量处理资源的站点进⾏负载均衡,例如搜寻。
使 ⽤反向代理的好处是,可以将负载均衡和代理服务器的⾼速缓存技术结合在⼀起,提供有益的性能,具备额外的安全性,外部客户不能直接访问真实的服务器。并且 实现起来可以实现较好的负载均衡策略,将负载可以⾮常均衡的分给内部服务器,不会出现负载集中到某个服务器的偶然现象。
2、nginx 实现反向代理负载均衡
1)环境:
a. 本地使⽤Windows系统,然后使⽤VirutalBox安装⼀个虚拟的Linux系统。
在 本地的Windows系统上分别安装nginx(侦听8080端⼝)和apache(侦听80端⼝)。在虚拟的Linux系统上安装apache(侦听 80端⼝)。这样相当于拥有了1台nginx在前端作为反向代理服务器;后⾯有2台apache作为应⽤程序服务器(可以看作是⼩型的server cluster。);
b. nginx⽤来作为反向代理服务器,放置到两台apache之前,作为⽤户访问的⼊⼝;
nginx仅仅处理静态页⾯,动态的页⾯(php请求)统统都交付给后台的两台apache来处理。也就是说,
可以把⽹站的静态页⾯或者⽂件放置到nginx的⽬录下;动态的页⾯和数据库访问都保留到后台的apache服务器上。
c. 如下两种⽅法实现server cluster的负载均衡。
假 设前端nginx(为127.0.0.1:8080)仅仅包含⼀个静态页⾯index.html;后 台的两个apache服务器(分别为localhost:80和
158.37.70.143:80),⼀台根⽬录放置phpMyAdmin⽂件夹和 test.php(⾥⾯测试代码为print "server1";),另⼀台根⽬录仅仅放置⼀个test.php(⾥⾯测试代码为print "server2";)。
2)针对不同请求的负载均衡:
a. 在最简单地构建反向代理的时候(nginx仅仅处理静态不处理动态内容,动态内容交给后台的apache server来处理),具体的设置为:在a. 在最简单地构建反向代理的时候
location ~ \.php$ {
proxy_pass 158.37.70.143:80;
}
>;这样当客户端访问localhost:8080/index.html的时候,前端的nginx会⾃动进⾏响应;
如上是最为简单的使⽤nginx做为反向代理服务器的例⼦;
b. 我们现在对如上例⼦进⾏扩展,使其⽀持如上的两台服务器。
设置f的server模块部分,将对应部分修改为:
location ^~ /phpMyAdmin/ {
proxy_pass 127.0.0.1:80;
nginx和apache区别}
location ~ \.php$ {
proxy_pass 158.37.70.143:80;
}
因此综上,实现了针对不同请求的负载均衡。
>;如果⽤户访问静态页⾯index.html,最前端的nginx直接进⾏响应;
>;如果⽤户访问test.php页⾯的话,158.37.70.143:80的Apache进⾏响应;
>;如果⽤户访问⽬录phpMyAdmin下的页⾯的话,127.0.0.1:80的Apache进⾏响应;
3)访问同⼀页⾯的负载均衡:
a. 现在的情况是在windows下nginx是localhost侦听8080端⼝;
两台apache,⼀台是127.0.0.1:80(包含test.php页⾯但是打印server1),另⼀台是虚拟机的158.37.70.143:80(包含test.php页⾯但是打印server2)。
b. 因此重新配置f为:
在nginx的配置⽂件f的http模块中添加,服务器集server cluster(我们这⾥是两台)的定义:
>;⾸先在nginx的配置⽂件f的http模块中添加,服务器集server cluster(我们这⾥是两台)
的定义:
myCluster{
upstreammyCluster
server 127.0.0.1:80;
server 158.37.70.143:80;
}
表⽰这个server cluster包含2台服务器
>;然后在server模块中定义,负载均衡:
location ~ \.php$ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
}
upstream myCluster {
server 127.0.0.1:80 weight=5 max_fails=2 fail_timeout=30s;;
server 158.37.70.143:80 weight=1 max_fails=2 fail_timeout=30s;
}
这样表⽰5/6的⼏率访问第⼀个server,1/6访问第⼆个。同时还可以定义max_fails和fail_timeout等参数。
====================
综 上,通过使⽤nginx的反向代理服务器reverse proxy server的功能,将其布置到多台apache server的前端。nginx仅仅⽤来处理静态页⾯响应和动态请求的代理pass,后台的apache server作为app ser
ver来对前台pass过来的动态页⾯进⾏处理并返回给nginx。
通过以上的架构,我们可以实现nginx和多台apache构成的机cluster的负载均衡。
两种均衡:
1)可以在nginx中定义访问不同的内容,代理到不同的后台server;
1)可以在nginx中定义访问不同的内容,代理到不同的后台server;如上例⼦中的访问phpMyAdmin⽬录代理到第⼀台server上;访问test.php代理到第⼆台server上;
2)可以在nginx中定义访问同⼀页⾯,均衡(当然如果服务器性能不同可以定义权重来均衡)地代理到不同的后台server上。
地代理到不同的后台server上。如上的例⼦2)可以在nginx中定义访问同⼀页⾯,均衡
访问test.php页⾯,会均衡地代理到server1或者server2上。
实际应⽤中,server1和server2上分别保留相同的app程序和数据,需要考虑两者的数据同步。
简单总结:
主要通过以下⼿段实现负载均衡:
location:定义需要匹配的请求(⽂件或⽬录,可以使⽤正则或不使⽤正则直接匹配)
proxy_pass:定义需要将请求proxy到地⽅(某台主机或者某个upstream cluser集)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论