Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。
Tomcat是一个轻量级应用服务器。
java程序写的网站用tomcat+jdk来运行。
tomcat是一个中间件,真正起作用的,解析java脚本的是jdk。
jdk(java development kit)是整个java的核心,它包含了java运行环境和一堆java相关的工具以及java基础库。
最主流的jdk为sun公司发布的jdk,除此之外,其实IBM公司也有发布JDK,CentOS上也可以用yum安装openjdk。
server1 | 172.25.78.1 | nginx+tomcat+memcache |
---|---|---|
server2 | 172.25.78.2 | tomcat+memcache |
[root@server1 ~]# ls # 先获取软件包
apache-tomcat-7.0.37.tar.gz
jdk-7u79-linux-x64.tar.gz
[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/
[root@server1 local]# ln -s apache-tomcat-7.0.37 tomcat
[root@server1 local]# ln -s jdk1.7.0_79 java
[root@server1 local]# vim /etc/profile
79 export JAVA_HOME=/usr/local/java # 设置JAVA的根目录
80 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
81 export PATH=$PATH:$JAVA_HOME/bin
[root@server1 local]# source /etc/profile # 刷新环境变量,使其生效
[root@server1 local]# java # 按Tab键,有东西就说明加载成功
java javadoc javah java-rmi.cgi javac
javafxpackager javap javaws
[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 # 检测语法错误
[root@server1 ~]# java test # 执行脚本
hello world
[root@server1 ~]# yum install -y memcached
[root@server1 ~]# /etc/init.d/memcached start
[root@server1 ~]# cd /usr/local/tomcat/
[root@server1 tomcat]# cd bin/
[root@server1 bin]# ./startup.sh # 启动tomcat
[root@server1 bin]# netstat -antlp | grep java
[root@server1 bin]# cd /usr/local/openresty/nginx/conf/
[root@server1 conf]# vim nginx.conf
# 反向代理
location ~ \.jsp$ {
proxy_pass http://127.0.0.1:8080;
}
[root@server1 conf]# cd ../sbin
[root@server1 sbin]# ./nginx -s reload
[root@server1 sbin]# cd /usr/local/tomcat/webapps/ROOT/
[root@server1 ROOT]# vim test.jsp
Server1 The time is: <%=new java.util.Date() %>
[root@server1 conf]# cd /usr/local/openresty/nginx/
[root@server1 nginx]# vim conf/nginx.conf
location / {
#root html;
root /usr/local/tomcat/webapps/ROOT
index index.html index.htm;
}
[root@server1 nginx]# sbin/nginx -s reload
[root@server2 ~]# ls
apache-tomcat-7.0.37.tar.gz
jdk-7u79-linux-x64.tar.gz
[root@server2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
[root@server2 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@server2 ~]# vim /etc/profile
79 export JAVA_HOME=/usr/local/java
80 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
81 export PATH=$PATH:$JAVA_HOME/bin
[root@server2 ~]# source /etc/profile[
root@server2 ~]# cd /usr/local/
[root@server2 local]# ln -s jdk1.7.0_79/ java
[root@server2 local]# ln -s apache-tomcat-7.0.37/ tomcat
[root@server2 local]# cd tomcat/
[root@server2 tomcat]# bin/startup.sh
[root@server2 tomcat]# cd webapps/ROOT/
[root@server2 ROOT]# vim test.jsp
Server2 The time is: <%=new java.util.Date() %>
[root@server1 nginx]# pwd
/usr/local/openresty/nginx
[root@server1 nginx]# vim conf/nginx.conf
18 upstream tomcat{
19 server 172.25.78.1:8080;
20 server 172.25.78.2:8080;
21 }
76 location ~ \.jsp$ {
77 proxy_pass http://tomcat;
78 }
[root@server1 nginx]# sbin/nginx -s reload
[root@server1 ~]# cd /usr/local/tomcat/webapps/ROOT/
[root@server1 ROOT]# vim test.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
Cluster App Test
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"
"); %>
<%
out.println("
ID " + session.getId()+"
");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
} 15 out.print("Session list");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"
");
System.out.println( name + " = " + value);
}
%>
多次实验发现,存储信息是交替进行的,这样不方便 用户来使用,我们现在来改善这个问题
# Nginx的新版本不支持sticky这个模块,所以我们需要重新编译旧版本的nginx
[root@server1 ~]# /usr/local/openresty/nginx/sbin/nginx -s stop # 关闭新版本的nginx
[root@server1 ~]# tar zxf nginx-1.10.1.tar.gz
[root@server1 ~]# tar zxf nginx-sticky-module-ng.tar.gz
[root@server1 ~]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# cd src/core/nginx.h # 隐藏版本号
14 #define NGINX_VER "nginx/"
[root@server1 nginx-1.10.1]# vim auto/cc/gcc # 关闭debug日志
178 # debug
179 # CFLAGS="$CFLAGS -g"
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/lnmp/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
[root@server1 nginx-1.10.1]# cd /usr/local/lnmp/nginx/conf
[root@server1 conf]# vim nginx.conf
upstream tomcat{
sticky;# 同一个用户的访问请求都被发送到同一个 tomcat 实例上处理
server 172.25.78.1:8080;
server 172.25.78.2:8080;
}
root /usr/local/tomcat/webapps/ROOT; # 修改默认目录
# root html;
# 用nginx做tomcat的反向代理
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
[root@server1 conf]# cd ../sbin/
[root@server1 sbin]# ./nginx # 开启nginx
当你正在使用的服务挂掉时,这时这台服务上的所有存储信息都会丢失,这是非常不方便的,而session共享存储就是干这个事情的,把两台服务的信息交错存储,即server1上的信息存储到server2上的memcached上,只有当 server2 不可用时,server1 才将 session 存储在 server1的memcached上,这样,server1和 server2同时崩溃时也不会丢失 session 会话,避免单点故障。
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会
话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对
象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web
页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被
放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,
如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。注意 会话状态仅在支
持 cookie 的浏览器中保留。
Session 的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何设备上的页
面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像 Pad 或
手机这样的浏览器设备。
注:实际上存储功能需要数据库才能实现,我们这里先了解一下,没有用到数据库,即数据没有被存储,但是可以日志可以查看到效果
[root@server1 lib]# pwd
/usr/local/tomcat/lib
[root@server1 lib]# rm -fr memcached-session-manager-tc6-1.6.3.jar # 因为我们的tomcat是7版本的,所以6版本的我们用不上,删除即可,否则可能影响
# Jdk一定要用原生的,从官网去下载
[root@server1 lib]# ls # 这些jar包的自己获取,有些是系统自带,有的是需要自己从外界下载
annotations-api.jar
asm-3.2.jar
catalina-ant.jar
catalina-ha.jar
catalina.jar
catalina-tribes.jar
ecj-4.2.1.jar
el-api.jar
jasper-el.jar
jasper.jar
jsp-api.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jarmsm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jarservlet-api.jar
spymemcached-2.7.3.jartomcat-api.jar
tomcat-coyote.jartomcat-dbcp.jar
tomcat-i18n-es.jar
tomcat-i18n-fr.jar
tomcat-i18n-ja.jar
tomcat-jdbc.jar
tomcat-util.jar
[root@server1 lib]# cd /usr/local/tomcat/conf/
[root@server1 conf]# vim context.xml
34
[root@server1 conf]# cd ..
[root@server1 tomcat]# bin/shutdown.sh
[root@server1 tomcat]# bin/startup.sh
[root@server1 tomcat]# > logs/catalina.out
[root@server2 lib]# ls
annotations-api.jar
asm-3.2.jar
catalina-ant.jar
catalina-ha.jar
catalina.jar
catalina-tribes.jar
ecj-4.2.1.jar
el-api.jar
jasper-el.jar
jasper.jar
jsp-api.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jarmsm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jarservlet-api.jar
spymemcached-2.7.3.jartomcat-api.jar
tomcat-coyote.jartomcat-dbcp.jar
tomcat-i18n-es.jar
tomcat-i18n-fr.jar
tomcat-i18n-ja.jar
tomcat-jdbc.jar
tomcat-util.jar
[root@server2 lib]# cd /usr/local/tomcat/conf/
[root@server2 conf]# vim context.xml
[root@server2 conf]# cd ..
[root@server2 tomcat]# bin/shutdown.sh
[root@server2 tomcat]# bin/startup.sh
[root@server2 tomcat]# > logs/catalina.out
[root@server2 tomcat]# yum install -y memcached
[root@server2 tomcat]# /etc/init.d/memcached start
[root@server1 tomcat]# bin/shutdown.sh # 模拟server1挂掉
[root@server2 tomcat]# cat logs/catalina.out # 查看日志,发现数据确实存储到了server2上
[root@server2 tomcat]# ps
[root@server2 tomcat]# kill -9 1992
[root@server1 tomcat]# pwd
/usr/local/tomcat
[root@server1 tomcat]# bin/shutdown.sh
[root@server1 tomcat]# /usr/local/lnmp/nginx/sbin/nginx -s stop
[root@server1 tomcat]# /etc/init.d/memcached stop
[root@server2 tomcat]# pwd
/usr/local/tomcat
[root@server2 tomcat]# bin/shutdown.sh
[root@server2 tomcat]# /etc/init.d/memcached stop