您的位置:首页 > 运维架构 > 反向代理

nginx反向代理+负载均衡+健康探测+缓存

2013-09-06 20:44 197 查看
正向代理是一个位于内网客户端和外网原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标,然后由代理服务器向原始服务器转交请求并将获得的内容返回给客户端。正向代理一般用在为防火墙内的局域网客户端提供Internet访问。透明代理还允许客户端通过它访问任意网站并且隐藏自身的代理服务器身份。
反向代理则是提供外部网络访问内部服务器资源的一种手段,对于外部网络客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求,反向代理将判断向何处转交请求,在下面这个例子中就是nginx向后方的lamp转交,并将获得的内容返回给客户端。反向代理一般用在将防火墙后面的服务器资源提供给Internet用户访问。而且反向代理对外都是透明的,访问者并不知道其访问的是一个代理。

由于apache具有良好的稳定性,但不能提供大量的连接并发请求;而nginx能够提供强大的连接并发请求而没有很好的稳定性,结合这两种截然不同的特征,可以在内网的前端使用nginx作为反向代理服务器,后方的apache作为原始服务器,这样既满足大量的连接并发请求,也具有良好的稳定性,当然,前端应该使用多台nginx反向代理,由于是实验环境,这里就使用一台作为演示,具体的拓扑示意图如下:



一、nginx反向代理
nginx作为一个代理服务器,至少需要两块网卡来同时连接外网和内网



网卡设置好之后就要安装nginx了,具体的安装步骤参考《linux下实现lnmp环境》中的第二步“安装nginx”,这里不再列出详细的安装过程了。安装完成之后修改/etc/nginx/nginx.conf文件






前端nginx代理的工作完成之后就要搭建后方的lamp环境了,搭建lamp环境不是这篇文章的重点,所以过程我这也不再列出来了,参考《lamp环境搭建--源码安装 》。lamp环境完成之后在Server1上新建一个默认页面。






然后用外网的一台主机访问代理服务器测试一下:




虽然实现了反向代理的功能,但不能满足大量的连接并发请求,因为在nginx接受到客户端的询问后依然是从后方的服务器中请求数据,其满足的并发连接请求量依然受apache的制约,甚至说多了一个向后查询的过程,其效率还不如没有这个代理,可以把apache装起来,用其自带的压力测试工具ab测试一下:



[root@server1 ~]# ab -c 100 -n 10000 http://172.16.10.100/test.jpg


直接向后方请求数据时可以满足的请求为每秒2241.49个
[root@server1 ~]# ab -c 100 -n 10000 http://202.196.10.123/test.jpg


而通过前端nginx反向代理服务器之后能满足的请求不增反减,这就需要nginx有本地缓存的支持了

二、反向代理+负载均衡+健康探测+缓存
由于设置缓存也是修改nginx的配置文件,所以接下来将负载均衡、健康探测和缓存放在一起做
1、反向代理+负载均衡+健康探测
由于nginx的源码包安装并不支持健康探测,所以需要给nginx的源码打上补丁之后重新配置、编译并安装












[root@server1 nginx-1.0.11]#vim /etc/nginx/nginx.conf



upstream backend /////定义后方的服务器群组
Server 172.16.10.100 weight=1 /////指明后方的一台服务器地址,权重设置为1
Server 172.16.10.101 weight=1 /////指明后方的另一台服务器地址,权重设置为1
healthcheck_enable /////开启健康探测功能
healthcheck_delay 1000 /////设置健康检测的时延
healthcheck_timeout 1000 /////设置健康检测的超时时间
healthcheck_failcount 1 /////后方某台服务器有一次检测不到即视为宕掉
healthcheck_send "GET /.health HTTP/1.0" /////使用GET方法访问后方服务器站点下的.health来进行探测
proxy_pass http://backend /////与upstream backend相对应,在访问202.196.10.123或www.abc.com时将流量转发到backend组
location /stats /////定义一个站点,用来查看后方服务器的健康状况

将nginx重启
在后方的两台服务器上新建两个健康探测页面".health",内容是什么都行,只要前端nginx能够成功访问这个探测页面即可
这是Server1



这是Server2



再次在外网的主机上访问202.196.10.123






可以通过访问根目录下的stats来查看后方服务器的状态



上面显示后方两台服务器都正常
关闭Server1的httpd服务



再次查看后方服务器的状态



显示后方的172.16.10.100即Server1不能正常连接
这样就实现了负载均衡和健康探测,但依然不能满足高并发量,再次用ab进行测试:
[root@server1 nginx-1.0.11]# ab -c 100 -n 10000 http://172.16.10.100/test.jpg


[root@server1 nginx-1.0.11]# ab -c 100 -n 10000 http://202.196.10.123/test.jpg


通过nginx代理可以满足的最大连接请求依然没有直接访问大
[root@server1 nginx-1.0.11]#vim /etc/nginx/nginx.conf 修改nginx的配置文件



proxy_cache_path /////设置缓存的路径和其他参数。缓存数据是保存在文件中的,缓存的键和文件名都是在代理URL上执行MD5的结果。 levels参数定义了缓存的层次结构。
proxy_set_header /////允许重新定义或者添加发往后端服务器的请求头。
proxy_cache /////指定用于页面缓存的共享内存。
proxy_cache_valid /////为不同的响应状态码设置不同的缓存时间。
proxy_cache_use_stale /////指定后端服务器出现状况时,nginx可以使用的过期缓存

将nginx重启



再次进行压力测试
[root@server1 nginx-1.0.11]# ab -c 100 -n 10000 http://202.196.10.123/test.jpg


可以看到最大连接请求已经达到了5000多,这样负载均衡+健康探测+缓存已经完成
接下来一个问题就是在启用缓存之后的访问问题,试着重新访问一下该站点



可以看到再怎么刷新页面内容依然是“I am server-1”,这就证明现在访问到的是nginx缓存在本地的结果,看看缓存目录中有没有内容



Over !
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息