手动部署LNMT(Nginx+Tomcat)并实现Nginx反向代理Tomcat
一、什么是Tomcat?
在弄清楚Tomcat之前要先了解什么是J2EE:从整体上讲,J2EE 是使用 Java 技术开发企业级应用的工业标准,它是 Java 技术不断适应和促进企业级应用过程中的产物。 适用于企业级应用的 J2EE,提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的 开发、管理和部署。J2EE 是一个标准,而不是一个现成的产品。
而Tomcat就可以算是一个不完整的J2EE,tomcat为众多的java应用程序服务器嵌入自己的产品中构建商业的java应用程序服务器。
二、Tomcat的yum安装
1.安装JDK
Tomcat的运行需要有JDK的支持
2.安装Tomcat
yum install -y java-1.8.0-openjdk.x86_64 yum install -y tomcat.noarch tomcat-admin-webapps.noarch tomcat-docs-webapp.noarch tomcat-webapps.noarch tomcat-javadoc.noarch
3.启动Tomcat
yum安装JDK和Tomcat后就能启动了,Tomcat默认监听在8009端口
systemctl start tomcat
三、Tomcat配置文件结构
1、Tomcat各常见配置组件
1.服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
2.服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。
连接器类组件:
3.连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。
容器类组件:
4.引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
5.主机(Host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。
6.上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。
被嵌套类(nested)组件:
这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。
7.阀门(Valve):用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
8.日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
9.领域(Realm):用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。
2.配置示例
<Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml"/> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443"/> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> </Engine> </Service> </Server>
四、环境准备
1.IP规划、系统及软件版本
主机1(Nginx):IP1:192.168.29.109 IP2:10.10.10.128
主机2(Tomcat):10.10.10.130
软件及版本:
Nginx:nginx-1.12.2-2.el7.x86_64
JDK:java-1.8.0-openjdk.x86_64、java-1.8.0-openjdk-devel.x86_64
Tomcat:tomcat-7.0.76-8.el7_5.noarch、tomcat-admin-webapps.noarch、tomcat-docs-webapp.noarch、tomcat-webapps.noarch
ps:tomcat-admin-webapps.noarch为Tomcat服务器管理页面,tomcat-docs-webapp.noarch为Tomcat文档文件,
关闭firewall与selinux。
2.软件安装并测试
1>在主机1上安装Nginx,在主机2上安装JDK、Tomcat
~]# yum install -y Nginx
~]# yum install -y tomcat-7.0.76-8.el7_5.noarch tomcat-admin-webapps.noarch tomcat-docs-webapp.noarch tomcat-webapps.noarch java-1.8.0-openjdk-devel java-1.8.0-openjdk
2>配置Nginx
vim /etc/nginx/conf.d/tomcat.conf
server { #增加虚拟主机 listen 80; #监听在80端口 server_name www.ready.com; #以主机名方式建立虚拟主机,主机名为www.ready.com location / { #配置location匹配规则 proxy_pass http://10.10.10.130:8080; #将匹配的location以http协议反代至主机2的8080端口 } }
3>配置Tomcat
Tomcat的配置文件路径在/etc/tomcat下,Tomcat的配置文件主要有下面几个:
~]# cd /etc/tomcat/ ~]# ls Catalina conf.d logging.properties tomcat-users.xml catalina.policy context.xml server.xml web.xml
1.tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;
2.catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;
3.catalina.properties:Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此文件的相关设置;
4.logging.properties: Tomcat通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等;
5.context.xml:所有host的默认配置信息;
在生产环境中,Tomcat一般不会直接被用户访问,通常情况都会与反向代理组合使用,将客户请求由反向代理至Tomcat进行处理,如httpd、Nginx。要注意的是如果使用Nginx只能使用http协议连接,而httpd则可以使用http和AJP两种协议。
4>使用Tomcat默认配置测试Nginx+Tomcat是否连通
在客户主机(192.168.29.1)上修改hosts文件,在最后一行用管理员权限添加内容192.168.29.109 www.ready.com
启动Nginx,Tomcat
~]# systemctl start nginx #主机1上操作
~]# systemctl start tomcat #主机2上操作
5>访问www.ready.com
连接成功如下图显示:
上图就是Tomcat的默认主页。
tomcat-users.xml配置如下
<!-- <role rolename="admin"/> --> <role rolename="admin-gui"/> <!-- <role rolename="admin-gui"/> --> <!-- <role rolename="admin-script"/> --> <role rolename="manager-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> <!-- <role rolename="manager"/> --> <!-- <role rolename="manager-gui"/> --> <!-- <role rolename="manager-script"/> --> <!-- <role rolename="manager-jmx"/> --> <!-- <role rolename="manager-status"/> --> <!-- <user name="admin" password="adminadmin" roles="admin,manager,admin-gui, admin-script,manager-gui,manager-script,manager-jmx,manager-status" /> --> </tomcat-users>
3.在Tomcat上部署测试应用
1.部署WEB网页简介
yum安装的Tomcat的默认网页路径有两个:/var/lib/tomcat/webapps和/usr/share/tomcat/webapps,后者是前者的软连接。部署Java时通常有JAR、WAR、EAR三种包
下面部署以WAR包为例部署一个动态网页,WAR包的结构如下:
1、index.jsp[可选]
2、METAINF[MAVEN自动生成目录]
3、WEB-INF[必含]
①classes目录:存放Java类文件
②lib目录:所需要的jar包
③web.xml:war的描述文件
4、subdirectories[可选目录]
存放一些网页和照片,如:html,jsp,js,jpg等等。
2.创建Java网页包
这里以WAR包为例,创建一个动态网页
a.在默认网站根下创建项目目录
mkdir -pv /var/lib/tomcat/webapps/test/{WEB-INF,META-INF,classes,lib}
b.创建主页文件index.jsp(功能为查询session状态)
vim /var/lib/tomcat/webapps/test/index.jsp
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">Tomcat.ready.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("ready.com","ready.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
c.访问http://www.ready.com/test/index.jsp
4.Nginx做反向代理负载均衡后端Tomcat
a.在主机3(IP:10.10.10.131)上安装和主机2相同的软件,并将主机2上/var/lib/tomcat/webapps/test/下的文件用 scp 命令发送至主机3上,修改inde.jsp为下:
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="green">Jerrymouse.ready.com</font></h1> #修改标题颜色和内容 <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("ready.com","ready.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
b.在主机1上配置Nginx,在默认配置中的http模块中插入upstream
vim /etc/nginx/nginx.conf
upstream tcsv { server 10.10.10.130:8080; server 10.10.10.131:8080; }
vim /etc/nginx/conf.d/tomcat.conf
server { listen 80; server_name www.ready.com; location / { proxy_pass http://tcsv; } }
c.重启Nginx和Tomcat,再次访问www.ready.com
说明反代成功