CentOS 7.x 下 JDK 1.8 & Tomcat 9(APR)打造高性能服务

一、编译安装Apr Tomcat

       Tomcat可以使用Apache Portable Runtime来提供卓越的性能及可扩展性,更好地与本地服务器技术的集成。
Apache Portable Runtime是一个高度可移植的库,位于Apache HTTP Server 2.x的核心。
APR有许多用途,包括访问高级IO功能(如sendfile,epoll和OpenSSL),操作系统级功能
(随机数生成,系统状态等)以及本地进程处理(共享内存,NT管道和Unix套接字)。
这些功能不仅仅是一个后端集中的技术,还可以让Tomcat成为通用的网络服务器,可以实现与本地
的其他Web技术更好的集成,并使Java成为一个完整的网络服务器平台。

官方APR要求:

所需基础组件及版本

  • APR 1.2+ development headers (libapr1-dev package)
  • OpenSSL 1.0.2+ development headers (libssl-dev package)
  • JNI headers from Java compatible JDK 1.4+
  • GNU development environment (gcc, make)

生产环境情况:

操作系统及基础组件版本

  • CentOS Linux release 7 (Core) x86 64
  • Server version: Apache Tomcat/9.0.17
  • Java version “1.8.0_202”

安装所需组件及编译:

通过 yum 安装基础组件

yum -y install apr-devel openssl-devel gcc make expat-devel libtool gcc-c++ libtool* wget

下载源码编译安装arp -> Tomcat

cd /usr/local/src
wget http://tools.itsns.net.cn/tools/apache/apr-1.6.5.tar.gz
wget http://tools.itsns.net.cn/tools/apache/apr-iconv-1.2.2.tar.gz
wget http://tools.itsns.net.cn/tools/apache/apr-util-1.6.1.tar.gz
wget http://tools.itsns.net.cn/tools/apache/apache-tomcat-9.0.17.tar.gz
wget http://tools.itsns.net.cn/tools/apache/jdk-8u202-linux-x64.tar.gz
cd /usr/local/src && tar xf jdk-8u202-linux-x64.tar.gz && mv jdk1.8.0_202/ ../java
cd /usr/local/src && tar xf apache-tomcat-9.0.17.tar.gz && mv apache-tomcat-9.0.17/ ../tomcat

cd /usr/local/src && tar xf apr-1.6.5.tar.gz && cd apr-1.6.5/
./configure --prefix=/usr/local/apr
make && make install

# ↑ 注意:如果报错,请查找 configure 里的 RM='$RM' 改为 RM='$RM  -f'

cd /usr/local/src && tar xf apr-iconv-1.2.2.tar.gz && cd apr-iconv-1.2.2/
./configure   --with-apr=/usr/local/apr  --prefix=/usr/local/apr-iconv
make && make install

cd /usr/local/src && tar xf apr-util-1.6.1.tar.gz && cd apr-util-1.6.1/
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
make && make install

cd /usr/local/tomcat/bin/ && tar xf tomcat-native.tar.gz && cd  tomcat-native-1.2.21-src/native
./configure --with-apr=/usr/local/apr  --with-java-home=/usr/local/java
make && make install

Tomcat 安装为 CentOS 系统服务:


所有的配置文件均放在启动服务配置内,如果你需要跑多个独立的Tomcat 这是最好的选择。
注意:JAVA_OPTS=-..... 此处配置以4G内存为例优化。

vi /usr/lib/systemd/system/tomcat.service

[Unit]
Description=Tomcat 9 servlet container
After=network.target

[Service]
Type=forking

