大多数商业化的J2EE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面。Tomcat按照本身的方式,一样提供一个成熟的管理工具,而且丝绝不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现,当时的功能包括管理context、data source、user和group等。固然也能够管理像初始化参数,user、group、role的多种数据库管理等。在后续的版本中,这些功能将获得很大的扩展,但现有的功能已经很是实用了。Admin Web Application
被定义在自动部署文件:CATALINA_BASE/webapps/admin.xml
。(译者注:CATALINA_BASE即tomcat安装目录下的server目录)html
你必须编辑这个文件,以肯定Context中的docBase参数是绝对路径。也就是说,CATALINAjava
_BASE/webapps/admin.xml
的路径是绝对路径。做为另一种选择,你也能够删除这个自动部署文件,而在server.xml文件中创建一个Admin Web Application的context,效果是同样的。你不能管理Admin Web Application这个应用,换而言之,除了删除CATALINA_BASE/webapps/admin.xml ,你可能什么都作不了。程序员
若是你使用UserDatabaseRealm(默认),你将须要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml
文件中。你编辑这个文件,添加一个名叫“admin”的role 到该文件中,以下:web
<role name="admin"/>
一样须要有一个用户,而且这个用户的角色是“admin”。象存在的用户那样,添加一个用户(改变密码使其更加安全):sql
<ser name="admin"password="deep_dark_secret"roles="admin"/>
你完成这些步骤后,请从新启动Tomcat,访问http://localhost:8080/admin
,你将看到一个登陆界面。Admin Web Application采用基于容器管理的安全机制,并采用了Jakarta Struts框架。一旦你做为“admin”角色的用户登陆管理界面,你将可以使用这个管理界面配置Tomcat。shell
Manager Web Application让你经过一个比Admin Web Application更为简单的用户界面,执行一些简单的Web应用任务。Manager Web Application被被定义在一个自动部署文件中:数据库
CATALINA_BASE/webapps/manager.xml
你必须编辑这个文件,以确保context的docBase参数是绝对路径,也就是说CATALINA_HOME/server/webapps/manager的绝对路径。(译者注:CATALINA_HOME即tomcat安装目录)apache
若是你使用的是UserDatabaseRealm,那么你须要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来,编辑这个文件,添加一个名为“manager”的角色到该文件中:浏览器
<role name=”manager”>
一样须要有一个角色为“manager”的用户。像已经存在的用户那样,添加一个新用户(改变密码使其更加安全):tomcat
<user name="manager"password="deep_dark_secret"roles="manager"/>
而后从新启动Tomcat,访问http://localhost/manager/list
,将看到一个很朴素的文本型管理界面,或者访问http://localhost/manager/html/list
,将看到一个HMTL的管理界面。无论是哪一种方式都说明你的Manager Web Application如今已经启动了。
Manager application
让你能够在没有系统管理特权的基础上,安装新的Web应用,以用于测试。若是咱们有一个新的web应用位于/home/user/hello下在,而且想把它安装到/hello下,为了测试这个应用,咱们能够这么作,在第一个文件框中输入“/hello”(做为访问时的path),在第二个文本框中输入“file:/home/user/hello
”(做为Config URL)。
Manager application
还容许你中止、从新启动、移除以及从新部署一个web应用。中止一个应用使其没法被访问,当有用户尝试访问这个被中止的应用时,将看到一个503的错误??“503 - This application is not currently available”。
移除一个web应用,只是指从Tomcat的运行拷贝中删除了该应用,若是你从新启动Tomcat,被删除的应用将再次出现(也就是说,移除并非指从硬盘上删除)。
有两个办法能够在系统中部署web服务。
$CATALINA_BASE/webapps
目录下。这个web应用自己能够存储在硬盘上的任何地方。若是你有一个WAR文件,你若想部署它,则只须要把该文件简单的拷贝到CATALINA_BASE/webapps目录下便可,文件必须以“.war”做为扩展名。一旦Tomcat监听到这个文件,它将(缺省的)解开该文件包做为一个子目录,并以WAR文件的文件名做为子目录的名字。
接下来,Tomcat将在内存中创建一个context,就好象你在server.xml文件里创建同样。固然,其余必需的内容,将从server.xml中的DefaultContext得到。
部署web应用的另外一种方式是写一个Context XML片段文件,而后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片段并不是一个完整的XML文件,而只是一个context元素,以及对该应用的相应描述。
这种片段文件就像是从server.xml中切取出来的context元素同样,因此这种片段被命名为“context片段”。
举个例子,若是咱们想部署一个名叫MyWebApp.war的应用,该应用使用realm做为访问控制方式,咱们可使用下面这个片段:
<!--Context fragment for deploying MyWebApp.war--> <Context path="/demo"docBase="webapps/MyWebApp.war"debug="0" rivileged="true"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/> </Context>
把该片段命名为“MyWebApp.xml”,而后拷贝到CATALINA_BASE/webapps目录下。
这种context片段提供了一种便利的方法来部署web应用,你不须要编辑server.xml,除非你想改变缺省的部署特性,安装一个新的web应用时不须要重启动Tomcat。
关于server.xml中“Host”这个元素,只有在你设置虚拟主机的才须要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制,对每一个域名而言,都好象独享了整个主机。实际上,大多数的小型商务网站都是采用虚拟主机实现的,这主要是由于虚拟主机能直接链接到Internet并提供相应的带宽,以保障合理的访问响应速度,另外虚拟主机还能提供一个稳定的固定IP。
基于名字的虚拟主机能够被创建在任何web服务器上,创建的方法就是经过在域名服务器(DNS)上创建IP地址的别名,而且告诉web服务器把去往不一样域名的请求分发到相应的网页目录。由于这篇文章主要是讲Tomcat,咱们不许备介绍在各类操做系统上设置DNS的方法,若是你在这方面须要帮助,请参考《DNS and Bind》一书,做者是Paul Albitz and Cricket Liu (O'Reilly)。为了示范方便,我将使用一个静态的主机文件,由于这是测试别名最简单的方法。
在Tomcat中使用虚拟主机,你须要设置DNS或主机数据。为了测试,为本地IP设置一个IP别名就足够了,接下来,你须要在server.xml中添加几行内容,以下:
<Server port="8005" shutdown="SHUTDOWN" debug="0"> <Service name="Tomcat-Standalone"> <Connector className= "org.apache.coyote.tomcat4.CoyoteConnector" port="8080" minProcessors="5" maxProcessors="75" enableLookups="true" redirectPort="8443"/> <Connector className= "org.apache.coyote.tomcat4.CoyoteConnector" port="8443" minProcessors="5" maxProcessors="75" acceptCount="10" debug="0" scheme="https" secure="true"/> <Factory className="org.apache.coyote. tomcat4.CoyoteServerSocketFactory" clientAuth="false" protocol="TLS" /> </Connector> <Engine name="Standalone" defaultHost="localhost" debug="0"> <!-- This Host is the default Host --> <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="ROOT" debug="0"/> <Context path="/orders" docBase="/home/ian/orders" debug="0" reloadable="true" crossContext="true"> </Context> </Host> <!-- This Host is the first "Virtual Host": http://www.example.com/ --> <Host name="www.example.com" appBase="/home/example/webapp"> <Context path="" docBase="."/> </Host> </Engine> </Service> </Server>
Tomcat的server.xml文件,在初始状态下,只包括一个虚拟主机,可是它容易被扩充到支持多个虚拟主机。在前面的例子中展现的是一个简单的server.xml版本,其中粗体部分就是用于添加一个虚拟主机。每个Host元素必须包括一个或多个context元素,所包含的context元素中必须有一个是默认的context,这个默认的context的显示路径应该为空(例如,path=””)。
容器管理验证方法控制着当用户访问受保护的web应用资源时,如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication(BASIC参数在web.xml文件中auto-method元素中设置),而有用户访问受保护的web应用时,Tomcat将经过HTTP Basic Authentication方式,弹出一个对话框,要求用户输入用户名和密码。在这种验证方法中,全部密码将被以64位的编码方式在网络上传输。
注意:使用Basic Authentication经过被认为是不安全的,由于它没有强健的加密方法,除非在客户端和服务器端都使用HTTPS或者其余密码加密码方式(好比,在一个虚拟私人网络中)。若没有额外的加密方法,网络管理员将可以截获(或滥用)用户的密码。
可是,若是你是刚开始使用Tomcat,或者你想在你的web应用中测试一下基于容器的安全管理,Basic Authentication仍是很是易于设置和使用的。只须要添加 和 两个元素到你的web应用的web.xml文件中,而且在CATALINA_BASE/conf/tomcat-users.xml文件中添加适当的 和 便可,而后从新启动Tomcat。
下面例子中的web.xml摘自一个俱乐部会员网站系统,该系统中只有member目录被保护起来,并使用Basic Authentication进行身份验证。请注意,这种方式将有效的代替Apache web服务器中的.htaccess文件。
<!-- Define the Members-only area, by defining a "Security Constraint" on this Application, and mapping it to the subdirectory (URL) that we want to restrict. --> <security-constraint> <web-resource-collection> <web-resource-name> Entire Application </web-resource-name> <url-pattern>/members/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>member</role-name> </auth-constraint> </security-constraint> <!-- Define the Login Configuration for this Application --> <login-config> <auth-method>BASIC</auth-method> <realm-name>My Club Members-only Area</realm-name> </login-config>
一旦你设置了realm和验证的方法,你就须要进行实际的用户登陆处理。通常说来,对用户而言登陆系统是一件很麻烦的事情,你必须尽可能减小用户登陆验证的次数。做为缺省的状况,当用户第一次请求受保护的资源时,每个web应用都会要求用户登陆。
若是你运行了多个web应用,而且每一个应用都须要进行单独的用户验证,那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统,全部他们也就不知道他们须要访问多少个不一样的应用,只是很迷惑,为何总要不停的登陆。
Tomcat 4的“single sign-on”特性容许用户在访问同一虚拟主机下全部web应用时,只需登陆一次。为了使用这个功能,你只须要在Host上添加一个SingleSignOn Valve元素便可,以下所示:
<Valve className="org.apache.catalina.authenticator.SingleSignOn"debug="0"/>
在Tomcat初始安装后,server.xml的注释里面包括SingleSignOn Valve配置的例子,你只须要去掉注释,便可使用。那么,任何用户只要登陆过一个应用,则对于同一虚拟主机下的全部应用一样有效。使用single sign-on valve有一些重要的限制:
固然,若是你拥有这个第三方web应用的源码,而你又是一个程序员,你能够修改它,但那恐怕也不容易作。
一些站点容许个别用户在服务器上发布网页。例如,一所大学的学院可能想给每一位学生一个公共区域,或者是一个ISP但愿给一些web空间给他的客户,但这又不是虚拟主机。在这种状况下,一个典型的方法就是在用户名前面加一个特殊字符(~),做为每位用户的网站,好比:
http://www.cs.myuniversity.edu/~username http://members.mybigisp.com/~username
Tomcat提供两种方法在主机上映射这些我的网站,主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig,userClass属性应该是几个映射类之一。
若是你的系统是Unix,它将有一个标准的/etc/passwd文件,该文件中的账号可以被运行中的Tomcat很容易的读取,该文件指定了用户的主目录,使用PasswdUserDatabase 映射类。
<Listener className= "org.apache.catalina.startup.UserConfig" directoryName="public_html" userClass="org.apache.catalina. startup.PasswdUserDatabase"/>
web文件须要放置在像/home/users/ian/public_html或者/users/jbrittain/public_html同样的目录下面。固然你也能够改变public_html 到其余任何子目录下。
实际上,这个用户目录根本不必定须要位于用户主目录下里面。若是你没有一个密码文件,但你又想把一个用户名映射到公共的像/home同样目录的子目录里面,则可使用HomesUserDatabase类。
<Listener className= "org.apache.catalina.startup.UserConfig" directoryName="public_html" homeBase="/home" userClass="org.apache.catalina. startup.HomesUserDatabase"/>
这样一来,web文件就能够位于像/home/ian/public_html或者/home/jasonb/public_html同样的目录下。这种形式对Windows而言更加有利,你可使用一个像c:home这样的目录。
这些Listener元素,若是出现,则必须在Host元素里面,而不能在context元素里面,由于它们都用应用于Host自己。
Tomcat主要是做为Servlet/JSP容器,但它也有许多传统web服务器的性能。支持通用网关接口(Common Gateway Interface,即CGI)就是其中之一,CGI提供一组方法在响应浏览器请求时运行一些扩展程序。
CGI之因此被称为通用,是由于它能在大多数程序或脚本中被调用,包括:Perl,Python,awk,Unix shell scripting等,甚至包括Java。
固然,你大概不会把一个Java应用程序看成CGI来运行,毕竟这样太过原始。通常而言,开发Servlet总要比CGI具备更好的效率,由于当用户点击一个连接或一个按钮时,你不须要从操做系统层开始进行处理。
Tomcat包括一个可选的CGI Servlet,容许你运行遗留下来的CGI脚本。
为了使Tomcat可以运行CGI,你必须作以下几件事:
在Tomcat中,CGI程序缺省放置在WEB-INF/cgi目录下,正如前面所提示的那样,WEB-INF目录受保护的,经过客户端的浏览器没法窥探到其中内容,因此对于放置含有密码或其余敏感信息的CGI脚本而言,这是一个很是好的地方。
为了兼容其余服务器,尽管你也能够把CGI脚本保存在传统的/cgi-bin目录,但要知道,在这些目录中的文件有可能被网上好奇的冲浪者看到。另外,在Unix中,请肯定运行Tomcat的用户有执行CGI脚本的权限。
在Tomcat 4.1(或更高版本,大概),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪,但这正是Ant有意为之的一部分,有一个API文档指导开发者在没有启动一个新的JVM的状况下,使用Ant。
这是使用Ant进行Java开发的一大优点。另外,这也意味着你如今可以在Ant中使用任何javac支持的编译方式,这里有一个关于Apache Ant使用手册的javac page列表。
使用起来是容易的,由于你只须要在 元素中定义一个名字叫“compiler”,而且在value中有一个支持编译的编译器名字,示例以下:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class> org.apache.jasper.servlet.JspServlet </servlet-class> <init-param> <param-name>logVerbosityLevel </param-name> <param-value>WARNING</param-value> </init-param> <init-param> <param-name>compiler</param-name> <param-value>jikes</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet>
固然,给出的编译器必须已经安装在你的系统中,而且CLASSPATH可能须要设置,那处决于你选择的是何种编译器。
有时,你可能想限制对Tomcat web应用的访问,好比,你但愿只有你指定的主机或IP地址能够访问你的应用。这样一来,就只有那些指定的的客户端能够访问服务的内容了。为了实现这种效果,Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。
经过配置这两个参数,可让你过滤来自请求的主机或IP地址,并容许或拒绝哪些主机/IP。与之相似的,在Apache的httpd文件里有对每一个目录的容许/拒绝指定。例如你能够把Admin Web application设置成只容许本地访问,设置以下:
<Context path= "/path/to/secret_files" ...> <Valve className="org.apache. catalina.valves.RemoteAddrValve" allow="127.0.0.1" deny=""/> </Context>
若是没有给出容许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此以外的都是容许的。与之相似,若是没有给出拒绝主机的指定,那么与容许主机匹配的主机就会被容许,除此以外的都是拒绝的。
————END————
最后,欢迎作Java的工程师朋友们加入Java高级架构进阶Qqun:963944895
群内有技术大咖指点难题,还提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)
比你优秀的对手在学习,你的仇人在磨刀,你的闺蜜在减肥,隔壁老王在练腰, 咱们必须不断学习,不然咱们将被学习者超越!
趁年轻,使劲拼,给将来的本身一个交代!