Nginx——Nginx实现服务端集群搭建

目录

1、Nginx与Tomcat部署

2、动静分离

3、Nginx动静分离实现步骤

4、Nginx实现Tomcat集群搭建

5、Nginx高可用解决方案

5.1、Keepalived

5.2、VRRP协议

5.3、环境搭建

5.4、Keepalived配置文件介绍

5.5、访问测试

5.6、keepalived之vrrp_script


1、Nginx与Tomcat部署

我们知道Nginx在高并发场景和处理静态资源是非常高性能的,但是在实际项目中除了静态资源还有就是后台业务代码模块,一般后台业务代码模块都会被部署在Tomcat,weblogic或者是websphere等web服务器上,那么如何使用Nginx接收用户的请求并把请求转发到后台web服务器?

步骤分析:

  • 准备Tomcat环境,并在Tomcat上部署一个web项目;
  • 准备Nginx环境,使用Nginx接收请求,并把请求分发到Tomcat上。
    	upstream webservice {
    		server localhost:8080;
    	}
    	server {
    		listen 80;
    		server_name localhost;
    		
    		location /demo {
    			proxy_pass http://webservice;
    		}
    	}

2、动静分离

什么是动静分离?

  • 动:后台应用程序的业务处理。
  • 静:网站的静态资源(html,javaScript,css,images等文件)。
  • 分离:将两者分开部署访问,提供用户进行访问。举例说明就是以后所有和静态资源相关的内容都交给Nginx来部署访问,非静态内容则交给类似于Tomcat的服务器来部署访问。

为什么要动静分离?

  • Nginx在处理静态资源的时候,效率是非常高的,而且Nginx的并发访问量也是名列前茅,而Tomcat则相对比较弱一些,所以把静态资源交给Nginx后,可以减轻Tomcat服务器的访问压力并提高静态资源的访问速度。
  • 动静分离以后,降低了动态资源和静态资源的耦合度。如动态资源宕机了也不影响静态资源的展示。

如何实现动静分离?

  • 实现动静分离的方式有很多,比如静态资源部署到CDN、Nginx等服务器上,动态资源可以部署到Tomcat,weblogic或者websphere上。

3、Nginx动静分离实现步骤

1、将demo.war项目中的静态资源都删除掉,重新打包生成一个war包;

2、将war包部署到tomcat中,把之前部署的内容删除掉;

进入到tomcat的webapp目录下,将之前的内容删除掉;
将新的war包复制到webapps下;
将tomcat启动。

3、在Nginx所在服务器创建如下目录,并将对应的静态资源放入指定的位置;

web/
    images/
        logo.png
        mv.png
    index.html
    js/
        jquery.min.js

其中index.html页面的内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery.min.js"></script>
    <script>
        $(function () {
            $.get("http://192.168.200.133/demo/getAddress", function (date) {
                $("#msg").html(date);
            });
        });
    </script>
</head>
<body>

<img src="images/logo.png"/>
<h1>Nginx如何将请求转发到后端服务器</h1>
<h3 id="msg"></h3>
<img src="images/mv.png"/>

</body>
</html>

4、配置Nginx的静态资源与动态资源的访问;

	upstream webservice {
		server localhost:8080;
	}
	server {
		listen 80;
		server_name localhost;
		
		# 动态资源访问。以/demo开头的为动态资源
		location /demo {
			proxy_pass http://webservice;
		}
		
		# 静态资源的访问配置。以.png .jpg .gif .js 结尾的静态资源访问
		location ~/.*\.(png|jpg|gif|js) {
			# 根目录在Nginx的html/web目录下
			root html/web;
		}
		
		# 首页在Nginx的html/web目录下的index.html
		location / {
			root html/web;
			index index.html index.htm;
		}
		
		# 配置错误页面
		error_page 500 502 503 504	/50x.html;
		location =/50x.html {
			root html;
		}
	}

5、启动测试,访问 http://localhost/index.html 。

假如某个时间点,由于某个原因导致Tomcat后端服务器宕机了,我们再次访问Nginx,会得到如下效果,用户还是能看到页面,只是缺失了访问次数的统计,这就是前后端耦合度降低的效果,并且整个请求只和后端服务器交互了一次,js和images都直接从Nginx返回,提供了效率,降低了后端的服务器的压力。

4、Nginx实现Tomcat集群搭建

在使用Nginx和Tomcat部署项目的时候,我们使用的是一台Nginx服务器和一台Tomcat服务器,效果图如下:

那么问题来了,如果Tomcat真的宕机了,整个系统就不会完整,所以如何解决上述问题,一台服务器宕机,那就多搭建几台Tomcat服务器,这样的话就提升了后端服务器的可用性。这也就是我们常说的集群,搭建Tomcat的集群需要用到Nginx的反向代理和负载均衡的知识,具体如何实现呢?

环境准备:

  • 准备3台Tomcat,使用端口进行区分(实际环境应该是三台服务器),修改server.xml,将端口分别修改为8080、8180、8280;
  • 启动Tomcat并访问测试;

