当前位置: 首页 > 科技观察

Nginx负载均衡实现我们网站的高可用

时间:2023-03-13 17:06:41 科技观察

我们网站在开发初期,nginx只是作为一个后端服务器的代理,但是随着我们网站的知名度越来越高,访问的人越来越多一台服务器我们实在是受不了了,于是又加了多台服务器,那么这么多服务器怎么配置代理呢,这里就以两台服务器为例给大家演示一下。1、上游负载均衡模块说明如下:设置负载均衡的服务器列表如下。upstreamtest.cc{ip_hash;server192.168.1.10:80;server192.168.1.11:80down;server192.168.1.12:8009max_fails=3fail_timeout=20s;server192.168.1.13:8080;}server{location/{proxy_passhttp://test.cc;}}upstream是Nginx的HTTPUpstream模块,使用简单的调度算法实现客户端IP到后端服务器的负载均衡。在上面的设置中,通过upstream命令指定了一个负载均衡器名称test.cc。这个名字可以任意指定,以后需要的时候可以直接调用。2、上游支持的负载均衡算法Nginx的负载均衡模块目前支持四种调度算法,下面分别介绍,其中后两种属于第三方调度算法。轮询(默认):每个请求按时间顺序一一分配给不同的后端服务器。如果后台服务器宕机,故障系统会自动排除,不影响用户访问。权重指定轮询权重。Weight值越大,分配的接入概率就越高。主要用于各个后端服务器性能参差不齐的情况。ip_hash:每个请求根据访问IP的hash结果进行分配,使同一个IP的访问者访问一个后端服务器,有效解决了动态网页中session共享的问题。fair:这是一种比上面两种更智能的负载均衡算法。该算法可以根据页面大小和加载时间智能地进行负载均衡,即根据后端服务器的响应时间来分配请求,响应时间短的优先。Nginx本身不支持公平。如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。url_hash:该方法根据访问的URL的哈希结果分配请求,使每个URL指向同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash。如果需要使用这种调度算法,必须安装Nginx的hash包。3、upstream支持的状态参数在HTTPUpstream模块中,可以通过server命令指定后端服务器的IP地址和端口,也可以设置各个后端服务器在负载均衡调度中的状态。常用的状态有:down:表示当前服务器暂时不参与负载均衡。backup:保留备份机器。当所有其他非备机都出现故障或忙时,会请求备机,所以这台机器的压力是最轻的。max_fails:允许的请求失败次数,默认为1次。当超过最大次数时,返回proxy_next_upstream模块定义的错误。fail_timeout:max_fails次失败后暂停服务的时间。max_fails可以和fail_timeout一起使用。注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能为weight和backup。4.实验拓扑5.配置nginx负载均衡[root@nginx~]#vim/etc/nginx/nginx.confupstreamwebservers{server192.168.18.201weight=1;server192.168.18.202weight=1;}server{listen80;server_namelocalhost;#charsetkoi8-r;#access_loglogs/host.access.logmain;location/{proxy_passhttp://webservers;proxy_set_headerX-Real-IP$remote_addr;}}注意,upstream是在server{}之外定义的,不能在server{中定义}里面。定义upstream后,使用proxy_pass对其进行引用。6.重新加载配置文件[root@nginx~]#servicenginxreloadnginx:theconfigurationfile/etc/nginx/nginx.confsyntaxisoknginx:configurationfile/etc/nginx/nginx.conftestissuccessful重新加载nginx:[OK]重新加载nginx:[OK]7.试赌一下,可以不断刷新浏览内容,可以发现web1和web2交替出现,达到了负载均衡的效果。8、查看Web访问服务器日志Web1:[root@web1~]#tail/var/log/httpd/access_log192.168.1.208--[04/Sep/2013:09:41:58+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(compatible;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/Sep/2013:09:41:58+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[2013年9月4日:09:41:59+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[2013年9月4日:09:41:59+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[2013年9月4日:09:42:00+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/2013年9月:09:42:00+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/Sep/2013:09:42:00+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[2013/9/04:09:44:21+0800]"GET/HTTP/1.0"20023"-“”Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)”192.168.1.208--[04/Sep/2013:09:44:22+0800]”GET/HTTP/1.0”20023"-""Mozilla/5.0(compatible;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/Sep/2013:09:44:22+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(compatible;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"web2:首先修改web服务器日志的格式[root@web2~]#vim/etc/httpd/conf/httpd.confLogFormat"%{X-Real-IP}i%l%u%t"%r"%>s%b"%{Referer}i""%{User-Agent}i""combined[root@web2~]#servicehttpdrestartStoppinghttpd:[OK]Startinghttpd:[OK]然后,多访问几次,继续查看日志。[root@web2~]#tail/var/log/httpd/access_log192.168.1.208--[04/Sep/2013:09:50:28+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[2013/9/04:09:50:28+0800]"GET/HTTP/1.0"20023"-“”Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)”192.168.1.208--[04/Sep/2013:09:50:28+0800]”GET/HTTP/1.0”20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/Sep/2013:09:50:28+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[2013/9/04:09:50:28+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(compatible;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/Sep/2013:09:50:28+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/Sep/2013:09:50:28+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(compatible;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/Sep/2013:09:50:28+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[04/Sep/2013:09:50:29+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(兼容;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"192.168.1.208--[2013/9/04:09:50:29+0800]"GET/HTTP/1.0"20023"-""Mozilla/5.0(compatible;MSIE10.0;WindowsNT6.1;WOW64;Trident/6.0)"注意,可以看到,两台服务器的日志都记录为192.168.1.208的访问日志,也说明负载均衡配置成功9、配置nginx进行健康状态检查max_fails,允许请求失败的次数,默认为1次,当次数超过***次时,返回proxy_next_upstream模块定义的错误fail_timeout,经历max_fails次失败后,时间暂停服务.max_fails可以和fail_timeout一起使用进行健康检查。[root@nginx~]#vim/etc/nginx/nginx.confupstreamwebservers{server192.168.18.201weight=1max_fails=2fail_timeout=2;server192.168.18.202weight=1max_fails=2fail_timeout=2;}10.重新加载配置文件[root@nginx~]#servicenginxreloadnginx:theconfigurationfile/etc/nginx/nginx.confsyntaxoknginx:configurationfile/etc/nginx/nginx.conftestissuccessfulreloadingnginx:[OK]reloadingnginx:[OK]11.停止服务器,先测试StopWeb1fortesting.[root@web1~]#servicehttpdstopStophttpd:[OK]注意,可以看到现在只能访问Web2,重启Web1,再访问。[root@web1~]#servicehttpdstartisstartinghttpd:[OK]注意,可以看到,现在可以再次访问,说明nginx的健康状态检查配置成功。但是想一想,如果不幸的是所有的服务器都不能提供服务,用户打开页面就会出现错误页面,会降低用户体验,那么我们能不能像配置LVS一样配置sorry_server呢?Answer可以,但是这里不是配置sorry_server,而是配置backup。12.配置备份服务器[root@nginx~]#vim/etc/nginx/nginx.confserver{listen8080;server_namelocalhost;root/data/www/errorpage;index.html;}upstreamwebservers{server192.168.18.201weight=1max_fails=2fail_timeout=2;server192.168.18.202weight=1max_fails=2fail_timeout=2;server127.0.0.1:8080backup;}[root@nginx~]#mkdir-pv/data/www/errorpage[root@nginxerrorpage]#catindex.html

对不起……

13.重新加载配置文件[root@nginxerrorpage]#servicenginxreloadnginx:theconfigurationfile/etc/nginx/nginx.confsyntaxisoknginx:configurationfile/etc/nginx/nginx.conftestissuccessfulreloadnginx:[OK]14.关闭web服务器并测试[root@web1~]#servicehttpdstopStophttpd:[OK][root@web2~]#servicehttpdstopStophttpd:[OK]注意,可以看到当所有的服务器都不工作的时候,启动了一个备份服务器。好了,备份服务器配置到这里,我们来配置ip_hash负载均衡。15、配置ip_hash负载均衡ip_hash,每个请求根据访问IP的hash结果进行分配,让同一个IP的访问者访问一个后端服务器,有效解决了动态网页存在的session共享问题。(一般电商网站用的比较多)[root@nginx~]#vim/etc/nginx/nginx.confupstreamwebservers{ip_hash;server192.168.18.201weight=1max_fails=2fail_timeout=2;server192.168.18.202weight=1max_fails=2fail_timeout=2;#server127.0.0.1:8080backup;}注意,当负载调度算法为ip_hash时,负载均衡调度中后端服务器的状态不能有备份。(可能有人会问,为什么?你想想,如果负载均衡器把你分配到备份服务器,你能访问到页面吗?不能,所以备份服务器不能配置)16.重新加载服务器[root@nginx~]#servicenginxreloadnginx:theconfigurationfile/etc/nginx/nginx.confsyntaxisoknginx:configurationfile/etc/nginx/nginx.conftestissuccessfulReloadingnginx:[OK]17.测试注意,可以看到会一直刷新页面如果显示MinWeb2,则说明表示ip_hash负载均衡配置成功。我们统计一下Web2访问连接数。18、统计Web2访问连接数[root@web2~]#netstat-an|grep:80|wc-l304注意,如果一直刷新,连接数会增加。好了,nginx的负载均衡就演示到这里了。