Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
在这里我们以nginx作为http服务器,当发现外部的请求为jsp格式的动态页面请求时,Nginx服务器将请求连接至tomcat上面进行执行响应,这里的memached作为内存中的缓存系统在这里进行调用,通过使用memached系统来减小服务器访问数据库的次数,并增加读取速度。
这里nginx主服务器的IP为:172.25.9.1 主机名为:pt1.example.com
两个tomcat子服务器的IP为:172.25.9.3 主机名为:pt3.example.com
172.25.9.3 主机名为:pt3.example.com
一、主服务器的配置:
这里不再介绍nginx的源码安装以及配置,如有需要,请参照http://ptallrights.blog.51cto.com/11151122/1775242
下面直接进行配置文件nginx.conf 的修改:
http {
upstream pt { #指定自定义模块名字为pt
sticky; #使用的算法为sticky
server 172.25.9.3:8080; #一个子服务器为172.25.9.3,监听的是8080端口
server 172.25.9.4:8080; #一个子服务器为172.25.9.4,监听的是8080端口
}
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.php index.htmlindex.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location/status {
stub_status on;
access_log off;
}
location ~ \.jsp$ {
proxy_pass http://pt; #当请求是jsp格式时,调用pt这个模块
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
#fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi.conf;
}
}
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
server{
listen 80;
server_name wwwNaN.com alias pt.com; #虚拟主机
location / {
proxy_pass http://pt;
}
}
server{
listen 80;
server_name wwwNaN1.com; #虚拟主机
location / {
root /virualhost/wwwNaN1.com;
index index.html index.htm;
}
}
}
大部分默认的参数是不需要改动的,主要修改的部分如下:
[root@pt1 conf]# nginx -t
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@pt1 conf]# nginx -s reload
[root@pt1 conf]# nginx
二、下面对两台tomcat服务器进行配置(步骤一样):
对tomcat进行配置,步骤如下:
1、安装jdk
sh jdk-6u26-linux-x64.bin #安装jdk
mv jdk1.6.0_26/ /usr/local/lnmp/ #生成的jdk目录移动至/usr/local/lnmp/
Ln -s jdk1.6.0_2 java #做一个软连接
2、安装tomcat服务器:
tar zxf apache-tomcat-7.0.37.tar.gz
tar zxf apache-tomcat-7.0.37.tar.gz -C/usr/local/lnmp/
ln -s apache-tomcat-7.0.37/ tomcat
3、配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/lnmp/java
exportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
session 的序列化方案官方推荐的有 4 种:
1. java serialization
2. msm-kryo-serializer
3. msm-javolution-serializer
4. msm-xstream-serializer
其中性能最好的序列化方案是Kryo,此文中我们采用 kryo 方式
把如下软件包放置到/usr/local/lnmp/tomcat/lib目录中
kryo-1.03.jar
kryo-serializers-0.8.jar
memcached-2.5.jar
memcached-session-manager-1.5.1.jarmemcached-session-manager-tc7-1.5.1.jar
minlog-1.2.jar
msm-kryo-serializer-1.5.1.jar
reflectasm-0.9.jar
vim /usr/local/lnmp/tomcat/conf/context.xml
<Context>
......
<ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.91:11211,n2:192.168.0.92:11211"
failoverNodes="n1"
#在 node2 上此项设置为“n2”
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
tail -f logs/catalina.out #查看信息
启动 tomcat
#/usr/local/lnmp/tomcat/bin/startup.sh #启动tomcat服务
# /usr/local/lnmp/tomcat/bin/shutdown.sh #关闭 tomcat服务
三、安装memcached
yum install memcached -y
/etc/init.d/memcached start
这里只是简单地使用memcached服务,不过多介绍具体使用。
四、测试页面以及测试
以下为测试页面,保存到/usr/local/lnmp/tomcat/webapps/ROOT/test.jsp<%@page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*"%>
<html><head><title>ClusterApp 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>Sessionlist</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=20name="dataName">
<br>
key:<input type=text size=20name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
访问http://pt1.example.com/test.jsp,不同的主机访问时会调度到不同的 tomcat 实例上处理
来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实
例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉。