几乎所有容器类型的应用都会包含一个名为 server.xml 的文件结构。基本上,其中的每个元数据或者配置都是容器完成初始化所需要的。正是由于这些内容都是可配置的,使得软件设计者或架构师可以在容器运行时或销毁时(停止)的情况下注入需要的服务。明白这一点,其重要性不亚于明白代码或软件的工作机制。
对于这篇文章,我们将通过分析 server.xml 文件来理解和配置 appache tomcat 服务器。
准备工作:
安装教程可以点击这里。
安装完成 的tomcat,被放在了你的本地存储中。对于 windows ,通常在 “ PRogram Files ” 文件夹下,对于 Mac 或者 linux,可能在 /user/var/opt 或 /User/<>/application 文件夹下。进入该目录,可以看到下面这几个文件和文件夹:
catalina.properties
和 logging.properties ,
每个引擎在conf 目录下都有一个对应的子目录,例如Catalina,反过来对于每个 host 都有一个二级子目录,比如localhost。可以将上下文信息配置放在这里(类似于 context.xml ,但是对于每个在 host 下的 webapp ,该文件命名为 webapp.xml )。
Catalina
), host name (localhost
), webapp name, followed by the Java classes package structure.Tomcat 是一个 HTTP 服务器。也是一个servlet 容器,可以执行 Java Servlet,将 JavaServer Page(JSP)和 JavaServerFaces(JSF)转换为 Java Servlet。Tomcat 采用了层次化和模块化的架构,如下:
图片1.0 Tomcat 架构
server.xml
“server.xml” 是 Tomcat 的主配置文件,在 <CATALINA_HOME>conf 目录下可以看到。重构后(删掉注释和格式化后)的默认”server.xml“文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <? xml version = '1.0' encoding = 'utf-8' ?> < Server port = "8005" shutdown = "SHUTDOWN" > < Listener className = "org.apache.catalina.core.JasperListener" /> < Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" /> < Listener className = "org.apache.catalina.core.JreMemoryLeakPreventionListener" /> < Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> < Listener className = "org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> < GlobalNamingResources > < Resource name = "UserDatabase" auth = "Container" type = "org.apache.catalina.UserDatabase" factory = "org.apache.catalina.users.MemoryUserDatabaseFactory" pathname = "conf/tomcat-users.xml" /> </ GlobalNamingResources > < Service name = "Catalina" > < Connector port = "8080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "8443" /> < Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" /> < Engine name = "Catalina" defaultHost = "localhost" > < Realm className = "org.apache.catalina.realm.LockOutRealm" > < Realm className = "org.apache.catalina.realm.UserDatabaseRealm" resourceName = "UserDatabase" /> </ Realm > < Host name = "localhost" appBase = "webapps" unpackWARs = "true" autoDeploy = "true" > < Valve className = "org.apache.catalina.valves.AccessLogValve" directory = "logs" prefix = "localhost_access_log." suffix = ".txt" pattern = "%h %l %u %t " %r" %s %b" /> </ Host > </ Engine > </ Service > </ Server > |
Server(第二行)是顶级组件,代表一个 Tomcat 实例。可以包含一个或多个 Services ,其中每个 Service 都有自己的 Engines 和 Connectors。
1 | < Server port = "8005" shutdown = "SHUTDOWN" > ...... </ Server > |
Server 可以包含几个监听器。一个监听器监听指定事件,并对其作出响应。
JasperListener 作用于 Jasper JSP 引擎,该引擎负责对更新后的 JSP 页面进行重编译。
1 | Listener className="org.apache.catalina.core.JasperListener" /> |
GlobalResourcesLifecycleListener 作用于全局资源,保证 JNDI 对资源的可达性,比如数据库。
1 | < Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> |
9到15行的元素定义了 JNDI(Java 命名和目录接口)资源,其允许 Java 软件客户端通过名称搜寻和查找数据。
默认配置通过10到14行的元素定义了一个名称为 UserDatabase 的 JNDI,通过”conf/tomcat-users.xml“得到了一个用于用户授权的内存数据库。
1 2 3 4 5 6 7 | < 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 > |
你也可以定义其它全局化JNDI资源来实现连接池,比如 MySQL 数据库。
一个 Service 可以连接一个或多个 Connectors 到一个引擎。默认配置定义了一个名为“Catalina”的 Service ,连接了两个 Connectors:HTTP 和 AJP 到当前的引擎。
1 | < Service name = "Catalina" > ...... </ Service > |
一个 Connector 关联到一个 TCP 端口,负责处理 Service 与客户端之间的交互。默认配置定义了两个 Connectors。
HTTP/1.1:处理 HTTP 请求,使得 Tomcat 成为了一个 HTTP 服务器。客户端可以通过 Connector 向服务器发送 HTTP 请求,接收服务器端的 HTTP 响应信息。
1 | < Connector port = "8080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "8443" /> |
与生产服务默认使用80端口不同,Tomcat HTTP 服务默认在 TCP 端口8080上运行 。你可以选择1024到65535之间的任意数字作为端口号来运行 Tomcat 服务器,前提是该端口没有被任何其它应用使用。connectionTimeOut 属性定义了这个 connector 在链接获得同意之后,获得请求 URI line(请求信息)响应的最大等待时间毫秒数。默认为20秒。redirect 属性会把 SSL 请求重定向到 TCP 的8443端口。AJP/1.3:Apache JServ Protocol connector 处理 Tomcat 服务器与 Apache HTTP 服务器之间的交互。
1 | < Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" /> |
可以将 Tomcat 和 Apache HTTP 服务运行在一起,Apache HTTP 服务器处理静态请求和 php;Tomcat 服务器负责处理 Java Servlet/JSP 。可以参阅“Tomcat 与 Apache 协同工作如何配置”。
包含了 Engine、Host、Context和 Cluster 的 Tomcat 称为容器。最高级的是 Engine,最底层的是 Context。某些组件,比如 Realm 和 Valve,也可以放在容器中。
引擎是容器中最高级别的部分。可以包含一个或多个 Host。Tomcat 服务器可以配置为运行在多个主机名上,包括虚拟主机。
1 | < Engine name = "Catalina" defaultHost = "localhost" /> |
Catalina 引擎 从 HTTP connector 接收 HTTP 请求,并根据请求头部信息中主机名或 IP 地址重定向到正确的主机上。
一个 Realm(域)就是一个包含 user、passWord 和 role 认证(比如访问控制)的数据库。你可以在任何容器中定义 Realm ,例如 Engine、Host、Context 和 Cluster。
1 2 3 | < Realm className = "org.apache.catalina.realm.LockOutRealm" > < Realm className = "org.apache.catalina.realm.UserDatabaseRealm" resourceName = "UserDatabase" /> </ Realm > |
默认配置定义了一个 Catalina Engine 的 Realm(UserDatabaseRealm),对用户访问 engine 的权限进行控制。其使用定义在 GlobalNamingResources 中,名字为 UserDatabase 的 JNDI。
除了 UserDatabaseRealm 以外,还有:JDBCRealm(授权用户是否可以通过 JDBC 驱动链接到关系型数据库);DataSourceRealm(通过 JNDI 连到数据源);JNDIRealm(连接到一个 LDAP 目录)和 MemoryRealm (将 XML 文件加载到内存)。
一个 Host 定义了在 Engine 下的一个虚拟机,反过来其又支持多个 Context(web 应用)。
1 | < Host name = "localhost" appBase = "webapps" unpackWARs = "true" autoDeploy = "true" /> |
默认配置定义了一个名为 localhost 的主机。appBase 属性定义了所有 webapp 的根目录,在这种情况下是 webapps。默认情况下,每一个 webapp 的 URL 和它所在的目录名称相同。例如,默认的 Tomcat 安装目录的 webapps 下提供了四个 web 应用:docs、examples、host-manager 和 manager。只有 ROOT 是个例外,它用一个空字符串定义。也就是说,它的 URL 是 http://localhost:8080/。unpackWARs 属性指定了放到 webapps 目录下的 WAR-file 是否应该被解压。对于 unpackWARs=”false“,Tomcat 将会直接从 WAR-file 运行应用,而不解压,这可能导致应用运行变慢。autoDeploy 属性指定了是否自动部署放到 webapps 目录下的应用。
Tomcat 支持服务器集群。它可以复制整个集群的会话和上下文属性。也可以部署一个 WAR 文件到所有的集群上。
Valve (阀门)作为请求的前置处理程序,可以在请求发送到应用之前拦截 HTTP 请求。可以定义在任何容器中,比如 Engine、Host、Context和 Cluster。默认配置中,AccessLogValve 会拦截 HTTP 请求,并在日志文件中创建一个日志切入点,如下:
1 2 3 | < Valve className = "org.apache.catalina.valves.AccessLogValve" directory = "logs" prefix = "localhost_access_log." suffix = ".txt" pattern = "%h %l %u %t " %r" %s %b" /> |
以下是其它一些 valve:
更多信息见于 server.xml 文件的顶层和嵌套级别的元素和属性,可以在这里查看。
现在,如果我们想要为应用修改 server.xml 文件该怎么做?不能仅仅因为一个应用修改 server.xml 文件,因为它可能会对所有应用部署的初始化产生影响。对于指定的应用如何隔离指定的变化?
答案就是:创建一个 server-<name>.xml
server-.xml 是一个自定义的文件,包含了对于一个指定 app 需要隔离的配置变化。所有这种格式的文件都会在 server.xml 文件之后被调用。
不推荐这么做,但如果想满足下自己好奇心的除外,你可以通过编辑 catalina.bat 文件来使用你自己的 server.xml 作为替代。
1 | catalina.bat start -config confserver-< name >.xml |
总的来讲,无论是 serve.xml 还是你自己的 server-<name>.xml 文件,都是 container 的核心配置。对于应用开发者和发布管理员来讲,是一种在部署 J2EE 应用的容器中放入资源文件的补充策略。其它无论以何种方式实现的 J2EE 标准容器(厂商),都有相同的配置文件,允许自定义注入和绑定,同时允许在部署、重新部署和卸载时控制哪些服务是有效的。
前两天在一群里看见有人推荐一个app叫问啊,就可以发题答题那种的,感觉就跟uber滴滴打车似的,一般这种软件一上来就砸钱给红包啥的,哥之前刷过uber的单有经验!试验了几次应该可以刷,把注册红包和之前领的红包钱套现,目前我提了五十多,目测还能刷更多。ps,但是尽量要问技术相关的问题,不然容易被封。有技术的可以自己试,不会的可以q我:315414695
新闻热点
疑难解答