续我的上上篇博文:https://mp.csdn.net/postedit/89671939。即Nginx(OpenResty)已经搭建部署好。
一、Tomcat简介:
- Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
- 诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式,Tomcat一般处理动态页面而处理静态HTML的能力不如Apache服务器。
二、实验环境(rhel6.5版本)
主机环境:rhel6.5 selinux 和iptables 都必须是disabled状态
各主机信息
主机名 | IP | 服务 |
---|---|---|
server1 | 172.25.83.1 | Nginx(OpenResty),tomcat,memcached |
server2 | 172.25.83.2 | tomcat,memcached |
三、Tomcat的安装与配置
安装包:
apache-tomcat-7.0.37.tar.gz
jdk-7u79-linux-x64.tar.gz
1、下载tomcat安装包和jdk(java)并解压
[root@server1 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@server1 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
2、制作软链接,便于管理更新
[root@server1 local]# ln -s apache-tomcat-7.0.37/ tomcat
[root@server1 local]# ln -s jdk1.7.0_79/ java
[root@server1 local]# ls
apache-tomcat-7.0.37 games jdk1.7.0_79 libexec sbin tomcat
bin include lib lnmp share
etc java lib64 openresty src
3、更改环境变量并刷新
[root@server1 local]# vim /etc/profile #在该文件的最后加入下面的内容。
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
[root@server1 local]# source /etc/profile #刷新
4、测试java
[root@server1 local]# cd ~
[root@server1 ~]# vim test.java
public class test {
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
[root@server1 ~]# javac test.java #生成test.class文件
[root@server1 ~]# java test
Hello World!
5、开启Tomcat服务
[root@server1 ~]# cd /usr/local/tomcat/bin/ #进到bin目录下执行脚本
[root@server1 bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@server1 bin]# netstat -antulpe | grep 8080 #查看tomcat的监听端口8080是否已经打开
tcp 0 0 :::8080 :::* LISTEN 0 299176 20934/java
6、测试tomcat
网页输入:172.25.83.1:8080,即可访问到tomcat的默认发布页
7、更改nginx配置文件并重新加载nginx服务
[root@server1 bin]# cd /usr/local/openresty/nginx/conf/
[root@server1 conf]# vim nginx.conf
75 location ~ \.jsp$ { #将该location模块的注释去掉,并改为如下的内容
76 proxy_pass http://127.0.0.1:8080;
77 }
[root@server1 conf]# cd ../sbin/
[root@server1 sbin]# pwd
/usr/local/openresty/nginx/sbin
[root@server1 sbin]# ./nginx -s reload #sbin目录下
8、编辑nginx(OpenRestry)的默认发布目录下index.jsp文件
[root@server1 sbin]# cd ../html/
[root@server1 html]# pwd
/usr/local/openresty/nginx/html
[root@server1 html]# ls
50x.html example.php index.html index.php
[root@server1 html]# vim index.jsp
the time is: <%=new java.util.Date() %>
9、网页测试
网页输入:172.25.83.1/index.jsp,即可访问到tomcat发布网页index.jps
四、实现server1与server2的tomcat负载均衡
配置server2:
1、拷贝server1上tomcat与java的解压目录到server2上
[root@server2 ~]# scp -r root@server1:/usr/local/tomcat /usr/local/
[root@server2 ~]# scp -r root@server1:/usr/local/java /usr/local/
2、同样更改环境变量并刷新
[root@server2 local]# vim /etc/profile #在该文件的最后加入下面的内容
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
[root@server2 local]# source /etc/profile #刷新
3、开启tomcat
[root@server2 local]# cd /usr/local/tomcat/bin/
[root@server2 bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@server2 bin]# netstat -antulpe | grep 8080 #查看tomcat监听的端口8080是否已经打开
tcp 0 0 :::8080 :::* LISTEN 0 12155 1360/java
4、测试tomcat
网页输入:172.25.83.2:8080,即可访问到tomcat的默认发布页
配置server1:
1、修改nginx配置文件
[root@server1 html]# cd /usr/local/openresty/nginx/conf/
[root@server1 conf]# vim nginx.conf
24 upstream tomcat { #在http模块中添加24-27行的内容
25 server 172.25.83.1:8080;
26 server 172.25.83.2:8080;
27 }
80 location ~ \.jsp$ { #将之前编写的该locatiom模块进行修改,修改之后的内容如下
81 proxy_pass http://tomcat;
82 }
2、重新加载配置文件
[root@server1 conf]# cd /usr/local/openresty/nginx/sbin/
[root@server1 sbin]# ./nginx -s reload
3、编写测试文件test.jsp
[root@server1 sbin]# cp /usr/local/openresty/nginx/html/index.jsp /usr/local/tomcat/webapps/ROOT/test.jsp
[root@server1 sbin]# cat /usr/local/tomcat/webapps/ROOT/test.jsp
the time is: <%=new java.util.Date() %>
接着配置server2:
5、将server1端编写好的test.jsp文件发送到server2端的/usr/local/tomcat/webapps/ROOT/目录下,并修改test.jsp文件
[root@server1 ROOT]# scp test.jsp root@172.25.83.2:/usr/local/tomcat/webapps/ROOT/
[root@server2 ~]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
server2 the time is: <%=new java.util.Date() %>
测试:
网页输入172.25.83.1/test.jsp,不断刷新页面,轮询出现server1与server2上test.jsp网页
当server1和server2中有一端的tomcat服务挂掉之后,访问时不再轮循,只能访问到tomcat服务正常的那一端(这里以server2端的tomcat服务挂掉为例)
[root@server2 ~]# cd /usr/local/tomcat/bin/
[root@server2 bin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@server2 bin]# netstat -antulpe | grep 8080 #tomcat服务对应的8080端口已经关闭
刷新web界面,看到的仍然是这个界面
至此,server1与server2的tomcat负载均衡已经实现
开启server2端的tomcat服务,以免影响后续的实验
[root@server2 bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@server2 bin]# netstat -antulpe | grep 8080
tcp 0 0 :::8080 :::* LISTEN 0 12759 1443/java
五、session共享(交叉存储)
1、什么是session?
- 在计算机专业术语里:session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册入系统到注销系统之间所经过的时间以及如果需要的话,可能还有一定操作空间。
- session技术则是服务端的解决方案,它是通过服务器来保持状态的。由于Session这个词汇包含的语义很多,因此需要在这里明确一下 Session的含义。首先,我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session。从这个语义出发,我们会提到Session持续的时间,会提到在Session过程中进行了什么操作等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。从这个语义出发,我们则会提到往Session中存放什么内容,如何根据键值从 Session中获取匹配的内容等。要使用Session,第一步当然是创建Session了。那么Session在何时创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。
2、sessioin的部署:
(1)server1与server2编写测试页面文件test1.jsp
[root@foundation83 Desktop]# scp test1.jsp root@172.25.83.1:/usr/local/tomcat/webapps/ROOT #从我的真机拷贝次文件到指定目录
[root@foundation83 Desktop]# scp test1.jsp root@172.25.83.2:/usr/local/tomcat/webapps/ROOT
[root@server1 ROOT]# pwd
/usr/local/tomcat/webapps/ROOT
[root@server1 ROOT]# cat test1.jsp #这是一个简单的用户信息提交页面
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
(2)关闭之前的nginx
[root@server1 ROOT]# cd /usr/local/openresty/nginx/sbin/
[root@server1 sbin]# ./nginx -s stop
[root@server1 sbin]# netstat -antulpe | grep 80 #监听端口80已经关闭
(3)下载旧版本的nginx(因为旧版本的nginx支持sticky(交叉存储)模块)并解压
软件包:nginx-1.10.1.tar.gz
[root@server1 sbin]# cd
[root@server1 ~]# tar zxf nginx-1.10.1.tar.gz
(4)隐藏版本号与关闭debug日志
[root@server1 nginx-1.10.1]# vim src/core/nginx.h
14 #define NGINX_VER "nginx/"
[root@server1 nginx-1.10.1]# vim auto/cc/gcc #将179行注释
178 # debug
179 #CFLAGS="$CFLAGS -g"
(5)编译安装nginx
由于需要sticky模块,所以需要下载该模块的安装包:nginx-sticky-module-ng.tar.gz
[root@server1 nginx-1.10.1]# cd
[root@server1 ~]# tar zxf nginx-sticky-module-ng.tar.gz
[root@server1 ~]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/nginx \ #预编译
> --with-http_ssl_module \
> --with-http_stub_status_module \
> --with-threads \
> --with-file-aio \
> --add-module=/root/nginx-sticky-module-ng
[root@server1 nginx-1.10.1]# make && make install #编译与安装
(6)更改nginx配置文件
[root@server1 nginx-1.10.1]# vim /usr/local/nginx/conf/nginx.conf
19 upstream tomcat { #在http模块中加入如下的19-23行的内容
20 sticky; #sticky模块
21 server 172.25.83.1:8080;
22 server 172.25.83.2:8080;
23 }
66 location ~ \.jsp$ { #将server模块中的这个location模块的注释去掉,并进行修改,修改之后的内容如下
67 proxy_pass http://tomcat;
68 }
(7)检测语法是否有误,无误后开启nginx
[root@server1 nginx-1.10.1]# /usr/local/nginx/sbin/nginx -t
[root@server1 nginx-1.10.1]# /usr/local/nginx/sbin/nginx
[root@server1 nginx-1.10.1]# netstat -antulpe | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 303878 24334/nginx
(8)网页测试:
此时提交后不会交替接收,可以一直存于某一个服务器,这样数据就不容易丢失。(这就是sticky模块的作用)
修改/usr/local/tomcat/webapps/ROOT/test1.jsp文件,将其中的test.jsp该为test1.jsp,否则在web界面填入name和key值之后,点击Submit Query之后,会自动跳转到test.jsp界面
[root@server1 conf]# vim /usr/local/tomcat/webapps/ROOT/test1.jsp
24 <form action="test1.jsp" method="POST">
#server2端同理
存入的内容信息user1=111在/usr/local/tomcat/logs/catalina.out文件中可以查询
[root@server1 bin]# vim /usr/local/tomcat/logs/catalina.out
user1 = 111
不足之处:但如果某个后端服务器挂了,可是客户端并不知晓,当你再提交请求时,便会由另一个后端服务器接管,虽然还是可以提交数据,但你之前提交的数据便会丢失。
解决方法如下:利用memcache存储与tomcat的jar包使用交叉存储的方式进行存储,进而实现session共享
配置server1:
1、拷贝jar包(存有所需要的软件包)
[root@foundation83 Desktop]# pwd
/home/kiosk/Desktop
[root@foundation83 Desktop]# cd lib/
[root@foundation83 lib]# ls
asm-3.2.jar memcached-session-manager-tc7-1.6.3.jar
kryo-1.04.jar minlog-1.2.jar
kryo-serializers-0.10.jar msm-kryo-serializer-1.6.3.jar
memcached-session-manager-1.6.3.jar reflectasm-1.01.jar
memcached-session-manager-tc6-1.6.3.jar spymemcached-2.7.3.jar
[root@foundation83 lib]# scp * root@172.25.83.1:/usr/local/tomcat/lib #其中lib目录中存放着所有需要的.jar包(是在网上下载好的)
[root@server1 lib]# rm -rf memcached-session-manager-tc6-1.6.3.jar #不需要jar此包
2、更改配置文件
[root@server1 lib]# cd /usr/local/tomcat/conf/
[root@server1 conf]# vim context.xml #在<Context>,</Context>模块中加入如下的35-40行的内容
35 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
36 memcachedNodes="n1:172.25.83.1:11211,n2:172.25.83.2:11211"
37 failoverNodes="n1"
38 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
39 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderF actory"
40 />
41 </Context>
3、重启tomcat
[root@server1 conf]# cd /usr/local/tomcat/bin/
[root@server1 bin]# ./shutdown.sh
[root@server1 bin]# ./startup.sh
4、重启后查看端口
[root@server1 bin]# netstat -antulpe | grep 8080
tcp 0 0 :::8080 :::* LISTEN 0 304532 24478/java
5、安装memcached并启动memcached服务——这步在部署博文LNMP模块——Memcache实现php页面的加速缓存时已经做过,所以这里不需要再重复进行操作。
配置server2:
1、同样拷贝jar包
同server1的配置
2、编辑配置文件
[root@server1 lib]# cd /usr/local/tomcat/conf/
[root@server1 conf]# vim context.xml #在<Context>,</Context>模块中加入如下的35-40行的内容
35 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
36 memcachedNodes="n1:172.25.83.1:11211,n2:172.25.83.2:11211"
37 failoverNodes="n2" #跟server1端唯一不同的就是,将这行的n1改成了n2
38 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
39 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderF actory"
40 />
41 </Context>
3、重启tomcat
同server1的配置
4、重启tomcat后查看端口
同server1的配置
5、安装memcache,并开启服务
[root@server2 bin]# yum install -y memcached
[root@server2 bin]# /etc/init.d/memcached start
[root@server2 bin]# netstat -antulpe | grep 11211
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 498 13677 1616/memcached
tcp 0 0 :::11211 :::* LISTEN 498 13678 1616/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 498 13681 1616/memcached
udp 0 0 :::11211 :::* 498 13682 1616/memcached
测试:
网页输入172.25.83.1/test1.jsp,连续提交信息
此时我们连续添加四个信息在server2上了(可查看日志——/usr/local/tomcat/logs/catalina.out文件中的内容),此时我们关掉server2的tomcat,查看当另一个服务器server1接管后,会不会保留我们之前添加的这些信息
[root@server2 bin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
网页再次提交信息:
server2接管,之前的信息依旧存在,这就实现了session共享(交叉存储)