一、tomcat是什么?
开源小型web服务器 ,完全免费,主要用于中小型web项目,只支持Servlet和JSP 等少量javaee规范(就是JavaWeb编程接口)
二、tomcat安装配置
1、下载jdk、tomcat包
tomcat下载网站:http://tomcat.apache.org
jdk可以在网上下载。
获得资源包以后,解压缩。
[root@server1 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
[root@server1 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
2、做链接
[root@server1 local]# ln -s jdk1.7.0_79/ java
[root@server1 local]# ln -s apache-tomcat-7.0.37/ tomcat
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
[root@server1 local]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/lnmp/mysql/bin:/root/bin:/root/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin:/usr/local/java/bin
4、写一个简单的JAVA程序,测试
[root@server1 ~]# vim test.java
public class test {
public static void main(String[] args)
{
System.out.println("hello world");
}
}
[root@server1 ~]# javac test.java
[root@server1 ~]# java test
hello world
5、打开tomcat
[root@server1 tomcat]# cd /usr/local/tomcat/bin/
[root@server1 bin]# ls
bootstrap.jar configtest.bat setclasspath.bat tomcat-juli.jar
catalina.bat configtest.sh setclasspath.sh tomcat-native.tar.gz
catalina.sh cpappend.bat shutdown.bat tool-wrapper.bat
catalina-tasks.xml daemon.sh shutdown.sh tool-wrapper.sh
commons-daemon.jar digest.bat startup.bat version.bat
commons-daemon-native.tar.gz digest.sh startup.sh version.sh
[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 -antlp | grep 8080
tcp 0 0 :::8080 :::* LISTEN 32313/java
6、更改nginx的配置文件
先关掉我们的openresty的nginx
编辑我们的源码安装的nginx的配置文件
[root@server1 bin]# vim /usr/local/openresty/nginx/conf/nginx.conf
62 location ~ \.jsp$ {
63 proxy_pass http://127.0.0.1:8080;
64 }
检测配置文件:
7、启动nginx
[root@server1 sbin]# nginx
8、测试
在浏览器输入:172.25.75.1:8080
会看到初始化欢迎页面。
进入tomcat的发布目录。
[root@server1 sbin]# cd /usr/local/tomcat/webapps/ROOT/
[root@server1 ROOT]# ls
asf-logo.png bg-nav-item.png favicon.ico tomcat.gif WEB-INF
asf-logo-wide.gif bg-nav.png index.jsp tomcat.png
bg-button.png bg-upper.png RELEASE-NOTES.txt tomcat-power.gif
bg-middle.png build.xml tomcat.css tomcat.svg
[root@server1 ROOT]# vim test.jsp
[root@server1 ROOT]# cat test.jsp
server1-The time is: <%=new java.util.Date() %>
三、tomcat实现session粘性
什么是session?
session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
利用nginx+tomcat+memcache实现session共享
为了对数据的保存更加牢靠,我们选择交叉存放session的方法,即将访问tomcat1上的数据存放在memcache2中,将访问tomcat2上的数据存放在memcache1中,这样存放,当某个tomcat服务断了之后,访问它的客户session并不会消失,而是存放在了对立的memcache,如果存放session的memcache坏了,那么它的数据会立即切换到另一个memcached中…
Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时,T1 才将 session 存储在 memcached-1 上(M1 是 T1 failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩溃时也不会丢失 session 会话,避免单点故障
1、我们需要一台server2,和server1一样,配置jdk和tomcat。
2、确保前端open的nginx关闭,修改配置文件,作负载均衡配置
nginx -s stop
关闭nginx
[root@server1 ~]# cd /usr/local/lnmp/nginx/conf/
[root@server1 conf]# vim nginx.conf
17 http {
18 include mime.types;
19 default_type application/octet-stream;
20 upstream tomcat {
21 server 172.25.75.1:8080;
22 server 172.25.75.2:8080;
23 }
46 location / {
47 root /usr/local/tomcat/webapps/ROOT;
48 index index.html index.htm;
49 }
65 location ~ \.jsp$ {
66 proxy_pass http://tomcat;
67 }
71 #location ~ \.php$ {
72 # root html;
73 # fastcgi_pass 127.0.0.1:9000;
74 # fastcgi_index index.php;
75 #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
76 # include fastcgi.conf;
77 #}
3、将发布页远程同步给server2
更改:
[root@server2 lib]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
[root@server2 lib]# cat /usr/local/tomcat/webapps/ROOT/test.jsp
server2-The time is: <%=new java.util.Date() %>
4、server1的nginx重新启动。启动server1-2的tomcat
[root@server1 conf]# nginx
./startup.sh
5、测试
curl 172.25.75.1/test.jsp
会发现轮循!!!
6、更改默认发布页
[root@server1 ROOT]# vim test.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>
</html>
远程同步给server2。
[root@server1 ROOT]# pwd
/usr/local/tomcat/webapps/ROOT
[root@server1 ROOT]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
[root@server1 ROOT]# scp test.jsp [email protected]:/usr/local/tomcat/webapps/ROOT/
[email protected]'s password:
test.jsp 100% 967 0.9KB/s 00:00
7、浏览器访问,测试
发现负载均衡和黏性互相破坏(当用户存储信息后,再次进入信息会清空)
我们发现虽然在上次的实验中当用户存储信息后,信息不会清空,但是会轮循。这会给用户的使用造成一点影响,我们理想的情况应该是来自同一客户端的请求,保持在同一服务端。——session粘性
8、解压缩sticky模块安装包,重新编译、安装nginx。
首先关闭nginx服务:
nginx -s stop
[root@server1 ~]# ls nginx-sticky-module-ng.tar.gz
nginx-sticky-module-ng.tar.gz
[root@server1 ~]# tar zxf nginx-sticky-module-ng.tar.gz
[root@server1 nginx-1.14.0]# ./configure --prefix=/usr/local/lnmp/nginx --with-threads --with-file-aio --with-http_ssl_module --with-http_stub_status_module --user=nginx --group=nginx --add-module=/root/nginx-sticky-module-ng
make && make install
9、编辑nginx配置文件
[root@server1 nginx-1.14.0]# vim /usr/local/lnmp/nginx/conf/nginx.conf
17 http {
18 include mime.types;
19 default_type application/octet-stream;
20 upstream tomcat {
21 sticky;
22 server 172.25.75.1:8080;
23 server 172.25.75.2:8080;
24 }
10、重新启动nginx
nginx
重新测试:
发现负载均衡和黏性不牵扯(当用户存储信息后,再次进入信息不会清空)
四、tomcat实现session共享
1、关闭server1的tomcat,server2下载memcache
server1:
[root@server1 bin]# ./shutdown.sh
server2:
2、server1、server2获得memcached-session-manager的有关jar包,启动server2的memcached
[root@server1 ~]# cd jar/
[root@server1 jar]# ls
asm-3.2.jar minlog-1.2.jar
kryo-1.04.jar msm-kryo-serializer-1.6.3.jar
kryo-serializers-0.10.jar reflectasm-1.01.jar
memcached-session-manager-1.6.3.jar spymemcached-2.7.3.jar
memcached-session-manager-tc7-1.6.3.jar
[root@server1 jar]# mv * /usr/local/tomcat/lib/
server2:
[root@server2 lib]# /etc/init.d/memcached start
3、编辑server1、server2的context.xml文件
server1:
[root@server1 lib]# cd ../conf/
[root@server1 conf]# vim context.xml
添加:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.75.1:11211,n2:172.25.75.2:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
server2:
[root@server2 lib]# vim /usr/local/tomcat/conf/context.xml
4、server1、server2启动tomcat
[root@server1 conf]# cd /usr/local/tomcat/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
查看tomcat日志及端口:
server2:
5、测试
在浏览器输入:http://172.25.75.1/test.jsp
将server2的tomcat关闭,再测试!!!
客户端仍可以存储数据,之前的数据不会清空!!!