- Java语言介绍
- Java EE和Tomcat
- Tomcat的主要配置
- Tomcat的管理工具
- Tomcat的反向代理
一、Java语言介绍
(一)Java的特征
- 面向对象
- write once, run anywhere:一次编译,任何处运行
- jdk:包含类库(API)、开发工具(javac)、JVM
(二)Java的三个方向
- JAVA SE:标准版
- JAVA EE:企业版,可以视为JAVA SE增加一些企业级功能模块
- JAVA ME:移动版
(三)jdk与openjdk
- 2006年Sun开源了jdk,建立了openjdk组织
- openjdk与jdk接口兼容,可以按照需求选择
- 当前有openjdk 1.6, 1.7, 1.8版本,对应oracle jdk的相应版本
(四)Java代码的运行
- *.java(source code) --> javac --> *.class(bytecode)
javac程序将java源码文件编译为字节码的java类文件 - jvm:class loader,加载程序的类文件,及程序的类文件依赖到的其它的类文件而后运行; 整个运行表现为一个jvm进程
(五)java技术体系
- Java编程语言
- Java Class文件格式
- Java API
- Java VM
(六)JVM运行时区域
- 方法区:线程共享, 用于存储被JVM加载的class信息、常量、静态变量、方法等
- 堆:用于存储对象,是jvm所管理的内存中占用空间最大的一部分,也是GC(垃圾回收)管理的主要区域;
- Java栈:线程私有,存储线程自己的局部变量
- PC寄存器:线程私有的内存空间,程序的指令指针
- 本地方法栈:
(七)jdk的安装
(1)openjdk的安装
- java-VERSION-openjdk:核心包
- java-VERSION-openjdk-headless:运行时环境包
- java-VERSION-openjdk-devel:开发包
yum install java-1.8.0-openjdk-devel
java -version // 查看当前java环境
(2)oracle jdk的安装
rpm -ivh jdk-8u151-linux-x64.rpm
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
. /etc/profile.d/java.sh
java -version
二、Java EE和Tomcat
(一)Java EE中的关键模块
-
Servlet:Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容
- servlet container:容器,提供servlet功能的服务器
- servlet engine:实现具体功能的servlet实例
-
JSP:Java Server Pages,是一种实现普通静态HTML 和动态 HTML 混合编码的技术;
- 特点:借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:由页面设计者进行 HTML设计,同时留出供 Servlet 程序员插入动态内容的空间
TITLE ...
<% ... java code... // 插入动态内容,实现前端与后端的分离 %> -
jsp与servlet的转换关系:
.jsp -->jasper--> .java --> javac --> .class --> jvm- 基于jasper将静态输出的数据转为java代码进行输出,结果为servlet规范的代码
- javac工具将servlet代码编译为类文件,再把类文件加载到jvm中运行
- jsp的作用在于解决servlet处理html时的复杂性,将前端与后端的工作分离。运行时通过jasper将jsp翻译为标准的java源代码,再按照标准的java代码运行过程工作。
(二)Tomcat
- Tomcat是一个servlet container,实现了Java EE中servlet, jsp部分,故其只是Java EE的部分实现
- Tomcat是由Sun开发的Java Web Server(Java EE的最早实现)与ASF开发的JServ项目合并后产生的
- 当前的Tomcat项目是在Tomcat 4.0(代号:Catalina)的基础上不断完善发展起来的,故Tomcat中很多地方仍旧能够看到单词catalina的痕迹
(三)Java EE的实现简介
- 商业实现:
WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss - 开源实现:
Tomcat, Jetty, Resin
(四)Tomcat的安装
(1)yum安装
yum install tomcat tomcat-docs-webapp tomcat-admin-webapps tomcat-webapps
systemctl start tomcat
(2)官网下载二进制压缩包,解压缩安装
tar xf apache-tomcat-7.0.82.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-7.0.82/ tomcat
useradd tomcat
setfacl -R -m u:tomcat:rwx ./tomcat/
vim /etc/profile.d/tomcat.sh
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
. /etc/profile.d/tomcat.sh
. catalina.sh start // tomcat由java编写,使用脚本运行将tomcat运行在jvm中
(五)Tomcat的程序环境
(1)tomcat的目录结构
bin:脚本及启动时用到的类
conf:配置文件目录
lib:库文件,Java类库,jar
logs:日志文件目录
temp:临时文件目录
webapps:webapp的默认目录
work:工作目录,存放编译后的字节码文件
(2)catalina.sh --help
run:前台模式启动
run -security:带安全管理的前台模式启动
start:后台模式启动
start -security:带安全管理的后台模式启动
stop:关闭
stop n:等待n秒后关闭
stop -force:强行关闭
stop n -force:等待n秒后,强行关闭
configtest:检查配置
version:查询版本
(3)rpm包安装的程序环境
- 配置文件目录:/etc/tomcat
- 主配置文件:server.xml
- webapps存放位置:/var/lib/tomcat/webapps/
examples
manager
host-manager
docs - Unit File:tomcat.service
- 环境配置文件:/etc/sysconfig/tomcat
三、Tomcat的主要配置
(一)tomcat的配置文件构成
- server.xml:主配置文件
- web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置
- context.xml:每个webapp都可以使用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置
- tomcat-users.xml:用户认证的账号和密码文件;角色(role),用户(user);此文件在tomcat启动时被装入内存
- catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略
- catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数
- logging.properties:日志系统相关的配置
(二)tomcat主配置文件:server.xml
-
文件结构:
... ... ... ... 每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:
顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...
(三)JSP WebAPP的组织结构
index.jsp:主页
WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件
META-INF/:类似于WEB-INF/
classes/:类文件,当前webapp所提供的类
lib/:类文件,当前webapp所提供的类,被打包为jar格式
(四)webapp归档格式
.war:webapp
.jar:EJB的类打包文件(类库)
.rar:资源适配器类打包文件
.ear:企业级webapp
(五)部署(deploy)webapp的相关操作
-
部署步骤:
- 将webapp的源文件放置于目标目录(网页程序文件存放目录)
- 配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp
- 将其特有的类和依赖的类通过class loader装载至JVM
-
部署有两种方式:
- 自动部署:auto deploy
- 手动部署:
冷部署:把webapp复制到指定的位置,而后才启动tomcat
热部署:在不停止tomcat的前提下进行部署
部署工具:manager, ant脚本, tcd(tomcat client deployer)等
undeploy:拆除(反部署),停止webapp,并从tomcat实例上卸载webapp
实验1:实现一个最简单的webapp部署操作
mkdir -pv /var/lib/tomcat/webapps/test/{WEB-INF,classes,lib}
vim /var/lib/tomcat/webapps/test/index.jsp
<%@ page language="java" %> // 声明使用的语言
<%@ page import="java.util.*" %> // 声明引用的类
Test Page
<% out.println("hello world");
%>
service tomcat restart
登录http:// 192.168.136.229:8080/test,成功显示预期结果
使用tree命令查看/var/cache/tomcat/work/Catalina/localhost/test目录下的结构,可以看到index.jsp文件先通过jasper转化为.java源码文件,继而通过javac编译为.class类文件并被送入jvm中执行
(六)tomcat的常用组件配置
(1)Server组件:
- 代表tomcat instance,即表现出的一个java进程
- 监听在8005端口,只接收“SHUTDOWN”——建议将监听端口设为-1,取消shutdown功能
- 各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口
(2)Service组件:
- 用于实现将一个或多个connector组件关联至一个engine组件
(3)Connector组件:
负责接收请求,常见的有三类http/https/ajp(apache jserv protocol)
进入tomcat的请求可分为两类:
(1) standalone : 请求来自于客户端浏览器
(2) 由其它的web server反代:来自前端的反代服务器
nginx --> http connector --> tomcat
httpd(proxy_http_module) --> http connector --> tomcat
httpd(proxy_ajp_module) --> ajp connector --> tomcat-
属性:
- 默认存在
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000" // 单位:毫秒
address:监听的IP地址;默认为本机所有可用地址 - 可以添加的属性
maxThreads:最大并发连接数,默认为200
enableLookups:是否启用DNS查询功能,建议关闭
acceptCount:等待队列的最大长度
secure
sslProtocol
- 默认存在
(4)Engine组件:
Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点;通常需要通过defaultHost来定义默认的虚拟主机
属性:
name
defaultHost
jvmRoute:与基于cookie的session sticky有关
(5)Host组件:
位于engine内部用于接收请求并进行相应处理的主机或虚拟主机,示例:
常用属性说明:
(1) appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径
(2) autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat实验2:实现在非默认webapps部署目录存放webapp文件
vim /etc/tomcat/server.xml // 创建虚拟主机
mkdir -pv /app/webapps/ROOT/{WEB-INF,lib,classes}
vim /app/webapps/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
Test Page
<% out.println("hellopeiyang test page");
%>
service tomcat restart
(6)Context组件:
实现别名的功能:如下,当url为/PATH时,自动寻找磁盘上/PATH/TO/SOMEDIR的文件
实验3:在实验2的基础上,实现使用context组件
cp -r /app/webapps/ROOT/ /app/data/
vim /etc/tomcat/server.xml
vim /app/data/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
Test Page
<% out.println("hellopeiyang another test page");
%>
service tomcat restart
(7)Valve组件:
- 定义访问日志:org.apache.catalina.valves.AccessLogValve
- 定义访问控制:org.apache.catalina.valves.RemoteAddrValve
- 实验4:在实验3的基础上,使用valve组件实现定制访问日志和访问控制
vim /etc/tomcat/server.xml // 位置在Host组件语句块中
service tomcat restart
tail /var/log/tomcat/node1_access_log.2017-11-07.log
日志内容存放在/var/log/tomcat/下定义名称的日志文件中
192.168.136.129的主机无法访问
非192.168.136.129的主机可以访问
四、Tomcat的管理工具
(一)tomcat管理工具的使用角色(role)
- manager-gui:允许查看图形管理界面和服务器状态界面
- manager-script:允许通过文本接口管理和查看服务器状态界面
- manager-jmx :允许通过JMX代理管理和查看服务器状态界面
- manager-status:只允许查看服务器状态界面
(二)授权用户manager-gui角色
vim /etc/tomcat/tomcat-users.xml
service tomcat restart
红框中的为三个管理工具页面的连接,从上之下依次为:服务器状态, 管理应用,虚拟主机管理
网络应用管理页面
服务器状态管理页面
(三)授权用户admin-gui角色
vim /etc/tomcat/tomcat-users.xml
service tomcat restart
// 用户hellopeiyang同时拥有manager-gui和admin-gui角色
虚拟主机管理页面
五、Tomcat的反向代理
(一)nginx反向代理至tomcat
- 转发过程:client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)
vim /etc/nginx/nginx.conf
server {
listen 80 default_server;
index index.jsp index.html;
root /usr/share/tomcat/webapps/ROOT;
location ~* \.(jsp|do)$ {
proxy_pass http://127.0.0.1:8080;
}
}
nginx -t
nginx -s reload
直接登录192.168.136.230,通过80端口成功访问tomcat服务器
(二)httpd通过http协议反向代理至tomcat
- 转发过程:client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector)
vim /etc/httpd/conf.d/tomcat.conf
ServerName node1.hellopeiyang.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
Require all granted
httpd -t
systemctl restart httpd
直接登录192.168.136.230,通过80端口成功访问tomcat服务器
(三)httpd通过ajp协议反向代理至tomcat
- 转发过程:client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
cp /etc/httpd/conf.d/tomcat.conf /etc/httpd/conf.d/ajp-tomcat.conf
mv /etc/httpd/conf.d/tomcat.conf /etc/httpd/conf.d/tomcat.conf.bak
vim /etc/httpd/conf.d/ajp-tomcat.conf
ServerName node1.hellopeiyang.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/
Require all granted
systemctl restart httpd
直接登录192.168.136.230,通过80端口成功访问tomcat服务器。
进入Server Status管理页面,可以看到此时ajp协议开始工作,证明现在通过ajp协议转发