Environment="JAVA_HOME=/usr/local/java"
Environment="JRE_HOME=/usr/local/java/jre"
Environment="CATALINA_HOME=/usr/local/tomcat"
Environment="CATALINA_BASE=/usr/local/tomcat"
Environment="CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid"
Environment="JAVA_OPTS=-server -Xms1024M -Xmx1024M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:-UseCompressedClassPointers -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=500m -XX:MinMetaspaceExpansion=50M -XX:MaxMetaspaceExpansion=50M -Xloggc:/var/log/tomcat_gc.log"
Environment="LD_LIBRARY_PATH=/usr/local/apr/lib"
Environment="LD_RUN_PATH=/usr/local/apr/lib"
ExecStart=/usr/local/tomcat/bin/catalina.sh start
ExecStop=/usr/local/tomcat/bin/catalina.sh stop

Restart=always

[Install]
WantedBy=multi-user.target

chmod +x /usr/lib/systemd/system/tomcat.service

重载系统服务
sudo systemctl daemon-reload

加入系统服务
sudo systemctl enable tomcat.service

启动Tomcat
sudo systemctl start tomcat.service

停止Tomcat
sudo systemctl stop tomcat.service

重启Tomcat
sudo systemctl restart tomcat.service

删除Tomcat 服务
sudo systemctl disable tomcat.service


二、优化配置及TomCat 安全设置


优化好的配置直接覆盖原有配置就可以了
wget http://tools.itsns.net.cn/tools/apache/server.xml


手动优化配置如下:

设置为Tomcat 9 Apr 模式


# vi /usr/local/tomcat/conf/server.xml

默认值:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />

修改为:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"connectionTimeout="20000"redirectPort="8443" />

默认值:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改为:<Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443" />

现在重启tomcat服务,并查看启动日志
# systemctl restart tomcat
# cat /usr/local/tomcat/logs/catalina.out

...
INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib]
INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
...

注意:如果遇到上面的提示找不到基于APR的Apache Tomcat Native库,因此无法使用APR模式启动。
解决方案:
# cp -R /usr/local/apr/lib/* /usr/lib64
# cp -R /usr/local/apr/lib/* /usr/lib

再次重启tomcat,并查看启动日志

# cat /usr/local/tomcat/logs/catalina.out

...
INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8009"]
...

可以看到已经以apr协议模式启动成功,经基于APR的技术web压力测试,Tomcat的性能飙升。

优化连接数,线程数,缓存

修改 server.xml

maxThreads 连接数限制修改配置

<!--<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="150" minSpareThreads="4"/>—>

# 修改为

<Executorname="tomcatThreadPool"namePrefix="catalina-exec-"maxThreads="500"minSpareThreads="30"maxIdleTime="60000"prestartminSpareThreads = "true"maxQueueSize = "100"/>

参数解释:
maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断
minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
maxIdleTime:如果当前线程大于初始化线程,那空闲线程存活的时间,单位毫秒,默认60000=60秒=1分钟。
prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
maxQueueSize:最大的等待队列数,超过则拒绝请求

Connector 参数优化配置
<Connectorport="8080"protocol="org.apache.coyote.http11.Http11AprProtocol"connectionTimeout="20000"redirectPort="8443"/>

# 修改为

<Connector
executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="60000"
maxConnections="10000"
redirectPort="8443"
enableLookups="false"
acceptCount="100"
maxPostSize="10485760"
maxHttpHeaderSize="8192"
compression="on"
disableUploadTimeout="true"
compressionMinSize="2048"
acceptorThreadCount="2"
compressibleMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
URIEncoding="utf-8"
processorCache="20000"
tcpNoDelay="true"
connectionLinger="5"
server="Server Version 11.0"
/>

