Windowsx下实现nginx+redis+tomcat反向代理、负载均衡、session共享

在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新。但这可能会出现一些状况:

  1. 用户还在操作,被强迫终止了,这样会导致客户降低对系统满意度、公司能力怀疑。
  2. 不知道的用户可能会想网站是不是被攻击了,降低了对网站的信任程度,从而导致失去部分潜在客户,这点尤其对金融互联网公司不利。

在查了一些资料后,决定采用Tomcat + Nginx + Redis来实现负载均衡和session共享。下面记录下我的实践过程,如有错误不足之,欢迎指点。

准备文件:

1.nginx-1.15.6
2.redis-2.8.21
3.tomcat7
4.tomcat集成redis所需jar包(tomcat-redis-session-manager1.2.jar、jedis-2.5.1.jar、commons-pool2-2.0.jar)
5.dtjl项目

1.Nginx简单介绍及开启

Nginx是一款轻量级兼备高性能的Http和反向代理服务器。所谓反向代理就是指在用户发起访问请求,由代理服务器接收,然后将请求转发给正式服务器,并且将正式服务器处理完的数据返回给客户端,此时代理服务器就表现为一个服务器。这么做看起来多经过了一步,稍显麻烦,但实则是好处多多,在下面的demo中我会将其体现出来。

首先我们去Nginx官网下载个Nginx,我这是在自己电脑上,所以当然下载的是windows版本的。下载完成后直接放在某个盘中即可,不需要安装。接下去我们打开cmd,进入nginx的目录下,输入start nginx

 

 

我们可以看到一个窗口一闪而过,这样nginx就已经被开启了,我们在任务管理器中可以找到它的进程。

现在我们在浏览器中输入localhost。可以看到出现一个页面,虽然简陋了点,但这确确实实就是nginx的欢迎页面,就类似tomcat刚启动完成的locahost:8080的欢迎页面。

 

 

2.使用Nginx实现反向代理

现在我们搭建一个基于简单的MVC项目,搭建过程不加以赘述。功能很简单,就是能实现负载均衡和session共享,当然也可以使用别的框架。

运行demo,我这tomcat端口是8081,在浏览器输入localhost:8081,出现我们的页面。

 

 

这时我们还是直接访问tomcat服务器的,现在我想通过nginx访问tomcat,即输入localhost就能显示我们demo的页面。

这就要我们去修改nginx的核心配置文件,在其目录下的conf文件夹下的nginx.conf文件,那么首先我们就要了解该文件中一些节点的作用。

· worker_processes:工作进程个数,可配置多个
· worker_connections:单个进程最大连接数
· server:每一个server相当于一个代理服务器
· lister:监听端口,默认80
· server_name:当前服务的域名,可以有多个,用空格分隔(我们是本地所以是localhost)
· location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
· index:当没有指定主页时,默认会选择这个指定的文件,可多个,空格分隔
· proxy_pass:请求转向自定义的服务器列表
· upstream name{ }:服务器集群名称

 

 

  • 知道了节点作用后,我们就知道我们需要修改的文件中的server部分,这是它原有的代码,我删除了它注释部分。现在我们就能明白为什么输入localhost,它访问的是它欢迎页面即index.html。

 

  • 如果需要将默认地址指向指定服务器,如指向localhost:8081,则只需要做一处小小的修改即可。

 

图片

  • 随后在cmd中输入命令nginx-s reload即可重启nginx。重启后,我们再输入localhost,可以看到跳转到的页面是我们demo的。

图片

 

 

 

这样,nginx实现反向代理已完成,这样所有请求都需经过代理服务器才能访问到正式服务器,某种程度上可以保护网站安全。

3.使用Nginx实现负载均衡

  负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中。

  负载均衡的优势在访问量少或并发小的时候可能并不明显,且不说淘宝双11、铁道部抢票这种级别的访问量、高并发,就是一般网站的抢购活动时,也会给服务器造成很大压力,可能会造成服务器崩溃。而负载均衡可以很明显的减少甚至消除这种情况的出现,下面我们说说实现方法。

    首先我们再开启一个tomcat服务器,这里区分一下就叫tomcat-8082吧,原先的叫tomcat-8081。将tomcat-8081上的项目,拷贝到tomcat-8082上,稍微修改下页面上的文字以便等下区分我们的请求被分发到了哪个tomcat上。tomcat-8082端口我这里为8082。在浏览器中输入localhost:8082。

 

服务器准备好了,我们要在server外部定义个服务器集群,即用到了上文中提到的upstream 标签。服务器集群名字取为localhost。其中weight是用来配置集群负载比,即访问概率的大小。

注意:tomcat项目集群时,必须设置tomcat为默认访问,集群不能加上项目名称,否则nginx无法启动或者报错。

到tomcat的conf目录下,找到server.xml文件,加上以下这段话

<Contextpath="" docBase="D:\file\tomcat\tomcat7-8081\webapps\dtjl"debug="0" reloadable="true"/>,效果如下

 

 

 

同时我们需要再修改下server,将定向的路径转到问你服务器集群上。可以通过proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout配置访问超时限制条件。

 

 

 

 

重启下nginx,在浏览器输入localhost,再多刷新几次,可以看到两个页面在来回切换。

 

 

 

4、使用redis做session共享

下载windows的绿色版版的redis-2.8.21,将下载的文件解压到指定文件夹下。

 

 

 

通过cmd打开命令窗口,通过cd命令进入到redis解压路径下,输入redis-server redis.window.conf,启动redis.启动成功的结果如下图所示:

 

 

 

将tomcat-redis-session-manager1.2.jar、jedis-2.5.1.jar、commons-pool2-2.0.jar三个jar包放入tomcat的lib包里面,分别配置tomcat的session共享,找到tomcat的conf文件夹下的context.xml文件,在该文件上加上如图所示的这段话。其中password是redis的默认密码,port是redis的默认端口。

 

 

 

以下是上述这段代码配置:

<!-- tomcat-redis-session共享配置 -->   <ValveclassName="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/> 
<ManagerclassName="com.orangefunction.tomcat.redissessions.RedisSessionManager" 
        host="localhost"  
        port="6379"
        password="123456"
        database="0"  
        maxInactiveInterval="60" />

 

重启tomcat-8081和tomcat-8082,一直刷新之后,可以看到两个服务器的session是一致的。这样我们就达到了session共享了。

 

 

注意:启动顺序必须先启动nginx,再启动redis,最后才启动两个tomcat,否则无法实现负载均衡、session共享。

至此,我们的nginx+redis+tomcat实现反向代理、负载均衡、session共享就已经实现了!

demo下载地址:

  链接:https://pan.baidu.com/share/init?surl=btBIMWnL6v3720PcZbaJ5g

  提取码:6tni 

 

posted @ 2021-09-17 09:35  IT民工郑小江  阅读(452)  评论(0编辑  收藏  举报