-
Webapp server:
-
Jsp:tomcat,jboss,jetty
Php:php-fpm
安装Tomcat
官网:http://tomcat.apache.org
前提:安装jdk
在官网下载tomcat压缩包,解压,设置环境变量
查看catalina脚本文件的帮助信息
开启tomcat
tomcat默认监听在8080端口上
开启服务后,就可以访问tomcat的web页面了
这个页面其实是被映射到了/usr/local/tomcat/webapps/ROOT目录下
tomcat的目录结构
bin:脚本及启动时用到的类
lib:类库
conf:配置文件
logs:日志文件
webapps:应用程序默认部属目录
temp:文件临时目录
work:工作目录
配置文件:
主配置文件:conf/server.xml
context.xml:每个webapp可以有专用的配置文件,这些配置文件通常位于webapp应用程序目录下的WEB.INF目录中,用于定义会话管理器、 JOBC等;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-INF/:当前webapp的私有目录,通常存放当前webapp自用的web.xml
META-INF/:当前webapp的私有目录,通常存放当前webapp自用的context.xml
classes/:此webapp的私有类
lib/:此webapp的私有类,通常被打包成jar格式类
index.jsp:webapp的主页
webapp的归档格式:
.war: webapp的归档文件
.jar:EJB的类
.rar:资源时配器
.ear:企业级应用程序
手动添加一个测试应用程序
1、创建webapp特有的目录结构
2、提供webapp各文件
接下来就可以访问到所写的页面
html语言会自动转换成纯java代码,存放在index.jsp.java中
部署(deployment)webapp相关操作
deploy:部属,将webapp的源文件放置于目标目录,并配制tomcat服务器能够基于context.html定义地路径来访问此webapp;将其特有类通过class loader装载至tomcat;
有两种方式:
自动部属:auto deploy
手动部属:
1、冷部属:把webapp复制到指定位置,而后启动tomcat。
2、热部属:在不停止tomcat的前提下部属,需要通过部属工具来实现。
部属工具:manager,ant脚本,tcd(tomcat client deployer)等;
undeploy:反部属,停止webapp,并从tomcat实例拆除其部分文件及部属名
stop:停止,不再向用户提供服务;
start:启动处于“停止“状态地webapp;
redeploy:重新部属
tomcat自带的应用程序
manager app:webapp管理工具
host manager:Virtual Hosts管理工具
访问Manager App
需要输入用户名和密码
点击Cancel关闭这个页面时,会报错
根据提示我们需要tomcat-users.xml文件中加入以下内容
重启tomcat就可以了
然后就可以使用用户名和密码正常登录了
访问Host Manager
同样根据提示我们需要在tomcat-users.xml文档中添加角色
然后重启tomcat,之后就可以通过用户名和密码进行访问了
Tomcat的主配置文件结构:
<server>
<service>
<connector />
<connector />
<engine>
<host name="">
</host>
<host name="">
</host>
<host name="">
<context />
<context />
</host>
</engine>
</service>
</server>
Tomcat各常见组件的说明:
- 1、服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个实例。这是一个顶级组件
- 2、服务(service):一个服务组件通常包含一个引擎及该引擎所关联的所关联的一个或多个连接器多个连接器。给服务命名可以方便管理员在日志文件中识别不同的服务所产生的日志。一个server可以包含多个service,但通常只为一个server指派一个service
连接类组件:
- 3、连接器(connectors):负责连接客户端(可以是浏览器或web服务器)请求至servlet容器内的web应用程序。通常指的事接收客户端请求的位置以及服务器端分配的端口。默认情况下时HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器。但这些连接器必须使用不同的端口。
示例:在server.xml中定义的http连接器
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
(1)address:指定连接器监听的地址,默认为所有地址,即0.0.0.0
(2)maxThreads:最大并发连接数,默认为200
(3)port:监听的端口,默认为0;
(4)protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP时通常为HTTP/1.3
(5)redirectPort:如果连接器定义的是HTTP协议,当客户端发来HTTPS请求时,则转发至此属性定义的端口。
(6)connectionTimout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟
(7)enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名,默认为true
(8)acceptCount:设置等待队列的最大长度;通常通哦tomcat所处理的线程处与繁忙时,新发来的请求将被放置于等待队列中。
容器类组件:
- 4、引擎(engine):引擎通常指处理请求的servlet引擎组件,及Catalina servlet引擎,它检查每个请求的HTTP首部信息以判定此请求应该发往哪个host或者context。并将请求处理后的结果返回给客户端。严格意义上讲,容器不必非得通过引擎来实现,它也可以只是一个容器,如果它哦摩擦它被配置成一个独立的服务器,则默认引擎就是已经定义好的引擎,而如果tomcat被配置成一个Apaceh web服务器的提供Servlet功能的后端,默认引擎被忽略,因为web服务器自身就能确定用户的请求发往何处。一个引擎可以包含多个host组件。
Engine容器内部可以包含Realm,Host、Listener和Value子容器。
示例<Engine name="Catalina" defaultHost="localhost">
常用属性定义;
(1)defaultHost:Tomcat支持基于FQDN的虚拟主机。这些虚拟主机可以通过在Engine容器中定义多个不同的Host来实现。但如果引擎连接器收到一个发往非明确定义虚拟主机的请求时,则需要将此请求发往一个默认的虚拟主机进行处理。因此在Engine中定义多个虚拟主机的名称中至少要有一个跟defaultHost定义的主机名称相同。
(2)name:Engine组件名称,用于日志和错误信息记录时区别不同的引擎。 - 5、主机(host):主机组件类似于Apache的虚拟主机。但在tomcat中只支持基于FQDN的虚拟主机。一个引擎至少包含一个主机组件。
在server.xml中的示例:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
常用属性说明:
(1)appBase:此Host的webapp目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CALALINA_HOME的相对路径
(2)autoDeploy:在Tomcat处于运行状态时放置与appBase目录中的应用程序文件是否自动进行deploy,默认为true。(我们在生产环境中大多数情况下应让其为false)
(3)unpackWARs:在启用此webapp时是否对WAR格式的归档文件先进行展开,默认为true。
主机别名定义:
如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义,如下:
定义一个虚拟主机示例:
<Host name="www.wtt.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="wtt_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
然后建立所需目录及页面
[root@server1 ~]# mkdir -pv /data/webapps
[root@server1 myapp]# mkdir /data/webapps/{classes,lib,META-INF,WEB-INF}
[root@server1 myapp]# cp index.jsp /data/webapps/
重启服务后就可以访问了
[root@server1 webapps]# catalina.sh stop
[root@server1 webapps]# catalina.sh start
如果我们在/data/webapps下有多个应用程序,我们可以建一个目录,将所有与该程序有关的目录即文件放在所建立的目录中
然后修改server.xml文件,将context内容改成如下内容
<Context path="" docBase="ROOT" reloadable="true" />
重启服务,然后就可以访问到主页面了
- 6、上下文(context):Context组件是最内层的组件,它表示web应用程序本身。配置一个Context最主要的是指定web应用程序的根目录,以便Servlet能够将用户请求发往正确的位置。Context可以包含自定义的错误页,以实现在用户访问发生错误时提供有友好的错误提示信息。
context在某些意义上类似于apache中的路径别名,一个context定义用于标识tomcat实例中的一个web应用程序,如下面定义:
context的相对路径是相对于appBase而言的,因为它是定义在Host内部的
<!-- Tomcat Root Context -->
<Context path="" docBase="/web/apps" reloadable=“true“>
常见属性定义:
(1)path:相对于web服务器跟路径而言的URL,如果为空““,则表示为此webapp的根路径
(2)docBase:相应的web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属的Host的appBase路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如:appBase的路径名为deloy,则docBase的路径名不能为deploy-bbs类的名字
(3)reloadable:是否允许重新加载此context相关的web应用程序的类,默认为“false“。
被嵌套类(nested)的组件。
这类组件通常包含于容器类组件中,以提供管理功能的服务,它们不能包含其他组件。但却可以由不同层次的容器各自配置。
- 7、阀门(Value):用于拦截请求并在将其转至目标之前做某种处理。类似于过滤器。Value可以定义在任何容器类的组件中。Value常被用来记录客户端请求、客户端IP地址和服务器信息等。这种处理技术通常被称为请求转储(request dumping),请求转储value记录请求客户端请求数据包中的HTTP首部信息和Cookie信息至文件中,响应转储value则记录响应数据包首部信息及Cookie信息至文件中。
RemoteHostValve和RemoteAddValve可以分别用来实现基于主机名和IP地址的访问控制,控制本身可以通过allow和deny来实现。如下面的Valve则实现了拒绝172.25.44.2这台主机访问
<Host name="www.wtt.com" appBase="/data/webapps/" unpackWARs="true" autoDeploy="false">
<Context path="" docBase="ROOT" reloadable="true" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.25\.44\.2" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="wtt_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
重启服务,则172.25.44.2这台主机不能访问
用其他主机访问正常
- 8、日志记录器(logger):用于记录组件内部的状态信息。可被用于除Context之外的任意容器内。日志记录功能可以被继承,因此,一个引擎级别的Logger将会记录引擎内部的所有组件信息,除非某组件定义了自己的logger组件。
- 9、领域(Realm):用于用户认证和授权。在配置应用程序时,管理员可以为每一资源或资源组定义角色和权限,而这些访问控制功能生效必须通过Realm来实现。
LNMT
nginx接收客户请求,如果用户请求的是静态内容,则由nginx自己提供或反代至其他web服务器,如果客户请求的是动态内容,则由nginx反代至tomcat
client—>nginx---->reverse_proxy ---->tomcat
reverse_proxy到tomcat之间是通过http协议实现的,所以tomcat必须开启http connector。一般安装完tomcat后默认已经开启了http connector。
配置LNMT
在172.25.44.2主机上安装nginx并配置反向代理
location / {
proxy_pass http://172.25.44.1:8080/;
}
重启服务,然后访问172.25.44.2主机时就被反向代理至tomcat主机了
这是最最基础的配置,这种配置下用户无法通过主机名访问
如果想通过主机名进行访问
我们可以将proxy_pass 改成如下内容,这样nginx服务器想后端请求时就是通过主机名进行请求的。
proxy_pass http://www.wtt.com:8080/;
客户端的解析文件:
172.25.44.2 www.wtt.com
nginx服务器的解析文件:
172.25.44.1 www.wtt.com
然后就可以通过域名访问tomcat了
用户访问动态内容发给它哦摩擦它服务器,访问静态内容由nginx本机进行响应
在nginx的主配置文件中进行如下定义
index index.jsp index.html
location ~* \.(jsp|do)$ {
proxy_pass http://www.wtt.com:8080;
}
重载服务后就可以进行访问了
如果直接只输入域名访问则访问的是一个静态页面,则由nginx自身返回
访问index.jsp页面时则由tomcat服务器返回
LAMT
-
httpd的反代模块:
- 主模块:proxy_module
-
子模块:proxy_module_http, proxy_module_ajp
基于http协议向后端主机进行反向代理时基于proxy_module_http模块。
定义如下虚拟主机
<VirtualHost *:80>
ServerName www.wtt.com
proxyVia On #表示通过哪个主机反代的
proxyRequests Off #关闭正向代理
ProxyPreserveHost On #是否把用户请求的主机名发送至后端主机
<Proxy *>
Order deny,allow
allow from all
</Proxy>
proxyPass / http://172.25.44.1:8080/
ProxyPassReverse / http://172.25.44.1:8080/
<Location />
Order deny,allow
allow from all
</Location>
</VirtualHost>
重启服务后就可以访问了
因为我们在定义虚拟主机开启了把客户端访问的主机名发送给后端服务器的功能,即使我们在定义虚拟主机时后端主机是应ip地址表示的,也可以直接通过主机名进行访问。