# tomcat配置文件server.xml详解

- Link: https://yjyj.net/learn/4618.html
- Published: 2014-04-24T15:03:49+08:00
- Author: 小 虾

⚡ 生猛大蝦编辑部 · 30 秒核心看点

 * Tomcat 作为独立进程运行，适合中小型系统和 JSP 开发调试。
 * server.xml 重点是 Connector、Engine、Realm 等组件，决定端口、主机和认证方式。
 * 实操思路很直接：改 80 端口、设默认域名、配置管理入口并限制内网访问。

最近帮项目组的同事 @杨霖 哥整了个小vps，鉴于他小白的服务器维护经历，小道我已经做好
准备帮他擦屁股了。。。
 这货要先装win2k3玩一下，但是看这两天的表现，应该撑不太久。
之前没有配置过linux下的java环境，这次趁着要帮他搞搞，顺便自己也熟悉下。

> Tomcat 是一个小型的轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下
> 被普遍使用，是开发和调试JSP 程序的首选。对于一个初学者来说，可以这样认为，当在
> 一台机器上配置好Apache 服务器，可利用它响应对HTML 页面的访问请求。实际上Tomcat
> 部分是Apache 服务器的扩展，但它是独立运行的，所以当你运行tomcat 时，它实际上作为
> 一个与Apache 独立的进程单独运行的。
>  Tomcat 很受广大程序员的喜欢，因为它运行时
> 占用的系统资源小，扩展性好，支持负载平衡与邮件服务等开发应用系统常用的功能；而且
> 它还在不断的改进和完善中，任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。

在运维生存时间看到一篇关于tomcat的详细配置详解，转一下自己也学习学习

    ```decode:true
    规划： 
        网站网页目录：/web/www      域名：www.test1.com 
        论坛网页目录：/web/bbs     URL：bbs.test1.com/bbs 
        网站管理程序：$CATALINA_HOME/wabapps   URL：manager.test.com    允许访问地址：172.23.136.* 

        conf/server.xml 
        <Server port="8005" shutdown="SHUTDOWN"> 
          <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
          <Listener className="org.apache.catalina.core.JasperListener" /> 
          <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" 
                      description="User database that can be updated and saved" 
                      factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
                      pathname="conf/tomcat-users.xml" /> 
          </GlobalNamingResources> 
          <!-- 定义的一个名叫“UserDatabase”的认证资源，将conf/tomcat-users.xml加载至内存中，在需要认证的时候到内存中进行认证 --> 
          <Service name="Catalina"> 
          <!-- # 定义Service组件，同来关联Connector和Engine，一个Engine可以对应多个Connector，每个Service中只能一个Engine --!> 
            <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 
            <!-- 修改HTTP/1.1的Connector监听端口为80.客户端通过浏览器访问的请求，只能通过HTTP传递给tomcat。  --> 
            <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 
            <Engine name="Catalina" defaultHost="test.com"> 
            <!-- 修改当前Engine，默认主机是，www.test.com  --> 
            <Realm className="org.apache.catalina.realm.LockOutRealm"> 
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
                       resourceName="UserDatabase"/> 
            </Realm> 
            # Realm组件，定义对当前容器内的应用程序访问的认证，通过外部资源UserDatabase进行认证 
              <Host name="test.com"  appBase="/web" unpackWARs="true" autoDeploy="true"> 
              <!--  定义一个主机，域名为：test.com，应用程序的目录是/web，设置自动部署，自动解压    --> 
                <Alias>www.test.com</Alias> 
                <!--    定义一个别名www.test.com，类似apache的ServerAlias --> 
                <Context path="" docBase="www/" reloadable="true" /> 
                <!--    定义该应用程序，访问路径""，即访问www.test.com即可访问，网页目录为：相对于appBase下的www/，即/web/www，并且当该应用程序下web.xml或者类等有相关变化时，自动重载当前配置，即不用重启tomcat使部署的新应用程序生效  --> 
                <Context path="/bbs" docBase="/web/bbs" reloadable="true" /> 
                <!--  定义另外一个独立的应用程序，访问路径为：www.test.com/bbs，该应用程序网页目录为/web/bbs   --> 
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/www/logs" 
                       prefix="www_access." suffix=".log" 
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
                <!--   定义一个Valve组件，用来记录tomcat的访问日志，日志存放目录为：/web/www/logs如果定义为相对路径则是相当于$CATALINA_HOME，并非相对于appBase，这个要注意。定义日志文件前缀为www_access.并以.log结尾，pattern定义日志内容格式，具体字段表示可以查看tomcat官方文档   --> 
              </Host> 
              <Host name="manager.test.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> 
              <!--   定义一个主机名为man.test.com，应用程序目录是$CATALINA_HOME/webapps,自动解压，自动部署   --> 
                <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="172.23.136.*" /> 
                <!--   定义远程地址访问策略，仅允许172.23.136.*网段访问该主机，其他的将被拒绝访问  --> 
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/bbs/logs" 
                       prefix="bbs_access." suffix=".log" 
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
                <!--   定义该主机的访问日志      --> 
              </Host> 
            </Engine> 
          </Service> 
        </Server> 

        conf/tomcat-users.xml 
        <?xml version='1.0' encoding='utf-8'?> 
        <tomcat-users> 
          <role rolename="manager-gui" /> 
          <!--  定义一种角色名为：manager-gui    --> 
          <user username="cz" password="manager$!!110" roles="manager-gui" /> 
          <!--  定义一个用户的用户名以及密码，并赋予manager-gui的角色    --> 
        </tomcat-users>
    ```

❓ 延伸问答与排错指南（FAQ）

server.xml 里最该先改哪些配置？

优先看 Connector、Engine 和 Realm。Connector 决定监听端口与协议，Engine 负责默认
主机，Realm 关联认证资源。实际部署时，通常先把 HTTP 端口改成业务需要的端口，再按
域名和权限做细化配置。

Tomcat 为什么要单独配置默认主机？

默认主机用于处理未明确匹配到其他虚拟主机的请求。配置好 defaultHost 后，Tomcat 才能
在同一实例里更稳定地承载多个站点或子域名，避免请求落到错误站点。

管理程序访问为什么要限制内网地址？

因为管理入口属于高权限功能，开放过大容易带来误操作和安全风险。文中思路是只允许指定
网段访问管理程序，这样既保留远程维护能力，也能减少暴露面。

📚 【[招数学习](https://yjyj.net/category/learn)】专栏延伸阅读与热门精选（[全站文章归档](https://yjyj.net/archive)）：

 * [Ubuntu下升级gcc跟g++](https://yjyj.net/learn/4609.html)
 * [Ubuntu下安装最新版本的 CMake](https://yjyj.net/learn/centos/4606.html)
 * [解决Windows 7 任务栏windows资源管理器“最近”和“已固定”消失的问题](https://yjyj.net/learn/4621.html)
 * [WordPress管理后台提示, “不需要升级，您的WordPress数据库已经是最新的了”](https://yjyj.net/learn/wordpress-learn/4624.html)
 * 热门必读[CSS 盒模型边界重叠 (Margin Collapse) 原理与解决方案](https://yjyj.net/css/3536.html)
 * 热门必读[css布局实例](https://yjyj.net/learn/3901.html)