5、Nginx高可用解决方案

针对于上面提到的问题,我们来分析下想要解决上述问题,需要面临哪些问题?

需要两台以上的Nginx服务器对外提供服务,这样的话假如其中一台宕机了,另外一台还能对外提供服务,但是如果是两台Nginx服务器的话,会有两个IP地址,用户该访问哪台服务器,用户怎么知道哪台是好的,哪台是宕机了呢?

5.1、Keepalived

使用Keepalived来解决,Keepalived软件是由C编写的,最初是专为LVS负载均衡软件设计的,Keepalived软件主要是通过VRRP协议实现高可用功能。

5.2、VRRP协议

VRRP(Virtual Route Redundancy Protocol)协议,翻译过来为虚拟路由冗余协议。VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP,而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,MASTER实现针对虚拟路由器IP的各种网络功能。其他设备不拥有该虚拟IP,状态为BACKUP,除了接收MASTER的VRRP状态通告信息以外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。

从上面的介绍信息获取到的内容就是VRRP是一种协议,那这个协议是用来干什么的?

  • 选择协议:VRRP可以把一个虚拟路由器的责任动态分配到局域网上的VRRP路由器中的一台。其中的虚拟路由即Virtual路由群组创建的一个不真实存在的路由,这个虚拟路由也是有对应的IP地址。而且VRRP路由1和VRRP路由2之间会有竞争选择,通过选择会产生一个Master路由和一个Backup路由。
  • 路由容错协议:Master路由和Backup路由之间会有一个心跳检测,Master会定时告知Backup自己的状态,如果在指定时间内,Backup没有接收到这个通知内容,Backup就会替代Master成为新的Master。Master路由有一个特权就是虚拟路由和后端服务器都是通过Master进行数据传递交互的,而备份结点则会直接丢弃这些请求和资源,不做处理,只是去监听Master的状态。

用了Keepalived后,解决方案如下:

5.3、环境搭建

环境准备:

VIPIP主机名主/从
192.168.200.133keepalived1Master
192.168.200.222
192.168.200.122keepalived2Backup

keepalived安装:

1、从官方网站下载keepalived,官网地址https://keepalived.org/
2、将下载的资源上传到服务器
    keepalived-2.0.20.tar.gz
3、创建keepalived目录,方便管理资源
    mkdir keepalived
4、将压缩文件进行解压缩,解压缩到指定的目录
    tar -zxf keepalived-2.0.20.tar.gz -C keepalived
5、对keepalived进行配置,编译和安装
    cd keepalived/keepalived-2.0.20
    ./configure --sysconf=/etc --prefix=/usr/local
    make && make install

安装完成后,有两个文件需要我们认识下,一个是/etc/keepalived/keepalived.conf(keepalived的系统配置文件,我们主要操作的就是该文件),一个是/usr/local/sbin目录下的keepalived,是系统配置脚本,用来启动和关闭keepalived。

5.4、Keepalived配置文件介绍

打开keepalived.conf配置文件。

这里面会分3部分,第一部分是global全局配置,第二部分是vrrp相关配置,第三部分是LVS相关配置。我们重点关注前两部分。

第1台服务器(192.168.200.133)

-global全局部分:
global_defs {
    # 通知邮件,当keepalived发送切换时需要发email给具体的邮箱地址
    nitification_email {
        tom@abc.com
        jerry@abc.com
    }
    # 设置发件人的邮箱信息
    notification_email_from zhangsan@abc.com
    # 指定smtp服务地址
    smtp_server 192.168.200.1
    # 指定smtp服务连接超时时间
    smtp_connect_timeout 30
    # 运行keepalived服务器的一个标识,可以用作发送邮件的主题信息
    router_id keepalived1

    # 默认是不跳过检查,检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是
    # 如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)
    vrrp_skip_check_adv_addr
    # 严格遵守VRRP协议
    vrrp_strict
    # 在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级,默认是0
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.222
    }
}
第2台服务器(192.168.200.122)

-global全局部分:
global_defs {
    # 通知邮件,当keepalived发生切换时需要发email给具体的邮箱地址
    nitification_email {
        tom@abc.com
        jerry@abc.com
    }
    # 设置发件人的邮箱信息
    notification_email_from zhangsan@abc.com
    # 指定smtp服务地址
    smtp_server 192.168.200.1
    # 指定smtp服务连接超时时间
    smtp_connect_timeout 30
    # 运行keepalived服务器的一个标识,可以用作发送邮件的主题信息
    router_id keepalived1

    # 默认是不跳过检查,检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是
    # 如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)
    vrrp_skip_check_adv_addr
    # 严格遵守VRRP协议
    vrrp_strict
    # 在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级,默认是0
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.222
    }
}

5.5、访问测试

1、启动keepalived之前,我们先使用命令 ip a,查看 192.168.200.133和192.168.200.122这两台服务器的IP情况。

