Tomcat服务器是一个免费的开放源代码的Web应用服务器
—支持负载平衡与邮件服务等开发应用系统常用的功能
—Tomcat实际上运行JSP页面和Servlet
1.安装jdk
使用 Java 编程语言构建应用和组件的开发环境
实验主机:server1和server2
下载的包:jdk-7u79-linux-x64.tar.gz
[root@server2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/ 将下载到的JDK解压,将jdk文件夹移动到指定的文件夹
[root@server2 ~]# cd /usr/local/ 下载的JDK的文件目录
[root@server2 local]# ls 查看目录下文件
bin etc games include jdk1.7.0_79 lib lib64 libexec sbin share src
[root@server2 local]# ln -s jdk1.7.0_79/ java 做一个软链接
[root@server2 local]# ll
total 44
drwxr-xr-x. 2 root root 4096 Jun 28 2011 bin
drwxr-xr-x. 2 root root 4096 Jun 28 2011 etc
drwxr-xr-x. 2 root root 4096 Jun 28 2011 games
drwxr-xr-x. 2 root root 4096 Jun 28 2011 include
lrwxrwxrwx 1 root root 12 Jul 22 10:09 java -> jdk1.7.0_79/
drwxr-xr-x 8 uucp 143 4096 Apr 11 2015 jdk1.7.0_79
drwxr-xr-x. 2 root root 4096 Jun 28 2011 lib
drwxr-xr-x. 2 root root 4096 Jun 28 2011 lib64
drwxr-xr-x. 2 root root 4096 Jun 28 2011 libexec
drwxr-xr-x. 2 root root 4096 Jun 28 2011 sbin
drwxr-xr-x. 5 root root 4096 Jul 18 11:17 share
drwxr-xr-x. 2 root root 4096 Jun 28 2011 src
[root@server2 local]# vim /etc/profile 设置环境变量,修改/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 使得修改生效
[root@server2 local]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/java/bin
[root@server2 ~]# vim test.java 编写一个测试脚本
public class test {
public static void main(String[] arge) {
System.out.println("hello world!");
}
}
[root@server2 ~]# javac test.java 编译
[root@server2 ~]# java test 测试成功执行
hello world!
2.安装tomcat
tomcat官网: tomcat.apache.org
[root@server2 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/ 解压文件包到指定目录下
[root@server2 local]# ln -s /usr/local/apache-tomcat-7.0.37/ tomcat 软链接
[root@server2 local]# cd /usr/local/tomcat/ 在链接目录下
[root@server2 tomcat]# cd /bin/ 软件的运行脚本存放
[root@server2 bin]# ls 查看运行脚本
bootstrap.jar cpappend.bat startup.bat
catalina.bat daemon.sh startup.sh
catalina.sh digest.bat tomcat-juli.jar
catalina-tasks.xml digest.sh tomcat-native.tar.gz
commons-daemon.jar setclasspath.bat tool-wrapper.bat
commons-daemon-native.tar.gz setclasspath.sh tool-wrapper.sh
configtest.bat shutdown.bat version.bat
configtest.sh shutdown.sh version.sh
[root@server2 bin]# ./startup.sh 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 -antlp 显示所有连接监听端口
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 907/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 983/master
tcp 0 0 172.25.31.2:22 172.25.31.250:58143 ESTABLISHED 1031/sshd
tcp 0 0 :::8080 :::* LISTEN 1124/java
tcp 0 0 :::22 :::* LISTEN 907/sshd
tcp 0 0 ::1:25 :::* LISTEN 983/master
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1124/java
tcp 0 0 :::8009 :::* LISTEN 1124/java
[root@server2 ROOT]# cd /usr/local/tomcat/webapps/ROOT
[root@server2 ROOT]# vim test.jsp jsp程序的测试
[root@server2 ROOT]# cat test.jsp 来同步显示时间
the time is: <%=new java.util.Date() %>
测试:firefox–>172.25.31.2/test.jsp
3.tomat的负载均衡:nginx+tomat
server1:
[root@server1 ~]# cd /usr/local/lnmp/nginx/conf/
[root@server1 conf]# ls
cert.pem koi-win scgi_params.default
fastcgi.conf mime.types uwsgi_params
fastcgi.conf.default mime.types.default uwsgi_params.default
fastcgi_params nginx.conf win-utf
fastcgi_params.default nginx.conf.default
koi-utf scgi_params
[root@server1 conf]# /etc/init.d/php-fpm start php服务开启
Starting php-fpm done
[root@server1 conf]# nginx 开启nginx服务
[root@server1 conf]# vim nginx.conf 打开ip_hash,打开服务器访问端口,配合一致,实现负载均衡
http {
upstream westos { ##负载均衡组
ip_hash; ##利用ip_hash
server 172.25.31.2:8080; ##服务器组
server 172.25.31.3:8080;
location ~ \.jsp$ { ##jsp页面反向代理到tomcat
proxy_pass http://westos;
[root@server1 conf]# nginx -t nginx配置文件语法的检错
nginx: the configuration file /usr/local/lnmp/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/lnmp/nginx/conf/nginx.conf test is successful
[root@server1 conf]# nginx -s reload 重新加载nginx服务
server2:
[root@server2 ~]# cd /usr/local/tomcat/webapps/ROOT/ tomcat默认发布程序,测试文件必须在此路径下才能执行
[root@server2 ROOT]# vim test.jsp 编写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>
[root@server2 ROOT]# scp test.jsp 172.25.31.3:/usr/local/tomcat/webapps/ROOT/ 将jsp页面内容同步到server3
测试:
firefox:172.25.31.1/test.jsp
1.未打开iphash时,数据轮询在server2和server3上存储
2.打开后,指定ip将输入数据存储;
问题: bin/shutdown.sh 当其中一台服务器的tomcat挂掉时,nginx响应后会将当前的信息存储到另外一台主机上,但之前存储的用户信息将会丢失。
4.nginx+tomcat+memcache
1.加入memcache的核心:接管对方的session
2.默认找对方的memcache存储,memcache只是作为备份,在tomcat工作时,有自己的缓存,不会用到memcache
3.使用这种配置的好处是,当 T1 和 M1 同时崩溃时也不会丢失 session 会话,避免单点故障
4.Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时 ,T1 才将 session 存储在 memcached-1 上(M1 是 T1 failoverNode)
server1:
nginx 服务开启
server2:
[root@server2 tomcat]# yum install -y memcached 安装memcached
[root@server2 tomcat]# /etc/init.d/memcached start 开启memcached
[root@server2 tomcat]# cd /usr/local/tomat/lib/
[root@server2 lib]# rm -f memcached-session-manager-tc6-1.6.3.jar 删除与jdk版本不同的包
[root@server2 tomcat]# cd conf/
[root@server2 conf]# vim context.xml tomcat服务器会扫描此文件,一但文件被修改,会自动重新加载这个文件
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.31.2:11211,n2:172.25.31.3:11211"
failoverNodes="n2" ##互为信任节点
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@server2 tomcat]# bin/shutdown.sh 关闭再开启tomcat
[root@server2 tomcat]# bin/startup.sh
[root@server2 tomcat]# yum install -y telnet
[root@server2 tomcat]# tail -f logs/catalina.out 查看memcached初始化是否成功
server3配置同server2
测试:
[root@server3 tomcat]# telnet localhost 11211
get + ID
可得到server2上的缓存
nginx 的sticky模块
sticky 模式:指同一个用户的访问请求都被发送到同一个 tomcat 实例上处理。
server1:
tar zxf nginx-1.10.1.tar.gz nginx版本更新
tar zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz 加入第三方模块
源码安装:配置->编译->执行
cd nginx-1.10.1
./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-threads --with-file-aio --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d
make
make install
vim /opt/nginx/conf/nginx.conf
http {
upstream westos {
sticky;
server 172.25.33.2:8080;
server 172.25.33.3:8080;
}
location ~ .jsp$ {
proxy_pass http://westos;
}
}
测试:
浏览器访问 http://172.25.33.1/test.jsp
结果:不同的主机访问时会调度到不同的 tomcat 实例上处理
来自同一主机的请求会交给同一个tomcat实例处理,此时你down掉当前正在响应的tomcat实例,nginx 会自动把用户的请求调度到另一个tomcat实例上,同时 session 也没有丢掉。