文章目录
1.nginx+tomcat+jdk实现JSP动态页面的访问
实验环境:
主机server1上LNMP架构已搭好
1.1 JAVA的介绍与配置
JDK(Java Development Kit)是整个Java核心,包括Java运行环境、Java工具和Java基础类库。JDK作为JAVA开发的环境,不管做JAVA开发还是做安卓开发,都必须在电脑上安装JDK。
1.解压JDK到指定路径
tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local
2.做JAVA的软连接
ln -s /usr/local/jdk1.7.0_79 /usr/local/java
3.配置JAVA的环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
测试:
vim test.java
public class test {
public static void main(String[] args)
{
System.out.println("Hello world!");
}
}
1.2 Tomcat的介绍与配置
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
1.加压tomcat到指定路径
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local
2.做tomcat的软连接
ln -s /usr/local/apache-tomcat-7.0.37 /usr/local/tomcat
3.启动tomcat,并检查日志
./startup.sh
vim /usr/local/tomcat/logs/catalina.out
1.3 Nginx的配置
nginx
开启nginx
vim /usr/local/lnmp/nginx/conf/nginx.conf
设置nginx不处理(因为nginx没有处理jsp的能力,需要交由tomcat处理)
location ~ \.jsp$ {
proxy_pass http://127.0.0.1:8080;
}
nginx -t
语法检查
nginx -s reload
重新加载nginx配置
1.4 测试
vim /usr/local/tomcat/webapps/ROOT/test.jsp
the time is: <%=new java.util.Date() %>
2.nginx+tomcat实现负载均衡
实验环境:
server1:192.168.43.10,设有tomcat+jdk+nginx
server2:192.168.43.20,设有tomcat+jdk
在server1中:
1.设置nginx配置负载均衡
vim /usr/local/lnmp/nginx/conf/nginx.conf
nginx -t
nginx -s reload
2.设置测试文件
vim /usr/local/tomcat/webapps/ROOT/test.jsp
server1-->The time is: <%=new java.util.Date() %>
在server2中:
1.拷贝server1中jdk与tomcat的配置
scp -r server1:/usr/local/apache-tomcat-7.0.37 /usr/local/
scp -r server1:/usr/local/jdk1.7.0_79 /usr/local/
ln -s apache-tomcat-7.0.37 tomcat
ln -s jdk1.7.0_79 java
vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
2.设置测试文件
vim /usr/local/tomcat/webapps/ROOT/test.jsp
server2-->The time is: <%=new java.util.Date() %>
3.开启tomcat
cd /usr/local/tomcat/bin/
./startup.sh
测试:
访问:http://192.168.43.10/test.jsp
3.nginx+tomcat+memcache实现session交叉存放
实验环境:
server1:192.168.43.10,设有tomcat+jdk+nginx(均正常开启)
server2:192.168.43.20,设有tomcat+jdk(均正常开启)
3.1 session介绍
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
3.2 实现session交叉存放
为了对数据的保存更加牢靠,我们选择交叉存放session的方法,即将访问tomcat1上的数据存放在memcache2中,将访问tomcat2上的数据存放在memcache1中,这样存放,当某个tomcat服务断了之后,访问它的客户session并不会消失,而是存放在了对立的memcache,如果存放session的memcache坏了,那么它的数据会立即切换到另一个memcached中.
session交叉存放数据流程:
Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时,T1 才将 session 存储在 memcached-1 上(M1 是 T1 failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩溃时也不会丢失 session 会话,避免单点故障。
3.2.1 nginx实现负载均衡+粘滞
1.在server1和server2的tomcat的默认发布目录重修改我们的测试页
vim /usr/local/tomcat/webapps/ROOT/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>
当我们只开启一个tomcat时,产生的数据会保存到本地,但是当开启两个tomcat时,由于在负载均衡状态,受到nginx的调度,server1端提交数据后直接跳到了server2,与之前的建立的session断开了,再次回来数据就不存在了。
那么为了解决这个问题,我们需要重新编译,添加sticky模块。sticky粘值能让同一个服务器的请求放到同一个后端上。
2.在server1中对nginx重新编译,增加sticky粘滞模块
unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
解压软件包
cd nginx-1.18.0
./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --user=nginx --group=nginx --add-module=/soft/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
重新编译nginx
make && make install
编译安装(因为nginx中没有重要内容)
3对nginx配置粘滞,避免请求来回跳,信息丢失
vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
upstream tomcat {
sticky;
server 192.168.43.10:8080;
server 192.168.43.20:8080;
}
server {
....
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
}
nginx -s reload
重新加载nginx配置
3.2.2 memcache实现session交叉存放
如果server1的tomcat挂掉,那么server1上的数据依然会丢失,因此我们需要memcache的加入实现session交叉存放,即将访问tomcat1上的数据存放在memcache2中,将访问tomcat2上的数据存放在memcache1中。
1.在server1与server2中配置session管理器
vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.43.10:11211,n2:192.168.43.20:11211"
failoverNodes="n1"##server1中为n1,server2中为n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
2.在server2中按装memchached(server1中已安装),并且开启
yum install -y memcached
systemctl start memcached.service
3.重启server1和server2中的tomcat
测试:
telnet localhost 11211
关闭server1中的tomcat: