`

Ngin之负载均衡

 
阅读更多

大家可以看到,由于我们网站是发展初期,nginx只代理了后端一台服务器,但由于我们网站名气大涨访问的人越来越多一台服务器实在是顶不住,于是我们加了多台服务器,那么多台服务器又怎么配置代理呢,我们这里以两台服务器为案例,为大家做演示。

1.upstream 负载均衡模块说明

案例:

下面设定负载均衡的服务器列表。

1
2
3
4
5
6
7
8
9
10
11
12
upstream test.net{
ip_hash;
server 192.168.10.13:80;
server 192.168.10.14:80  down;
server 192.168.10.15:8009  max_fails=3  fail_timeout=20s;
server 192.168.10.16:8080;
}
server {
  location / {
    proxy_pass  http://test.net;
  }
}

       upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称test.net。这个名称可以任意指定,在后面需要用到的地方直接调用即可。

2.upstream 支持的负载均衡算法

Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。  

  • 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。

  • ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。

  • fair。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。

  • url_hash。此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。

3.upstream 支持的状态参数

在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:      

  • down,表示当前的server暂时不参与负载均衡。

  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

注,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。

4.实验拓扑

nginx3

5.配置nginx负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
      server 192.168.18.201 weight=1;
      server 192.168.18.202 weight=1;
  }
  server {
      listen       80;
      server_name  localhost;
      #charset koi8-r;
      #access_log  logs/host.access.log  main;
      location / {
              proxy_pass      http://webservers;
              proxy_set_header  X-Real-IP  $remote_addr;
      }
}

注,upstream是定义在server{ }之外的,不能定义在server{ }内部。定义好upstream之后,用proxy_pass引用一下即可。

6.重新加载一下配置文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

7.测试一下

t7

t8

注,大家可以不断的刷新浏览的内容,可以发现web1与web2是交替出现的,达到了负载均衡的效果。

8.查看一下Web访问服务器日志

Web1:

1
2
3
4
5
6
7
8
9
10
11
[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [04/Sep/2013:09:41:58 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:58 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:59 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:59 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:21 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:22 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:22 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

Web2:

先修改一下,Web服务器记录日志的格式。

1
2
3
4
5
[root@web2 ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@web2 ~]# service httpd restart
停止 httpd:                                               [确定]
正在启动 httpd:                                           [确定]

接着,再访问多次,继续查看日志。

1
2
3
4
5
6
7
8
9
10
11
[root@web2 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:29 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:29 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

注,大家可以看到,两台服务器日志都记录是192.168.18.138访问的日志,也说明了负载均衡配置成功。

9.配置nginx进行健康状态检查

  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用,进行健康状态检查。

1
2
3
4
5
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
    }

10.重新加载一下配置文件

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

11.停止服务器并测试

1
2
3
先停止Web1,进行测试。
[root@web1 ~]# service httpd stop
停止 httpd:                                               [确定]

t8

注,大家可以看到,现在只能访问Web2,再重新启动Web1,再次访问一下。

1
2
[root@web1 ~]# service httpd start
正在启动 httpd:                                           [确定]

t7

t8

注,大家可以看到,现在又可以重新访问,说明nginx的健康状态查检配置成功。但大家想一下,如果不幸的是所有服务器都不能提供服务了怎么办,用户打开页面就会出现出错页面,那么会带来用户体验的降低,所以我们能不能像配置LVS是配置sorry_server呢,答案是可以的,但这里不是配置sorry_server而是配置backup。

12.配置backup服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@nginx ~]# vim /etc/nginx/nginx.conf
server {
                listen 8080;
                server_name localhost;
                root /data/www/errorpage;
                index index.html;
        }
upstream webservers {
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
        server 127.0.0.1:8080 backup;
    }
[root@nginx ~]# mkdir -pv /data/www/errorpage
[root@nginx errorpage]# cat index.html
<h1>Sorry......</h1>

13.重新加载配置文件

1
2
3
4
[root@nginx errorpage]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

14.关闭Web服务器并进行测试

1
2
3
4
[root@web1 ~]# service httpd stop
停止 httpd:                                               [确定]
[root@web2 ~]# service httpd stop
停止 httpd:                                               [确定]

t9

注,大家可以看到,当所有服务器都不能工作时,就会启动备份服务器。好了,backup服务器就配置到这里,下面我们来配置ip_hash负载均衡。

15.配置ip_hash负载均衡

  • ip_hash,每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。(一般电子商务网站用的比较多)

1
2
3
4
5
6
7
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
        ip_hash;
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
        #server 127.0.0.1:8080 backup;
    }

注,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能有backup。(有人可能会问,为什么呢?大家想啊,如果负载均衡把你分配到backup服务器上,你能访问到页面吗?不能,所以了不能配置backup服务器)

16.重新加载一下服务器

1
2
3
4
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                                           [确定]

17.测试一下

t10

注,大家可以看到,你不断的刷新页面一直会显示的民Web2,说明ip_hash负载均衡配置成功。下面我们来统计一下Web2的访问连接数。

18.统计Web2的访问连接数

1
2
[root@web2 ~]# netstat -an | grep :80 | wc -l
304

注,你不断的刷新,连接数会越来越多。

分享到:
评论

相关推荐

    Nginx+Tomcat在Windows下做负载均衡

    例如,使用nginx-0.8.49和apache-tomcat-6.0.26,并分别放在D:/负载均衡/nginx和D:/负载均衡/tomcat_1及D:/负载均衡/tomcat_2目录下。 2. 然后,将要部署的应用程序复制到两个Tomcat实例的webapps目录,确保它们...

    在Nginx服务器中配置针对TCP的负载均衡的方法

    默认nginx不支持tcp的负载均衡,需要打补丁,(连接方式:从客户端收到一个连接,将从本地新建一个连接发起到后端服务器),具体配置如下: 一、安装Nginx 1.下载nginx # wget ...

    Nginx+Tomcat+Redis搭建均衡负载集群

    这个架构利用Nginx作为反向代理和负载均衡器,Tomcat作为Java应用服务器处理业务逻辑,而Redis则用作缓存系统以提升数据访问速度。下面我们将详细探讨这些组件的作用及其在集群环境中的配置与协同工作。 **Nginx** ...

    docker-nginx:使用 CPU 优化和负载均衡器模块构建 NGINX docker

    使用负载均衡器模块构建 NGINX 为 x86-64 CPU 架构构建的最快、更小的Nginx。 编译 Nginx 二进制文件以利用 SSE 4.2 指令集。 与的区别: 仅 x86-64 CPU 架构 带动态模块 带有动态模块 使用同步上游动态模块 使用...

    nginx-rtmp-module-master-newversion (2)_nginx_thesehdr_rtmp-ngin

    在运行大规模的流媒体服务时,需要考虑性能优化,比如合理分配系统资源、负载均衡、缓存策略以及监控系统状态。Nginx 的事件驱动模型和多进程架构有利于在高并发场景下保持低延迟。 7. **监控与故障排查** 使用 ...

    nginx-rtmp

    - **负载均衡**:结合Nginx的负载均衡功能,将流分发到多个RTMP服务器,提高服务可用性和性能。 - **加密与安全**:使用HTTPS和RTMPS(RTMP over SSL/TLS)保护流数据的安全。 - **自定义脚本**:通过`exec`指令...

    fastdfs的安装包括集群

    标题中的“fastdfs的安装包括集群”指的是在服务器环境中部署FastDFS分布式文件系统,并构建一个集群,以便实现高可用性和负载均衡。FastDFS是一个开源的、高性能的、轻量级的分布式文件系统,主要解决大容量存储和...

    nginx面试题.pdf

    8. 如何在Nginx上实现负载均衡? 9. Nginx可以处理哪些类型的请求? 10. 如何在Nginx上配置反向代理? 11. Nginx有哪些模块? 12. 如何在Nginx配置文件中实现重定向? 13. Nginx可以用作缓存服务器吗?如果可以,...

    NGINX高性能20157.epub.7z

    2. **反向代理与负载均衡**:NGINX的强大功能之一是其反向代理能力,它可以将来自客户端的请求转发到后端服务器,从而实现负载均衡。书中会详细讲解如何配置反向代理规则,以及如何根据不同的策略(如轮询、权重、IP...

    Nginx配置文件(nginx.conf)配置详解[定义].pdf

    在这个示例中,HTTP服务器使用反向代理功能提供负载均衡支持。 MIME类型 `include mime.types;`指令指定了MIME类型的配置文件。在这个示例中,MIME类型配置文件为mime.types文件,默认类型为application/octet-...

    fastdfs-nginx-module-master 5.0.8 适用

    2. **负载均衡**:通过Nginx的负载均衡策略,可以实现对FastDFS存储节点的智能调度,提高系统的可用性。 3. **安全性增强**:支持HTTP基本认证和Token验证,确保文件访问的安全性。 4. **性能优化**:利用Nginx的...

    FastDFS安装需要的文件

    FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要解决大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务,如图片、视频分享网站等。FastDFS设计的目标是简单、高效和高可用性,它将文件存储和...

    使用 Nginx 部署静态页面的方法

    它具备处理静态文件、索引文件以及自动索引,无缓存的反向代理加速,简单的负载均衡和容错等功能。Nginx还具备模块化的结构,如gzipping,byteranges,chunkedresponses,以及SSI-filter等filter。此外,Nginx还支持SSL...

    Nginx作为反向代理时传递客户端IP的设置方法

    nginx默认配置文件里面是没有进行日志转发配置的,这个需要我们自己手动来操作了,当然后端的real server不同时操作方法是不一样的,这里我们分别例举几种情况来说明一下。 nginx做前端,转发日志到后端nginx服务器...

    gateway-dubbox:服务网关集成dubbox rest服务

    网关系统目的我们服务框架使用的是dubbox(这个不用再多描述了),内部系统调用...负载均衡;心跳检测鉴权参数校验路由路由规则很简单:前端请求的url,去掉网关的contextpath后对应的url地址即为相应的后端服务的url;对

    nginx解决图片显示过慢,下载不完全的问题

    5. `proxy_temp_file_write_size`: 指定了在高负载下,Nginx写入临时文件的最大尺寸。 在案例中,问题出在`proxy_temp_file_write_size`被设置为16k,而服务器上的图片大小普遍超过了这个限制。当文件大小超过此值...

    nginx网页配置工具 v1.9.2

    nginx网页配置工具功能:1、本项目可以使用WebUI配置nginx的各项功能,包括http协议转发,tcp协议转发,反向代理,负载均衡,ssl证书自动申请、续签、配置等,最终生成nginx.conf文件并覆盖nginx的默认配置文件,...

Global site tag (gtag.js) - Google Analytics