Redis管理Session+Nginx负载均衡+Docker+Tomcat

僤鯓⒐⒋嵵緔 提交于 2019-11-27 10:34:23

本文是一篇关于技术整合的文章,以一个Web应用为例,使用Docker容器来部署我们的应用,并将Session交给Redis来存储和管理,涉 及到Docker/Redis/Tomcat/Nginx/Spring Web/Spirng Web MVC等技术。其中:
Docker——容器技术或虚拟化技术,可以将我们的application及相关依赖打包到一个容器内,方便移植、集群部署,容器完全使用沙箱机制,容 器之间互不影响完全独立。下文所有的server都是部署在Docker中,不了解Docker和相关操作的可以先看看这篇文章。

Redis——一种开源的,先进的 key-value 存储数据库,可用于构建高性能、可扩展的 Web 应用程序的解决方案。本文中用来存储和管理Session。

Nginx——高性能的HTTP和反向代理服务器。本文中用来做负载均衡。

部署结构如下图所示:

环境信息

系统版本:CentOS 7
JDK版本:jdk1.8.0_60
Apache Tomcat版本:6.0.44
Docker版本:1.7.1
Redis版本:3.2.1
Nginx版本:1.10.1
本文中宿主机IP:192.168.111.128

注:下文中相关技术的详细信息不重复说明了,需要的可以去官网查询。
 

Docker篇

1.安装与配置