2、分别启动两台服务器的keepalived。

cd /usr/local/sbin
./keepalived

再次通过 ip a 查看ip。

3、当把 192.168.200.133 服务器上的keepalived关闭后,再次查看ip。

通过上述的测试,我们发现,虚拟IP(VIP)会在MASTER节点上,当MASTER节点上的keepalived出问题后,因为BACKUP无法收到MASTER发出的VRRP状态通过信息,就会直接升为MASTER。VIP也会“漂移”到新的MASTER。

上面测试和Nginx有什么关系?

我们把192.168.200.133服务器的keepalived再次启动下,由于它的优先级高于服务器192.168.200.122的,所以它会再次成为MASTER,VIP也会“漂移”过去,然后我们再次通过浏览器访问http://192.168.200.222/则会请求192.168.200.133服务器。

如果把192.168.200.133服务器的keepalived关闭掉,再次访问相同的地址,则会骑牛192.168.200.122服务器。

效果实现了以后,我们会发现要想让vip进行切换,就必须把服务器上的keepalived进行关闭,而什么时候关闭keepalived呢?应该是keepalived所在服务器的nginx出现问题后,把keepalived关闭掉,就可以让VIP执行另外一台服务器,但是现在这所有的操作都是通过手动来完成的,我们如何能让系统自动判断当前服务器的nginx是否正确启动,如果没有,要能让VIP自动“漂移”,这个问题该如何解决?

5.6、keepalived之vrrp_script

keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换,但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务,比如Nginx,如果Nginx出现异常了,仅仅keepalived保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换,这个时候,我们可以通过编写脚本对业务进程进行监测监控。

实现步骤:

  1. 在keepalived配置文件中添加对应的配置项;
    vrrp_script 脚本名称
    {
        script "脚本位置"
        interval 3 # 执行的时间间隔
        weight -20 # 动态调整vrrp_instance的优先级
    }
  2. 编写脚本
    ck_nginx.sh:
    
    #!/bin/bash
    num=`ps -C nginx --no-header | wc -l`
    if [ $num -eq 0 ];then
     /usr/local/nginx/sbin/nginx
     sleep 2
     if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
      killall keepalived
     fi
    fi

    Linux ps命令用于显示当前进程(process)的状态。-C(command):指定命令的所有进程;--no-header:排除标题。

  3. 为脚本文件设置权限
    chmod 755 ck_nginx.sh
  4. 将脚本添加到
    vrrp_script ck_nginx {
        script "/etc/keepalived/ck_nginx.sh" # 执行脚本的位置
        interval 2 # 执行脚本的周期,秒为单位
        weight -20 # 权重的计算方式
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 10
        priority 100
        ...
        
        track_script {
            ck_nginx
        }
    }
  5. 如果效果没有出来,可以使用 tail -f /var/log/messages查看日志信息,找对应的错误信息。
  6. 测试

问题思考:通常如果master服务死掉后backup会变成master,但是当master服务又好了的时候master此时会抢占VIP,这样就会发生两次切换读,对业务繁忙的网站来说是不好的。所以我们要在配置文件加入nopreempt非抢占,但是这个参数只能用于state为backup,故我们在用HA的时候最好master和backup的state都设置成backup,让其通过priority来竞争。

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Docker实现Nginx集群搭建,可以按照以下步骤进行操作: 1. 首先,确保已经安装了Docker和Docker Compose。 2. 创建一个用于存放Nginx配置文件的目录,比如`nginx-config`。 3. 在该目录下创建一个`nginx.conf`文件,用于配置Nginx。 ```nginx # nginx.conf events { worker_connections 1024; } http { upstream backend { server backend1; server backend2; server backend3; } server { listen 80; location / { proxy_pass http://backend; } } } ``` 这个配置文件中定义了一个名为`backend`的上游服务器池,其中包含了3个后服务器。 4. 在同一目录下创建一个名为`docker-compose.yml`的文件,用于定义Docker容器。 ```yaml # docker-compose.yml version: '3' services: nginx: image: nginx ports: - 80:80 volumes: - ./nginx-config/nginx.conf:/etc/nginx/nginx.conf depends_on: - backend1 - backend2 - backend3 backend1: image: <your_backend_image> backend2: image: <your_backend_image> backend3: image: <your_backend_image> ``` 在这个文件中,我们定义了一个Nginx服务和3个后服务Nginx服务使用Nginx官方提供的镜像,并将80口映射到主机的80口。Nginx容器还挂载了之前创建的`nginx.conf`文件作为配置文件。后服务可以使用自己的后镜像进行定义。 5. 创建并启动容器集群。 在终中,定位到存放`docker-compose.yml`文件的目录,并运行以下命令: ```bash docker-compose up -d ``` 这将会启动Nginx和后服务的容器。 现在,你已经成功使用Docker搭建了一个简单的Nginx集群。可以通过访问`http://localhost`来测试该集群的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值