手动部署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.-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="" 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="" protocol="HTTP/1.1"
maxThreads="" connectionTimeout=""
redirectPort=""/>
<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.-.el7_5.noarch tomcat-admin-webapps.noarch tomcat-docs-webapp.noarch tomcat-webapps.noarch java-1.8.-openjdk-devel java-1.8.-openjdk
2>配置Nginx
vim /etc/nginx/conf.d/tomcat.conf
server { #增加虚拟主机
listen ; #监听在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="">
<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="">
<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:;
server 10.10.10.131:;
}
vim /etc/nginx/conf.d/tomcat.conf
server {
listen ;
server_name www.ready.com;
location / {
proxy_pass http://tcsv;
}
}
c.重启Nginx和Tomcat,再次访问www.ready.com

说明反代成功
手动部署LNMT(Nginx+Tomcat)并实现Nginx反向代理Tomcat的更多相关文章
- nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
问题说明:测试机上部署了一套业务环境,nginx反向代理tomcat,在访问时长时间处于加载中,十分缓慢! 通过浏览器调试(F12键->Console),发现有错误ERR_CONTENT_LEN ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集之安装Tomcat+Nginx反向代理Tomcat集群】
1,安装Tomcat:和在windows下安装是一样的. 安装tomcat:上传后解压: tar -zxvf apache-tomcat-7.0.88.tar.gz -z:代表.gz格式的压缩包,-x ...
- docker,构建nginx反向代理tomcat
Nginx实现负载均衡是通过配置nginx.conf来实现的,nginx.conf的全部内容如下: user nginx; worker_processes 1; error_log /var/log ...
- Nginx反向代理tomcat返回400 bad request
Nginx反向代理tomcat返回400 bad request nginx 版本1.12, tomcat版本 9.06 最近用Nginx做反向代理tomcat,实现前后端分离,nginx 将请求代理 ...
- 使用Nginx对.NetCore站点进行反向代理
前言 之前的博客我已经在Linux上部署好了.NetCore站点且通过Supervisor对站点进行了进程守护,同时也安装好了Nginx.Nginx的用处非常大,还是简单说下,它最大的功能就是方便我们 ...
- nginx配置虚拟主机、反向代理和负载均衡
为了实现这个功能,需要修改nginx的配置文件,将nginx.conf清理一下,使结构更清晰. worker_processes ; events { worker_connections ; } h ...
- Centos 7 上使用nginx为Node.js配置反向代理时错误:(13: Permission denied) while connecting to upstream
错误来源:Centos 7 上使用nginx为Node.js配置反向代理时产生(13: Permission denied) while connecting to upstream的错误 nginx ...
- Docker Compose一键部署Nginx反向代理Tomcat集群
目录结构如下 mysql/conf/my.cnf [mysqld] user=mysql port=3306 datadir=/var/lib/mysql socket=/var/lib/mysql/ ...
- NGINX如何反向代理Tomcat并且实现Session保持
简介 LNMT=Linux+Nginx+MySQL+Tomcat: Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器: 在中小型系统和并发访问用户不是很多的场合下被 ...
随机推荐
- Django Model模型的实战操作笔记
Model模型的实战操作笔记 1. 创建数据库和表 进入MySQL数据库创建数据库:mytest 进入数据库创建数据表:mytest_users CREATE TABLE `mytest_users` ...
- [C#.net]ListBox对Item进行重绘,设置背景色和前景色
别的不多说了,上代码,直接看 首先设置这行,或者属性窗口设置,这样才可以启动手动绘制,参数有三个 Normal: 自动绘制 OwnerDrawFixed:手动绘制,但间距相同 OwnerDrawVar ...
- PowerShell工作流学习-4-工作流中重启计算机
关键点: a)工作流中重新启动计算机,请使用Restart-Computer的Wait参数,Wait参数不仅适用于本地计算机,也适用于远程计算机. b)重启运行工作流的计算机,手工恢复请使用Resum ...
- python闭包和延迟绑定
一.什么是闭包: 1.函数内定义函数. 2.外函数的返回时内函数的引用. 3.内函数使用外函数的局部变量(至少一个). 1 def outfunc(): 2 for num in range(4): ...
- Reading | 《DEEP LEARNING》
目录 一.引言 1.什么是.为什么需要深度学习 2.简单的机器学习算法对数据表示的依赖 3.深度学习的历史趋势 最早的人工神经网络:旨在模拟生物学习的计算模型 神经网络第二次浪潮:联结主义connec ...
- [数据清洗]-Pandas 清洗“脏”数据(一)
概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...
- ReactNative学习笔记(六)集成视频播放
概述 视频播放可以自己写原生代码实现,然后注入JS.如果对视频播放没有特殊要求的话,可以直接使用现成插件. 到官方推荐的插件网站搜索找到下载量第一的插件:react-native-video. 安装 ...
- Jenkins内置环境变量的使用
一.查看Jenkins有哪些环境变量 1.新建任意一个job 2.增加构建步骤:Execute shell 或 Execute Windows batch command 3.点击输入框下方的“可用环 ...
- jzoj5929. 【NOIP2018模拟10.26】情书
动态规划: #include<bits/stdc++.h> using namespace std; int n,iv[30]; #define mo 998244353 typedef ...
- LabVIEW(十):数组和簇
一.数组 1.创建数组 (1).前面板右键>“数组.矩阵与簇”>数组. (2).前面板右键>(选择要添加的数组数据类型,比如创建数值数组)数值>将“数值输入控件”拖入数组中. ...