参数解释:
protocol:Tomcat 7 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol
protocol:Tomcat 6 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol
protocol:Tomcat 8 设置 APR 性能飞快:org.apache.coyote.http11.Http11AprProtocol 具体配置 : <CentOS 7 Tomcat 8.5 基于APR库性能优化>
connectionTimeout:Connector接受一个连接后等待的时间(milliseconds),默认值是60000。
maxConnections:这个值表示最多可以有多少个socket连接到tomcat上
enableLookups:禁用DNS查询
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100。
maxPostSize:设置由容器解析的URL参数的最大长度,-1(小于0)为禁用这个属性,默认为2097152(2M) 请注意, FailedRequestFilter 过滤器可以用来拒绝达到了极限值的请求。
maxHttpHeaderSize:http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
compression:是否启用GZIP压缩 on为启用(文本数据压缩) off为不启用, force 压缩所有数据
disableUploadTimeout:这个标志允许servlet容器使用一个不同的,通常长在数据上传连接超时。 如果不指定,这个属性被设置为true,表示禁用该时间超时。
compressionMinSize:当超过最小数据大小才进行压缩
acceptorThreadCount:用于接受连接的线程数量。增加这个值在多CPU的机器上,尽管你永远不会真正需要超过2。 也有很多非维持连接,您可能希望增加这个值。默认值是1。
compressableMimeType:配置想压缩的数据类型
URIEncoding:网站一般采用UTF-8作为默认编码。
processorCache:协议处理器缓存的处理器对象来提高性能。 该设置决定多少这些对象的缓存。-1意味着无限的,默认是200。 如果不使用Servlet 3.0异步处理,默认是使用一样的maxThreads设置。 如果使用Servlet 3.0异步处理,默认是使用大maxThreads和预期的并发请求的最大数量(同步和异步)。
tcpNoDelay:如果设置为true,TCP_NO_DELAY选项将被设置在服务器套接字,而在大多数情况下提高性能。这是默认设置为true。
connectionLinger:秒数在这个连接器将持续使用的套接字时关闭。默认值是 -1,禁用socket 延迟时间。

安全相关配置

vi /usr/local/tomcat/conf/server.xml

禁用8005端口 避免 telnet localhost 8005  然后输入 SHUTDOWN 就可以关闭 Tomcat。

为了安全我们要禁用该功能

<Server port="8005" shutdown="SHUTDOWN">
# 修改为
<Server port="-1" shutdown="SHUTDOWN">


应用程序安全&关闭自动部署

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

# 修改为

<Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false" reloadable="false">

日志相关说明:在启动文件里,启用了gc.log :Environment=“….. -Xloggc:/var/log/tomcat_gc.log ….."
/var/log/tomcat_gc.log
/usr/local/tomcat/logs/catalina.out

Tomcat的默认工具manager配置

        Tomcat的默认工具manager配置,在很多的生产环境中由于基本用不到、或者是不太需要使用Tomcat默认的manager管理页面时一般都会把Tomcat的默认webapp下的内容给删除了,但是如果需要使用Tomcat默认的manager来管理项目时就需要保留相应的文件目录。在Tomcat中的webapps中有如下目录:docs(Tomcat本地说明文档)、examples(Tomcat相关的deamon示例)、host-manager(主机头管理工具)、manager(项目管理工具)、ROOT(Tomcat默认页),其中需要保留的是host-manager、manager、ROOT这3个目录而从Tomcat 6开始为了安全缺省条件下Tomcat的host-manager、manager是不能访问的(http 401拒绝),如需访问需要分配相关的角色权限。

       首先,需要配置的配置文件是${catalina.home}/conf/tomcat-users.xml先给Tomcat访问相关的功能分配角色和配置登录验证用户密码:username="tomcat" password="tomcat" ,把红色的修改为你的 帐号 / 密码

…略…
-->
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-script"/>
  <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
</tomcat-users>

       此处可以配置多个角色,不同版本Tomcat所拥有的角色都不同,在生产环境中建议修改复杂度高的Tomcat用户密码,另外不需要分配所有角色权限,经需要够用的即可,如果不能访问会用相应的提示,在配置好后此时再打开Tomcat的首页还是无法进入Tomcat的管理页面的。

        因为从Tomcat 7开始安全机制下默认仅允许本机访问Tomcat,如需远程访问Tomcat的管理页面还需要配置相应的ip允许规则,配置manager的contest.xml可以在${catalina.home}/conf/Catalina/localhost目录下配置2个contest.xml文件,也可以写成一个,但是建议写成2个便于日常的权限管理,如下:( 假如我的tomcat 目录 /usr/local/tomcat/ )

