Tomcat(三) Tomcat安装配置:
Tomcat+Nginx+keepalived 实现动静分离、Session会话保持的高可用集群
在前文《Tomcat(一) Tomcat是什么》 以及 《Tomcat(二) Tomcat实现》中,了解到了Tomcat的配置及技术实现,而在《nginx+keepalived 实现主备+双主热备模型的高可用负载均衡代理服务》等Nginx系列文章中了解到了Nginx的配置。
下面将在这些的基础上,先安装Tomcat,再进行配置Tomcat+Nginx+keepalived 的动静分离的高可用集群,最后再配置Tomcat集群,实现Session会话保持。
1、各服务器主机系统:CentOS 6.4 x86_64
2、反向代理服务器:
node1: IP:192.168.18.241 (host name:node1.tjiyu.com);
node2: IP:192.168.18.242 (host name:node2.tjiyu.com);
VIP1:192.168.18.240;
VIP2:192.168.18.250;
service:nginx 1.10.2 提供反向代理、负载均衡服务;
keepalived 为nginx(VIP)提供高可用服务;
3、后端三台realserver:
realserver1:
IP:192.168.18.251 (host name:realserver1.tjiyu,com);
Service:nginx 1.10.2 提供静态内容WEB服务
realserver2:
IP:192.168.18.252 (host name:realserver2.tjiyu.com);
Service:tomcat 8.5.9 处理动态请求
realserver3:
IP:192.168.18.252 (host name:realserver3.tjiyu.com);
Service:tomcat 8.5.9 处理动态请求
各主机需要做以下准备:
1、配置IP、关闭防火墙/SELINUX;
2、时间同步;
3、配置节点名称(不是必须的,最好配置上,方便操作)
在前面《heartbeat v2 haresource 配置可用集群》说到的高可用集群已有详细介绍,这里就不再给出了。
关于nginx和keepalived的相关配置可以参考前面的一些文章,如:
Keepalived:《keepalived 及 keepalived配置LVS高可用集群》;
Nginx:《nginx详解》、《nginx编译安装 及 配置WEB服务》、《nginx配置:反向代理 负载均衡 后端健康检查 缓存》;
下面主要是以《nginx+keepalived 实现主备+双主热备模型的高可用负载均衡代理服务》这篇文章配置的nginx+keepalived双主模型反向代理两台nginx Web服务器的高可用集群为基础,把realserver2改为tomcat服务动态请求,以及增加一台realserver3的tomcat,所以keepalived的配置是不变的,需要改动的是nginx中的一些配置。
下面我们用到nginx和keepalived里面的一些配置,不过会再重新给出说明,而是以配置tomcat服务为主。
前面文章曾介绍过Tomcat本质上是一个Java语言编写的程序,需要Java类库及运行环境,即需要先安装JDK;先看Tomcat版本可以使用JDK版本范围是多少,再到Orcale官网上选择适合的版本下载,这里使用tomcat-8.5.9版本,可以使用最新的jdk-8u112版本,最终下载的是jdk-8u112-linux-x64.rpm,官网下载地址如下:http://www.oracle.com/technetwork/java/javase/downloads/index.htm
下载后放到realserver2(realserver3同理),开始安装,默认安装到/usr/java目录下,过程如下:
[root@realserver2 soft]# ls [root@realserver2 soft]# rpm -ih jdk-8u112-linux-x64.rpm [root@realserver2 soft]# cd /usr/java/ [root@realserver2 java]# ll
配置环境变量"JAVA_HOME",如下:
[root@realserver2 java]# vim /etc/profile.d/java.sh [root@realserver2 java]# cat /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH [root@realserver2 java]# . /etc/profile.d/java.sh
测试查看JDK以主Java虚拟机的版本,一切正常,如下:
[root@realserver2 java]# java -version
可以到官网上选择需要的版本下载,这里使用tomcat-8.5.9版本,下载地址如下:http://tomcat.apache.org/download-80.cgi
下载后放到主机上,开始安装:先解压到"/usr/local"目录下,然后为解压后的Tomcat目录创建一个简单的连接,如下:
[root@realserver2 soft]# ll apache-tomcat-8.5.9.tar.gz [root@realserver2 soft]# tar -xf apache-tomcat-8.5.9.tar.gz -C /usr/local/ [root@realserver2 soft]# cd /usr/local/ [root@realserver2 local]# ln -sv apache-tomcat-8.5.9 tomcat
配置环境变量"CATALINA_HOME",如下:
[root@realserver2 local]# vim /etc/profile.d/tomcat.sh [root@realserver2 local]# cat /etc/profile.d/tomcat.sh export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH [root@realserver2 local]# . /etc/profile.d/tomcat.sh
查看版本,启动测试,可以看到Tomcat启动后监听了三个端口,其中"8080"是HTTP请求端口,如下:
[root@realserver2 local]# catalina.sh version [root@realserver2 local]# catalina.sh start [root@realserver2 local]# netstat -tunlp | grep java
在client端浏览器访问安装的Tomcat:http://192.168.18.252:8080,可以看到Tomcat自身提供的信息及管理页面,如下:
在Tomcat提供的"catalina.sh"脚本基础上,为Tomcat提供SysV脚本,方便使用、管理,如下:
[root@realserver2 ~]# vim /etc/rc.d/init.d/tomcat [root@realserver2 ~]# cat /etc/rc.d/init.d/tomcat #!/bin/sh # Tomcat init script for Linux. # # chkconfig: 2345 96 14 # description: The Apache Tomcat servlet/JSP container. JAVA_HOME=/usr/java/latest CATALINA_HOME=/usr/local/tomcat export JAVA_HOME CATALINA_HOME #exec $CATALINA_HOME/bin/catalina.sh $* start() { $CATALINA_HOME/bin/catalina.sh configtest &> /dev/null if [ $? -ne 0 ];then echo "Error in configuration file,check with tomcat configuration file." exit 5 fi if pidof java &> /dev/null;then echo "Tomcat is running...." exit 4 else exec $CATALINA_HOME/bin/catalina.sh start fi } stop() { pidof java &> /dev/null if [ $? -ne 0 ];then echo "Tomcat is stoped..." else $CATALINA_HOME/bin/catalina.sh stop fi } configtest() { pidof java &> /dev/null if [ $? -eq 0 ];then echo "Tomcat is running,please stop the test." exit 3 else exec $CATALINA_HOME/bin/catalina.sh configtest fi } version() { exec $CATALINA_HOME/bin/catalina.sh version } case $1 in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; configtest) configtest ;; version) version ;; *) echo "Usage: `basename $0` {start|stop|restart|configtest|version}" exit 1 ;; esac [root@realserver2 ~]# chmod +x /etc/rc.d/init.d/tomcat [root@realserver2 ~]# chkconfig --add tomcat [root@realserver2 ~]# chkconfig tomcat --list [root@realserver2 ~]# service tomcat version
同理在realserver3上也安装Tomcat。
配置两台反向代理服务器node1和node2上的Nginx配置文件"/etc/nginx/nginx.conf",配置过程如下:
[root@node1 ~]# vim /etc/nginx/nginx.conf [root@node1 ~]# service nginx reload [root@node1 ~]# scp /etc/nginx/nginx.conf root@node2:/etc/nginx/
配置文件内容如下:
#user nobody; worker_processes 2; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream appserver { #定义名为webserver的负载均衡组,在下面proxy_pass引用 #ip_hash; #ip_hash负载均衡策略,注意,当下面定义代理服务器为backu时,当后端服务器重新上线时,不能进行正常转发 least_conn; #最少连接负载均衡策略 #least_time last_byte; #最少响应时间策略,商业版本 server 192.168.18.252:8080 weight=1 max_fails=2 fail_timeout=2; #realserver1 权重2/两次检测失败,不向其转发/检查超时两秒为失败 server 192.168.18.253:8080 weight=1 max_fails=2 fail_timeout=2; #realserver2 server 127.0.0.1:8080 weight=1 backup; #指定代理服务器自身作为备份server,当所有后端服务器都宕机时,对外提供维护提示页面 } #定义一个完整的缓存空间; 缓存数据存储在/data/nginx/cache目录中/配置在该目录下再分两层目录/键(元数据)存放的内存空间,名称为one(proxy_cache引用),10m内存空间大小/最大缓存数据磁盘空间的大小/10m未被访问的缓存数据将从缓存中删除 #proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m max_size=1G inactive=10m; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #add_header X-Cache "$upstream_cache_status form $server_addr"; #给请求响应增加一个头部信息,表示从服务器上返回的cache状态怎么样(有没有命中) #除去下面的静态内容,默认都为动态请求 location / { proxy_pass http://appserver; #引用上面定义的tomcat负载均衡组 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#$remote_addr; #代理转发的请求头部增加"X-Forwarded-For"客户端地址 } #页面静态内容 location ~ .*\.(html|js|css)$ { proxy_pass http://192.168.18.251; #代理到192.168.18.251 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#$remote_addr; #代理转发的请求头部增加"X-Forwarded-For"客户端地址 expires 12h; # proxy_cache one; #引用上面定义上的缓存空间,同一缓存空间可以在几个地方使用 #proxy_cache_valid 200 302 10m; #proxy_cache_valid 404 1m; #对代码200和302的响应设置10分钟的缓存,对代码404的响应设置为1分钟: } #图片静态内容 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { proxy_pass http://192.168.18.251; #代理到192.168.18.251 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#$remote_addr; #代理转发的请求头部增加"X-Forwarded-For"客户端地址 expires 30d; } } server { #定义虚拟主机,当所有后端服务器都宕机时,使得代理服务器自身可以对外提供维护提示页面 listen 8080; server_name localhost; root /data/web/errorpage; index index.html; } }
另外,可以为静态内容配置缓存,当然缓存量比较大还可以加一台varnish缓存服务器,这里就不再多介绍了。
为测试配置效果,我们准备了一个Java Web测试程序,为realserver2/3两台Tomcat应用服务器都部署这个Java Web程序,程序URI为"/api/test",返回服务器名称和Session ID,其中并没有HTML页面文件等静态内容,如下:
@WebServlet("/test") public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String host = request.getLocalName(); String sessionId = request.getSession().getId(); response.getWriter().print("{host:"+host + ",sessionId:" + sessionId +"}"); } }
而我们的静态文件,如html/js/图片,就放到realserver1的Nginx WEB服务器中,这个页面中主要是通过AJAX来请求上面Tomcat部署的Java WEB应用,把返回结果显示在页面上,如下:
[root@realserver1 web]# ls jquery-1.9.1.min.js page.html test.js tomcat.png [root@realserver1 web]# cat page.html
tomcat+nginx测试 请求结果:
[root@realserver1 web]# cat test.js var g_Url = "/api/test"; function requestApi() { $.get(g_Url,function(data,status){ $("ol").append(data ); }); [root@realserver1 web]#
部署完成后,通过Client端浏览器分别访问测试,一切正常,如下:
我们通过VIP访问page.html页面:http://192.168.18.240/page.html,这时node节点的Nginx反向代理到realserver1的Nginx WEB服务器,返回部署的页面及图片等;然后点击页面上的动态请求按键,发出动态请求:http://192.168.18.240/api/test,可以看到代理到了realserver2/3两台Tomcat应用服务器中,并返回结果,如下:
从上面测试结果可以看到,每次请求Tomcat返回的Session ID都不一样,即无法保持会话,前面文章也介绍过了,Tomcat是可以通过自身的Cluster等组件来配置成集群,并且有几种Tomcat Session Manager组件可以使集群会话得以保持,还可以用Mencache缓存服务器来保存Tomcat Session。
下面使用DeltaManager的会话管理组件来配置,在realserver2/3两台Tomcat的配置文件server.xml的Engine组件标签中分别添加相同的内容,如下:
然后再部署的Java WEB应用程序的web.xml中添加"
"标签,如下:
重启两台Tomcat后,再次测试,可以看到不同客户端的访问,有不同Session ID,但同一客户端的Session ID都保持一样,如下:
到这里,我们完成了安装Tomcat,配置tomcat+nginx+keepalived 的动静分离的高可用集群、配置Tomcat集群实现Session会话保持……
【参考资料】
1、nginx官网文档:http://nginx.org/en/docs/
2、Apache Tomcat User Guide:http://tomcat.apache.org/tomcat-8.5-doc/index.html
3、Apache Tomcat 8 Configuration Reference:ttp://tomcat.apache.org/tomcat-8.5-doc/config/index.html
4、nginx+keepalived 实现主备+双主热备模型的高可用负载均衡代理服务