tomcat - 2

tomcat
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为POSIX )
POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称
POSIX标准意在期望获得源代码级别的软件可移植性。
换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行。
API :应用程序编程接口,Application Programming Interface
ABI :
posix API
在A主机(windows)上开发的应用程序,在B主机(linux)编译后,是可以运行的(A/B主机都遵循posix标准,API相同)
在A主机(windows)上开发的应用程序,编译后,在B主机(linux)是运行不了的,(A/B主机都遵循posix标准,ABI不同)
编程语言:
系统级:C,C++,go
应用级:C#,JAVA,Python,Perl,Ruby,php
虚拟机:..jvm,pvm
动态网站:asp .net jsp
动态网站:
客户端动态:客户端加载(服务器端的)源码程序,在本地运行,直接返回结果
服务器动态:
CGI:通用网关接口
webapp server:
jsp:tomcat,jboss,jetty
php:php-fpm
编程语言类别:(指令+数据)
面向过程:以指令为中心,围绕指令组织数据 ---python,bash
面向对象:以数据为中心,围绕数据组织指令 ---java,python
商业实现:
websphere(IBM)
weblogic(oracle)
oc4j
jboss
开源实现:
tomcat ---标准的独立web服务器,支持远程部署管理
jetty ---轻量级,高效,可以被嵌入到其它java代码中使用
resin ---高性能的j2ee应用服务器,也支持php
-----------------------------------------------------------------------------------
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。(由java语言开发的)
tomcat: .jsp--->翻译成servlet文档--->编译为“类”文件再运行(class文件);
java类程序比php程序性能高:
每一次访问php都是边编译(解释)边执行
每一次访问jsp代码时,会被编译成字节码,且编译好的字节码不会删除,会保存在磁盘上,下次再访问时不用编译直接加载该字节码
jdk (jre,jvm) (跑任何java程序或软件,都需要先安装jdk)---[oracle]
tomcat (apache软件基金会)
jboss wildfly  (redhat)
weblogic (oracle)
websphere (IBM)
resin (CAUCHO)
tomcat 核心组件:
catalina:servlet container
coyote:http connection
jasper:jsp engine
tomcat 的开发语言:java
tomcat instance(tomcat实例):运行中的tomcat进程(Java进程)
server:即一个tomcat实例
service:用于将connector关联至engine组件,一个service 只能包含一个engine组件和一个(或多个)connector组件;
engine:tomcat核心组件,用于运行jsp或servlert代码
connector:接收并解析用户请求,将请求映射为engine中运行的代码,之后将运行结果构建成响应报文;
支持http协议,ajp协议(apache jserv protocol,二进制协议---只有apache,tomcat支持)
host:类似于httpd中的虚拟主机
context:类似于httpd中的alias
connector---(server)--->engine :一个连接器(connector)只能有一个engine,一个engine可以有多个连接器(connector);
注意:每个组件都由“类”来实现,有些组件的实现不只一种
顶级类组件:server
服务类组件:service
容器类组件:既可以部署webapp(应用)的组件,eg:engine,host,context
连接器组件:connector
被嵌套类组件:value,logger,realm
常见组件:
1> 服务器:server:tomcat的一个实例,通常一个JVM只能包含一个tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个tomcat实例,每一个实例分属于一个独立的管理端口,这是一个顶级组件;
2> 服务:service:一个服务组件通常包含一个引擎和此引擎相关联的一个或多个连接器,给服务命名可以方便管理员在日志文件中识别。
连接器类组件:
3> 连接器:connector:负责连接客户端(可以是浏览器或web服务器)请求至servlet容器内的web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口,默认端口通常是HTTP协议的8080,也可根据需要修改此端口;一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,tomcat也支持AJP,JServ和JK2连接器。
容器类组件:
4> 引擎:engine:指处理请求的servlet引擎组件,即catalina servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求该发往哪个host或context,并且将请求处理后的结果返回相应的客户端;一个引擎可以包含多个host组件。
5> 主机:host:主机组件类似于apache中的虚拟主机;一个引擎至少包含一个主机组件
6> 上下文:context:是最内层次的组件,表示应用程序本身,配置一个context最主要的是指定web应用程序的根目录,以便Servlet容器能够将用户的请求发往正确的位置,context组件也可以包含自定义的错误页,以实现在用户访问发生错误时提供友好的信息提示。
被嵌套类组件:nested:这类组件通常包好于容器类组件中以提供具有管理功能的服务,它们不包含其它组件,却可以有不同层次的容器各自配置。
7> 阀门:value:用来拦截请求并将其转至目标之前进行某种操作。value可以定义在任何容器类组件中。value通常被用来记录客户端请求、客户端IP地址和服务器等信息
8> 日志记录器:logger:用来记录组件内部的状态信息,可以被用于除context之外的任何容器中;日志记录的功能可以被继承。
9> 领域:realm:用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色和权限,而这些访问控制能需要通过realm来实现;realm的认证可以基于文本文件、数据库表、LDAP服务器来实现。realm的效用会遍及整个引擎或顶级容器。因此一个容器内的所有应用程序将共享用户资源。realm可以被其所在组件的子组件继承。
tomcat 主配置文件结构:
<server>
<service>
<connector />
<connector />
......
<engine>
<host name="">
</host>
<host name="">
</host>
<host>
<context />
<context />
</host>
</engine>
</service>
</server>
tomcat集群:
nginx(反向代理)+tomcat
haproxy ---- nginx(反向代理)+tomcat
nginx(反向代理)+tomcat
会话保持:基于cooker/url-parame/user_id/ip 绑定
高可用:三台主机做成session集群;或共享的session server(即所有的session放在session server,而不放在tomcat本地)
tomcat的运行模式:
1>standlone(独立):通过内置的web server(http connector)来接收客户端请求;
2>proxy:由专门的web server来服务客户端的http请求;
两种机制:in-process:部署于同一主机;
network:部署于不同的主机;
tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是apache,IIS,nginx等;
tomcat作为独立服务器:请求来自于web浏览器;
tomcat上运行java程序:
(默认监听8080端口)不需要用到管理员权限,所以可以以普通用户身份来运行;
若修改tomcat的监听端口为80,则可能需要以管理员身份来运行;
若某个服务监听的端口小于1023的特权端口上,则需要以管理员身份运行;否则以普通用户运行即可;
---------------------------------------------------------------------------------------
安装 tomcat
apache + tomcat
官网地址: http://tomcat.apache.org/
(1)安装jdk
java -version ----查看本机默认使用的java版本
【百度jdk即可下载(有rpm版和tar.gz版) 或 本地源的openjdk版(yum list all|grep jdk)】
tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_45/ /usr/local/java/
(或者做个软连接:ln -s /usr/local/jdk1.8.0_45/ /usr/local/java/)
(2)解压安装新版本tomcat
tar xf apache-tomcat-8.0.20.tar.gz -C /usr/local/
mv /usr/local/apache-tomcat-8.0.20/ /usr/local/tomcat
(3)tomcat的环境变量的定义
定义在单个tomcat的启动和关闭程序里
vim /usr/local/tomcat/bin/startup.sh
vim /usr/local/tomcat/bin/shutdown.sh
把startup.sh和shutdown.sh这两个脚本里的最前面(但要在#!/bin/bash下在)加上下面一段
export JAVA_HOME=/usr/local/java
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CLASS_PATH=$JAVA_HOME/bin/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tool.jar
export PATH=$PATH:/usr/local/java/bin:/usr/local/tomcat/bin
启动方法
/usr/local/tomcat/bin/startup.sh
关闭方法
/usr/local/tomcat/bin/shutdown.sh
家目录路径:
/usr/local/tomcat/webapps/ROOT/
修改监听端口
vim /usr/local/tomcat/conf/server.xml
<Connector port="80" protocol="HTTP/1.1" --把8080改成80的话重启后就监听80
connectionTimeout="20000"
redirectPort="8443" />
--测试后再改回8080端口
访问:http://192.168.1.114:8080
目录布署:
mkdir /usr/local/tomcat/webapps/abc ---把abc目录与ROOT同级或者是在ROOT的下一级都是可行的
vim /usr/local/tomcat/webapps/abc/time.jsp
<html>
<body>
<center>
<H1><%=new java.util.Date()%></H1>
</center>
</body>
</html>
访问:http://192.168.1.114:8080/abc/time.jsp
部署应用:
jspxcms 一个开源的java cms系统jspxcms(java内容管理系统)
<1>解压jspxcms
rm /usr/local/tomcat/webapps/ROOT/* -rf ---解压之前先删除原来家目录里的文件
unzip jspxcms-5.2.4-release.zip -d /usr/local/tomcat/webapps/
(将解压后的正文的文件放置:/usr/local/tomcat/webapps/ROOT目录下)
<2>去mysql建一个库,进行授权
yum install mysql* -y
/etc/init.d/mysqld restart
mysql
mysql> create database jspxcms;
mysql> grant all on jspxcms.* to 'li'@'localhost' identified by '123';
mysql> flush privileges;
<3>使用firefox的下面路径按照它的步骤进行安装
http://IP:8080/
<4>重启tomcat后,再使用下面路径访问就可以了
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
前台访问地址:
http://IP:8080/
后台访问地址:(需要admin用户和其密码登录才有权限)
http://IP:8080/cmscp/index.do
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
说明:
<1>若安装rpm版的jdk:
rpm -ivh jdk-8u45-linux-x64.rpm
(安装至/usr/java/jdk1.7.0_45/......)
需配置环境变量:
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest ----java路径
export PATH=$JAVA_HOME/bin:$PATH
(再重读取该文件)
<2>安装tomcat
tar xf apache-tomcat-8.0.20.tar.gz -C /usr/local/
(安装完后)
vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
catalina.sh --help
/usr/local/tomcat/bin/catalina.sh configtest 检查语法错误
启动tomcat
/usr/local/tomcat/bin/catalina.sh start
lsof -i:8080
java 3094 root 49u IPv6 44620 0t0 TCP *:webcache (LISTEN)
----------------------------------------------------------------------------------------------------
tomcat自带的应用程序:
manager app:webapp 管理工具
host manager:virtual hosts 管理工具
[server status:manager中的子组件]
tomcat目录结构:
bin:脚本以及启动时用到的类
lib:类库
conf:配置文件
logs:日志文件
webapps:应用程序默认部署目录
work:工作目录
temp:临时文件目录
配置文件:
server.xml:主配置文件
context.xml:每个webappp都可以有专用的配置文件,这些配置文件通常位于webapp应用程序目录下的WEB.INF目录中,用于定义会话管理器,JDBC等,conf/context.xml是为各webapp提供默认配置;
web.xml:每个webapp部署之后才能被访问,此文件用于为所有的webapp提供默认的相关的配置;
tomcat-users.xml:用户认证的账号和密码配置文件;
catalina.policy:当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略;
catalina.properties:java属性的定义文件,用于定义类加载器路径等,以及一些jvm性能相关的调优参数;
logging.properties:日志相关的配置信息;
java webapp 组织结构:
有特定的组织形式,层次型的目录结构:主要包含了servlet代码文件,jsp页面文件,类文件,部署描述符文件等
/usr/local/tomcat/webapps/app1/
/:webapp的根目录
WEB-INFO:当前webapp的私有资源目录,通常存放当前webapp自用的web.xml
META-INFO:当前webapp的私有资源目录,通常存放当前webapp自用的context.xml
classes:此webapp的私有类
lib:此webapp的私有类,被打包为jar格式类
index.jsp:webapp的主页
某应用程序的新版本(内有很多文件)要部署在另一主机上,可将其打包(其格式):
webapp归档格式:
.war:webapp(web 应用程序)
.jar:EJB的类
.rar:资源适配器
.ear:企业级的应用程序
手动添加一个应用程序:
1>创建webapp特有的目录结构:
mkdir /usr/local/tomcat/webapps/myapp
mkdir /usr/local/tomcat/webapps/myapp/{lib,classes,WEB-INFO,META-INFO}
2>提供webapp各文件
(创建测试页面)
vim /usr/local/tomcat/webapps/myapp/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
<% out println("hello,world");%>
</body>
</html>
部署(deployment)webapp相关的操作:
deploy:部署:将webapp的源文件旋转于目标目录,配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp;将其特有的类通过class loader装载至tomcat;
部署有两种方式:
自动部署:auto deploy
手动部署:
1>冷部署:把webapp复制到指定位置,然后才启动tomcat;
2>热部署:在不停止tomcat的前提下进行的部署;依赖于部署工具:manager、ant脚本、tcd(tomcat client deploy)等;
undeploy:反部署:停止webapp,并从tomcat上拆除其部分文件和部署名;
stop:停止:不再向用户提供服务;其应用程序类文件仍然在java虚拟机上;
start:启动处于"停止"状态的webapp;
redeploy:重新部署
-----------------------------------------------------------------------
tomcat自带的应用程序:
manager app:webapp 管理工具
host manager:Virtual Hosts 管理工具
图形界面部署:
(基于用户名和密码)
vim /usr/local/tomcat/conf/tomcat-usrs.xml
...
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
...
需要重启tomcat
在图形界面点击:Manager App-->
(热部署):
Deploy directory or WAR file located on server:
Context Path (required):/myapp2 ---部署的路径
XML Configuration file URL: ---web.xml文件路径
WAR or Directory URL: ---.war文件路径
--------------------------------------------------------------------------
server.xml配置说明:
<Server port="8005" shutdown="SHUTDOWN"> ---关闭8005端口,可以直接关闭掉tomcat
......
#定义的http连接:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
定义连接器时可以配置的属性有很多,但通常定义HTTP连接器时必须定义的属性只有"port",定义AJP连接器时必须定义的属性只有“protocol”;默认的协议为http协议:
1> address:指定连接器监听的地址,默认为所有地址,即0.0.0.0;
2> maxThreads:支持的最大并发数;
3> port:监听的端口;
4> protocol:连接器使用的协议,默认为HTTP/1.0,定义AJP协议通常为AJP/1.3;
5> redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;
6> connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒ms
7> enableLookups:是否通过request.getRomoteHost()进行DNS查询以获取客户端的主机名,默认为true;
8> acceptCount:设置等待队列的最大长度:通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;
#定义了多个属性的SSL连接器:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
4)engine组件
<Engine name="Catalina" defaultHost="localhost">
engine是servlet处理器的一个实例,即servlet引擎,默认定义在server.xml中的Catalina段。engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件
常用的定义属性:
defaultHost:
name:engine组件的名称,用于日志和错误信息记录时区分不同的引擎;
jvmRoute:
Engine容器中可以包含Realm,Host,Listener和Value子容器。
5)Host组件:
位于Engine容器中,用于接收请求并进行相应处理的主机或虚拟主机:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
常用属性说明:
appBase:此Host的webapps的目录,即存放非归档的web应用程序的目录或归档后的war文件的目录;可以使用基于:$CATALINA_HOME的相对路径;
autoDeploy:在tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;
unpackWARs:在启用此webapps时是否对war格式的归档文件先进行展开:默认为true;
虚拟主机定义:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps">
<context path="" docBase="ROOT" />
<context path="/bbs" docBase="/web/bbs"
reloadable="true" crossContext="true"
</host>
<Host name="mail.magedu.com" appBase="/web/mail">
<context path="/" docBase="ROOT" />
</host>
<Host name="web3.magedu.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="false">
<context path="" docBase="/data/webapps" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="web3_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</host>
<Host name="web1.magedu.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">
<context path="" docBase="ROOT" reloadable="true" />
<Valve className="org.apache.catalina.valves.valves.RemoteAddrValue"
deny="192.168.1.100" />
</context>
<context path="/shop" docBase="shopxx" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="web3_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</host>
</Engine>
注:path给定的路径不能以/结尾
创建相应目录:
mkdir /usr/local/tomcat/conf/data/{webapps,logs} -pv
将应用部署在/usr/local/tomcat/conf/data/webapps下
主机别名定义:
一个主机有两个或多个主机名,额外的名称可以以别名形式进行定义:
<Host name="www.magedu.com" appBase="/web/mail" unpackWARs="true" >
<Alias>magedu.com</Alias>
</Host>
6)context组件
context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个web应用程序。每一个context定义也可以使用一个单独的xml文件进行,其文件的目录为$CATALINA_HOME/conf/<engine name>/<host name>。可以用于context中 的xml元素有Loader,Realm,Resource和WatchhResource
常用属性说明:
docBase:相应的web应用程序的存放位置,也可以使用相对路径,,起始路径为此Context所属的Host中appBase定义的路径;docBase的路径名不能与相应的Host中appBase中定义的路径有包含关系;
path:相对于web服务器根路径而言的URI,如果为空"",则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需定义;
reloadable:是否允许重新加载此context相关的web应用程序的类:默认为false;
7)Realm组件
一个realm表示一个安全上下文,它是一个授权访问某个给定的context的用户列表和某用户所允许切换的角色相关定义的列表。因此,realm
-----------------------------------------------------------------------------------
LNMP:
nginx(反代)+tomcat
nginx/haprox ----- nginx(反代)+tomcat
nginx(反代)+tomcat
client --> http --> nginx --> reverse_proxy --> http --> tocat(http concector)
其配置:
location ~* \.(jsp|do)$ {
proxy_pass http://web1.cluster.com:8080;
}
LAMP:
apache(反代)+tomcat
nginx/haprox ----- apache(反代)+tomcat
apache(反代)+tomcat
client --> http --> httpd --> reverse_proxy --> http或 ajp --> tocat(http concector或ajp conncector)
反代模块:
主模块:proxy_module
子模块:proxy_module_http,proxy_module_ajp
LANMP
#######################################################################################################
JVM虚拟机
JVM管理的内存段可分为两大类:线程共享内存和线程私有内存
线程共享内存:
方法区:存储jvm加载的class,常量,静态变量,即时编译器编译后的代码等
Java堆:存储java的所有对象实例,数组等
线程私有内存:
程序计数寄存器:每个线程都有自己的计数寄存器,存储当前线程执行字节码的地址;
jvm栈:jvm会为每个运行线程分配一个栈区,线程调用方法时和方法返回时会进行入栈和出栈操作;
本地方法栈区:与jvm stack类似,只不过此区域是为调用本地方法服务
JVM HEAP内存空间:
新生代:
新生区:Dden:初创对象
存活区:survivor:步入成熟区的初创对象:
ss1:
ss2:
老年代:
mark(先标记)---->compact
持久代:
垃圾回收器:
新生代回收:Minor GC
老年代回收:Major GC (Full GC)
堆内存空间的调整参数:
-Xmx:新生代和老年代总共可用的最大空间;
-Xms:二者初始空间之和;
-XX:NewSize:新生代初始空间;
-XX:MaxNewSize:新生代的最大空间;
-XX:MaxPermSize:持久代最大空间;
-XX:PermSize:持久代初始空间;
tomcat而言:
Catalina.sh中有两个环境变量:
CATALINA_OPTS:仅对启动运行tomcat实例的java虚拟机有限;
JAVA_OPTS:对本机上所有的Java虚拟机有限;
性能监控工具:
问题:
OutOfMemoryError:内存不足:
内存泄漏:
线程锁死:
锁竞争:Lock Contention
java消耗过多的CPU
jps:java virtual machine process status tool 监控jvm进程状态信息
jps [options] [hostid]
-m:输出传入main方法的参数;
-l:显示main类或jar的完全限定名称;
-v:显示为jvm虚拟机指定的参数;
jstack:查看某个java进程内的线程堆栈信息
jstack [options] pid
选项:
-l long strings:输出完成的锁信息;
-m :混合模式:即会输出java堆栈及C/C++堆栈信息;
jmap和jhat:
jmap:jvm memory map:查看堆内存使用情况;
jhat:java heap analysis tool
jmap [options] pid
-heap:详细堆内存空间使用状态信息
-histo[:live]:查看堆内存中的对象数目,大小统计结果
jstat:jvm统计监控工具
jstat -<options> [-t] [-h<lines>] <vmid> [<interal> [<count>]]
其中option为必须提供的选项,所有可用选项可用jstat -option列出
-class
-compile
-gc
-gccapacity
-gccaus
......
字段意义:
S0C,S1C,S0U,S1U:C表示容量,U表示已用量;
EC,EU:Eden区域的容量和已用量;
OC,OU:
PC,PU:
YGC,YGT:新生代的GC次数和耗时;
FGC,FGCT:Full GC 次数和耗时;
GCT:GC总耗时;
两个GUI工具:jconsole,jvisualvm
posted @ 2018-06-25 22:56  Sky-wings  阅读(275)  评论(0编辑  收藏  举报