1、nginx、tomcat、jdk的动态JSP页面访问
1.1 名词简介
JDK: Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
JSP:JSP(全称JavaServer Pages),部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
tomcat:tomcat服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
1.2 配置Java环境
##解压JDK包
[root@servera opt]# tar zxf /opt/rpms/jdk-7u79-linux-x64.tar.gz -C /usr/local
##添加源码包的连接
[root@servera jdk1.7.0_79]# ln -s /usr/local/jdk1.7.0_79/ /usr/local/java
##配置整体环境变量:/etc/profile
...
74 export JAVA_HOME=/usr/local/java
75 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
76 export PATH=$PATH:$JAVA_HOME/bin
...
##重新加载系统环境
[root@servera jdk1.7.0_79]# source /etc/profile
Java环境测试:
测试代码:
##测试代码
public class test {
public static void main (Strin[] args)
{
System.out.println("Hello world!");
}
}
1.3 tomcat配置
##解压压缩文件
[root@servera rpms]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local
##做软连接
[root@servera local]# ln -s apache-tomcat-7.0.37 /usr/local/tomcat
##启动tomcat(因为tomcat启动时不会报错,故需要查看日志)
[root@servera bin]# /usr/lcoal/tomcat/bin/startup.sh
[root@servera bin]# cat /usr/lcoal/tomcat/logs/catalina.out
1.4 配置Nginx
###开启Nginx,配置Nginx配置文件
[root@servera local]# vim /usr/local/lnmp/nginx/conf/nginx.conf
配合内容如下:
...
72 location ~ \.jsp$ {
73 proxy_pass http://127.0.0.1:8080; ##不处理Java动态页面,交给本机的8080端口
74 }
...
配置Nginx不对Java动态页面进行处理:
访问测试:正常访问,但无图片
【说明】tomcat默认发布页面位置:/usr/local/tomcat/webapps/ROOT/
2、tomcat下的负载均衡
通过两台主机配置负载均衡:
server1:配置了Nginx、tomacat、jdk。
server2:配置、tomacat、jdk。
##两台主机配置
##### server1 192.168.1.120
## 因为server1 没用改变,所以无需配置,仅需要配置负载均衡即可。
修改配置文件(/usr/local/lnmp/nginx/conf/nginx.conf):
...
18 upstream tomcat { ##配置服务端
19 server 192.168.1.120:8080;
20 server 192.168.1.110:8080;
21 }
...
76 location ~ \.jsp$ {
77 proxy_pass http://tomcat; ##修改转发端口
78 }
...
##### server2 192.168.1.110
## 配置server2
##复制tomcat jdk 到server2上
scp -r 192.168.1.120:/usr/local/apache-tomcat-7.0.37/ /usr/local/
scp -r 192.168.1.120:/usr/local/jdk1.7.0_79 /usr/local
##编写配置server2环境变量的文件(/etc/profile)
....
78 export JAVA_HOME=/usr/local/java
79 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
80 export PATH=$PATH:$JAVA_HOME/bin
...
##做链接
[root@server ~]# ln -s /usr/local/apache-tomcat-7.0.37/ /usr/local/tomcat
[root@server ~]# ln -s /usr/local/jdk1.7.0_79/ /usr/local/java
对server1而言: 配置负载均衡
对server2而言:
完成配置后,在serve2上进行测试:
开启Tomcat服务:
在web界面进行访问:
第一次访问:
第二次访问:
上述两次访问,即实现负载均衡。
3、基于nginx、tomcat、memcache的session存储
Session-会话控制:Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。
工作原理:
- 当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。
- 首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
- 当执行PHP脚本时,通过使用session_register()函数注册session变量。
- 当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
3.1 实现负载均衡的同时,数据保留在当前页面
##首先配置一个简单的用户登录页面,源码如下:
<%@ 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>
上述测试页面server1 server2均应配置。
未开启“黏贴”前,进行测试:
上述测试反应,虽然实现负载均衡,但是数据是在不断刷新的,很明显这种体验对用户而言是非常差的。
修改配置文件,使数据“粘滞”:
##数据“粘滞”,添加sticky模块
###解压压缩包
[root@servera rpms]# unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
###重新编译Nginx
[root@servera 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=/opt/rpms/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
###添加模块进Nginx中
###编译程序,替换原版本
[root@servera nginx-1.18.0]# make
[root@servera nginx-1.18.0]# cp objs/nginx /usr/local/lnmp/nginx/sbin/nginx
###修改配置文件
修改内容:
...
http {
upstream tomcat {
sticky; ##添加"粘滞"参数
server 192.168.1.120:8080;
server 192.168.1.110:8080;
}
...
查看编译后的文件:
重启nginx测试:
3.2 memcache下的sesssion
当session会话时,server中,某台Tomcat挂掉,此时用户输入的数据会丢失,同样这对用户的体验也是不好的。此时需要memcache加入会话,可暂时保留用户的会话数据。
在上述会话保持中,session采用的数据存储方式为交叉存储,即A的服务,存到B的memcache中去,这样当A挂掉的同时,B任然有A的数据。
### 在server1 server2中配置session的服务管理器
【说明】上述tc6-1.6.3需要删除,因为该版本是6的。
同步server1 和server2的内容:
## 分别配置server1 server2的tomcat的配置文件:tomcat/conf/contest.xml
##server1配置内容:
...
34 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
35 memcachedNodes="n1:192.168.1,120:11211,n2:192.168.1.110:11211"
36 failoverNodes="n1"
37 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
38 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.Kryo TranscoderFactory"
39 />
...
##server2配置内容:
...
34 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
35 memcachedNodes="n1:192.168.1,120:11211,n2:192.168.1.110:11211"
36 failoverNodes="n2"
37 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
38 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.Kryo TranscoderFactory"
39 />
...
开启server1 server2上的memcache:
###server1 直接开启
[root@servera conf]# systemctl restart memcached.service
###server2 安装后开启
[root@server bin]# yum install -y memcached
[root@server bin]# systemctl start memcached.service
开启后,可查看端口,是否开启成功:
重启tomcat,并测试:
测试:
当server1或server2中的某台主机中的tomcat挂掉,服务器仍能正常缓存数据。