vi /usr/local/tomcat/conf/Catalina/localhost/manager.xml

<Context privileged="true" antiResourceLocking="false"
         docBase="${catalina.home}/webapps/manager">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^192.168.*$" />
</Context>

vi /usr/local/tomcat/conf/Catalina/localhost/host-manager.xml

<Context privileged="true" antiResourceLocking="false"
         docBase="${catalina.home}/webapps/host-manager">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^192.168.*$" />
</Context>

       其中allow中是填ip可以使用正则表达式匹配,在内网中建议写成匹配某某网段可以访问的形式,如此Tomcat的manager页面访问配置就完成了。

 

三、其它相关说明

有关系统层优化

如果WEB服务器进行压力测试时报socket不足,则些可以对Linux的一些系统参数修改。

vi /etc/security/limits.conf

增加如下内容

* soft nofile 57766
* hard nofile 65535
Tomcat 多端口 项目部署

Tomcat 安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat\webapps
Tomcat 配置多个端口,其实也就是给Tomcat增加多个server,并设置对应目录。下面以增加两个端口号为例

1.修改server.xml  [ /usr/local/tomcat/conf ]
(1)Tomcat提供的如下(优化后的配置):

<Service name="Catalina"> 
    <Executor name="tomcatThreadPool"
	namePrefix="catalina-exec-"
	maxThreads="500"
	minSpareThreads="30"
	maxIdleTime="60000"
	prestartminSpareThreads = "true"
	maxQueueSize = "100" />

<Connector executor="tomcatThreadPool"
	port="8080"
	protocol="org.apache.coyote.http11.Http11AprProtocol"
	connectionTimeout="60000"
	maxConnections="10000"
	redirectPort="8443"
	enableLookups="false"
	acceptCount="100"
	maxPostSize="10485760"
	maxHttpHeaderSize="8192"
	compression="on"
	disableUploadTimeout="true"
	compressionMinSize="2048"
	acceptorThreadCount="2"
	compressibleMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
	URIEncoding="utf-8"
	processorCache="20000"
	tcpNoDelay="true"
	connectionLinger="5"
	server="Server Version 11.0" />

  <Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" 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 &quot;%r&quot; %s %b" /> 
      </Host>
    </Engine>
  </Service>


(2)新增两个端口号,注意 Service name、Engine name、appBase,Port 端口号 别忘了修改,以免重复。

       Service name="Catalina1"
       port="8081"
       Engine name="Catalina1"
       appBase="webapps1"

<Service name="Catalina1"> 
    <Executor name="tomcatThreadPool"
	namePrefix="catalina-exec-"
	maxThreads="500"
	minSpareThreads="30"
	maxIdleTime="60000"
	prestartminSpareThreads = "true"
	maxQueueSize = "100" />

<Connector executor="tomcatThreadPool"
	port="8081"
	protocol="org.apache.coyote.http11.Http11AprProtocol"
	connectionTimeout="60000"
	maxConnections="10000"
	redirectPort="8443"
	enableLookups="false"
	acceptCount="100"
	maxPostSize="10485760"
	maxHttpHeaderSize="8192"
	compression="on"
	disableUploadTimeout="true"
	compressionMinSize="2048"
	acceptorThreadCount="2"
	compressibleMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
	URIEncoding="utf-8"
	processorCache="20000"
	tcpNoDelay="true"
	connectionLinger="5"
	server="Server Version 11.0" />

  <Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443" /> 
  
    <Engine name="Catalina1" defaultHost="localhost">
    
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps1"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
      </Host>
    </Engine>
  </Service>

       Service name="Catalina2"
       port="8082"
       Engine name="Catalina2"
       appBase="webapps2"

<Service name="Catalina2"> 
    <Executor name="tomcatThreadPool"
	namePrefix="catalina-exec-"
	maxThreads="500"
	minSpareThreads="30"
	maxIdleTime="60000"
	prestartminSpareThreads = "true"
	maxQueueSize = "100" />