这个过程不说了,省略1000字……(看前面发的文章
http://my.oschina.net/buran/blog/657690

2.Docker设置代理——不需要设置代理的,可以跳过

vi /etc/sysconfig/docker

添加如下配置,替换上你自己的代理地址即可:
# proxy setup
http_proxy="YOUR_PROXY_ADDR"
https_proxy="YOUR_PROXY_ADDR"

3.启动Docker服务

service docker start
没有报错,说明启动成了。

Redis篇

如何在docker容器中部署一个Redis服务呢?

1.获得一个包含Redis的镜像

可以自己制作一个包含Redis的镜像。或者你可以查找docker hub上是否有我们需要的镜像。

查找镜像:

docker search redis

发现有一个,我们可以直接拿来用,然后拉取远程镜像到本地:

docker pull docker.io/redis

2.启动镜像并启动Redis Server

运行并绑定端口到宿主机端口(本文以8888为例),两种方法:

方法1:
docker run -i -t --name redis-server-01 -p 8888:6379 -v /opt/conf/redis.conf:/usr/local/etc/redis/redis.conf docker.io/redis /bin/bash
再执行:
redis-server /usr/local/etc/redis/redis.conf &

我比较喜欢这种方式,因为比较方便,可以让redis启动后在后台运行,然后可以做其他的操作。方法2不能退出redis的shell,退出了redis就关闭了。

方法2:
docker run -i -t --name redis-server-01 -p 8888:6379 -v /opt/conf/redis.conf:/usr/local/etc/redis/redis.conf docker.io/redis redis-server /usr/local/etc/redis/redis.conf

注意:
Centos7中由于selinux的问题,可能有权限问题,HOST目录挂载到Container后无法访问,解决方法:
添加selinux安全规则,在host上执行chcon -Rt svirt_sandbox_file_t /hostdir

本例中为:chcon -Rt svirt_sandbox_file_t /opt/conf

3.Redis容器启动完成

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES

7cee5346b83a        docker.io/redis     "docker-entrypoint.s   2 minutes ago       Up 2 minutes        0.0.0.0:8888->6379/tcp   redis-server-01

可以用telnet来验证Redis是否启动成功,执行一下SET/GET操作:
telnet 192.168.111.128 8888

相关telnet操作命令见这里(http://blog.sina.com.cn/s/blog_62b832910100uvsu.html)。

Tomcat篇

要用Tomcat来存储Session,我们需要用到tomcat-redis-session-manager,Git主页(https://github.com/jcoleman/tomcat-redis-session-manager.git),详细的介绍自己去看吧,这里不多说了。

1.编译tomcat-redis-session-manager

下载Project到本地编译,生成jar文件:
git clone https://github.com/jcoleman/tomcat-redis-session-manager.git


此外需要依赖jedis和commons-pool2,我用的版本分别是2.5.0和2.0,视情况可以依赖你自己需要的版本,如果遇到问题编译不通过可以修改Project的相应代码,才5个Class,看了一下修改也不难。

2.配置Tomcat

要用Redis来存储和管理Session,我们需要修改content.xml,来改变Tomcat

的Session管理方式,如下:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /><Manager className="com.radiadesign.catalina.session.RedisSessionManager"  
    host="172.17.0.3"
    port="6379"
    database="0"
    maxInactiveInterval="120" />

Redis服务器地址和端口、Session有效时间按自己需要配置。

3.在容器内部署Tomcat

主要以下几个步骤:

2.1.   复制上面提到的jar文件到{Tomcat}/lib目录

tomcat-redis-session-manager.jar
jedis-2.5.0.jar
commons-pool2-2.0.jar

2.2.   部署Tomcat到Docker容器内。

首先,把需要的文件准备好,并挂载倒容器里去(参考:dock run -v)。
然后,复制Tomcat到容器里面去。
最后,可以把配置好的容器commit为image,这样方便以后使用。
    docker commit YOU_CONTAINER_ID IMAGE_NAME
    例如:docker commit 5954aa3698b2 webdc.with.redismanager

4.启动容器和Tomcat

首先,以交互的方式启动容器:
docker run --name application-server-01 -i -t -p 9001:8080 -v /root/webapps/:/opt/apache-tomcat-6.0.44/webapps/ webdc.with.redismanager /bin/bash

然后启动Tomcat:
cd {Container Tomcat Path}/bin
./startup.sh.

OK了,看看Server是不是正常启动了:

http://192.168.111.128:9001/registerandlogin
其中,-p 9001:8080 端口映射只是为了方便操作而已,不是必须的。
 

5. 扩展

除了Redis外,你也可以用MongoDB或者Memcached来存储和管理Session:

MongoDB存储Tomcat Session:
https://github.com/simplicityitself/Mongo-Tomcat-Sessions

Memcached存储Tomcat Session
https://code.google.com/archive/p/memcached-session-manager/

Nginx篇

本文用Nginx来做负载均衡用,Nginx安装在宿主机上。

1.安装

下载对应当前系统版本的nginx包(package)

wget  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

建立nginx的yum仓库

rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm

下载并安装nginx

yum install nginx

启动nginx服务

systemctl start nginx
或者
service nginx start

2.测试,看看Nginx是否安装正确

在浏览器地址栏中输入部署nginx环境的机器的IP:
http://192.168.111.128/
不出意外的话,应该能看到如下字样的内容:

Welcome to nginx!

如果不能的话看看有什么错误,服务是否启动,防火墙是否阻止了访问等等。

3.负载均衡配置

本文用Nginx做负载均衡之用,下面来看看怎么配置:
vi /etc/nginx/nginx.conf

在http段里面加上如下配置:
# 设置负载均衡列表
upstream registerandlogin {

  server 172.17.0.6:8080;
  server 172.17.0.7:8080;
  server 172.17.0.8:8080;

}

server {

  listen  80;
  server_name 192.168.111.128; #我没有用域名,所以直接写IP了
  # /表示匹配任何请求,当然本例中你可以写/registerandlogin 
  location / {
    //将所有请求转发到registerandlogin 负责均衡列表 配置的server中去
    proxy_pass http://registerandlogin;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  access_log /var/log/nginx/registerandlogin.access.log main;
}
 

4. 验证负载均衡配置是否正确
来,溜一个,看看是否配置正确,在浏览器访问:
http://192.168.111.128/registerandlogin/
没压力,正常跑起来了(registerandlogin是为了测试用,随便写的一个注册登录功能,会一起上传)。
192.168.111.128是Nginx server,请求最终会转发到上面配置的3个application server去。

至此,整合过程已经完成,下面看看目前为止我们的各个容器的基本信息:
[root@localhost ~]# docker inspect -f 'Container IP :{{.NetworkSettings.IPAddress}}, and name is :{{.Name}}' `docker ps -q`

Container IP :172.17.0.8, and name is :/application-server-03
Container IP :172.17.0.7, and name is :/application-server-02
Container IP :172.17.0.6, and name is :/application-server-01
Container IP :172.17.0.3, and name is :/redis-server-01

整合配置过程的关键步骤上文都有记录,各个模块的详细配置并没有深入,比如:
1、Redis的优化及集群配置。
2、Tomcat的优化。
3、Nginx优化、静态资源分离等等。

有时间再来详细的扒拉扒拉这些吧

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!