<Connector executor="tomcatThreadPool"
	port="8082"
	protocol="org.apache.coyote.http11.Http11AprProtocol"
	connectionTimeout="60000"
	maxConnections="10000"
	redirectPort="8443"
	enableLookups="false"
	acceptCount="100"
	maxPostSize="10485760"
	maxHttpHeaderSize="8192"
	compression="on"
	disableUploadTimeout="true"
	compressionMinSize="2048"
	acceptorThreadCount="2"
	compressibleMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
	URIEncoding="utf-8"
	processorCache="20000"
	tcpNoDelay="true"
	connectionLinger="5"
	server="Server Version 11.0" />

  <Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443" /> 
  
    <Engine name="Catalina2" defaultHost="localhost">
    
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps2"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
      </Host>
    </Engine>
  </Service>

2.复制 webapps 目录 为 webapps1 和  webapps2

cp -rf    /usr/local/tomcat/webapps /usr/local/tomcat/webapps1
cp -rf    /usr/local/tomcat/webapps /usr/local/tomcat/webapps2

/usr/local/tomcat/webapps1
/usr/local/tomcat/webapps2

3.复制 Catalina 目录 为 Catalina1  和 Catalina2

cp -rf    /usr/local/tomcat/conf/Catalina /usr/local/tomcat/conf/Catalina1
cp -rf    /usr/local/tomcat/conf/Catalina /usr/local/tomcat/conf/Catalina2

/usr/local/tomcat/conf/Catalina1/localhost
/usr/local/tomcat/conf/Catalina2/localhost

现在可以把不同的war包放在不同的位置来访问了

Tomcat 虚拟目录部署

在<Host > ...  </Host> 中增加 <Context path="/vdir" docBase="/opt/apps/vdir" reloadable="true"> </Context>

<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 &quot;%r&quot; %s %b" /> 

<Context path="" docBase="/opt/apps/index/" reloadable="true"> </Context>
<Context path="/admin" docBase="/opt/apps/admin/" reloadable="true"> </Context>
<Context path="/weixin" docBase="/opt/apps/weixin/" reloadable="true"> </Context>

</Host>

通过 http://ip:8080 访问/opt/apps/index/ 内容
通过 http://ip:8080/admin 访问/opt/apps/admin/ 内容
通过 http://ip:8080/weixin 来访/opt/apps/weixin/ 内容

Tomcat 多域名共用 8080端口布署

在虚拟目录中可以采用多个域名,共用8080端口的方式来分别访问不同的布署应用。
注意看下面配置 有个 <Alias>..... </Alias>  注意:这里是配置多个域名访问。

<!--##################################################
# www.domain.com 和 www.domain.cn 访问 /opt/apps/index/
###################################################-->
<Host name="www.domain.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
	<Alias>www.domain.cn</Alias>  <!-- 注意:这里是配置多个域名访问 -->
	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
    	prefix="localhost_access_log" 
        suffix=".txt" 
        pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
        
        <Context path="" docBase="/opt/apps/index/" reloadable="true"> </Context>
</Host>

<!--##################################################
# admin.domain.com 访问 /opt/apps/admin/
###################################################-->
<Host name="admin.domain.com" 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 &quot;%r&quot; %s %b" /> 
        
        <Context path="" docBase="/opt/apps/admin/" reloadable="true"> </Context>
</Host>

<!--##################################################
# weixin.domain.com 访问 /opt/apps/weixin/
###################################################-->
<Host name="weixin.domain.com" 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 &quot;%r&quot; %s %b" /> 
        
        <Context path="" docBase="/opt/apps/weixin/" reloadable="true"> </Context>
</Host>

以上配置可以使用域名访问如下:
通过 http://www.domain.com 或者 http://www.domain.cn 来访问 /opt/apps/index/ 内容
通过 http://admin.domain.com 来访问 /opt/apps/admin/ 内容
通过 http://weixin.domain.com 来访问 /opt/apps/weixin/ 内容

 

----->持续更新