---
order: 1
navTitle: Tomcat
---
# Tomcat安装配置

\[\[toc]]

## 获取tomcat安装包{#get-installer}

### 下载tomcat{#download}

1. 访问<https://tomcat.apache.org/download-80.cgi>下载需要的tomcat版本，推荐下载：[apache-tomcat-8.5.7x.zip](https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.78/src/)。
2. 或点击[这里](https://www.jianguoyun.com/p/Dbv9Z1sQ3O-gChiY5KwE)下载

### 解压tomcat安装包{#unzip}

解压缩apache-tomcat-8.5.70.zip后：

1. 清理不需要的文件，需要删除webapps目录下的所有子目录，包括`ROOT`、`manager`等
2. 对于macOS或Linux平台，需要让sh文件都是可执行的，在tomcat目录中执行命令行：`chmod +x bin/*.sh`
3. 将WAR包改名为`ROOT.war`放到tomcat的`webapps`目录下

## 设置启动环境变量{#env}

linux、macOS平台在`bin`目录下新建`setenv.sh`文件，内容如下：

```sh
#!/bin/sh

# 设置语言为中文
export LANG=zh_CN.UTF-8

# 设置java最大内存
export JAVA_OPTS="$JAVA_OPTS -Xmx4G"

# 设置工作目录，参考《工作目录和默认数据库配置》
export JAVA_OPTS="$JAVA_OPTS -Dsucc.workdir=/path/to/workdir（请修改这个路径）"

# 设置其他环境变量
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true"
```

windows是`setenv.bat`，内容如下：

```batch
rem 设置java最大内存
set "JAVA_OPTS=%JAVA_OPTS% -Xmx4G"

rem 设置工作目录，参考《工作目录和默认数据库配置》
set "JAVA_OPTS=%JAVA_OPTS% -Dsucc.workdir=C:\path\to\workdir（请修改这个路径）"

rem 设置其他环境变量
set "JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8 -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true"
```

:::warning
windows配置工作目录路径时，盘符需要为大写，如C:\path\to\workdir，否则系统设置会提示异常。
:::

## 安装JDBC驱动{#jdbc-drivers}

见[JDBC驱动安装配置](../basic-install/jdbc-drivers.md)。

## tomcat配置{#config}

### Tomcat安全性设置{#security}

在`/conf/web.xml`中`sesion-config`节点配置`cookie-config`，增强Tomcat安全性：

- `http-only`属性：当设置为`true`时，通过程序(JS脚本、Applet等)将无法读取到Cookie信息，这样能有效的防止XSS攻击。

  ```xml
  <session-config>
    <cookie-config>
      <http-only>true</http-only>
    </cookie-config>
  </session-config>
  ```

- `secure`属性(仅限使用https协议时)：当设置为`true`时，创建的Cookie会被以安全的形式向服务器传输，也就是只能在https连接中被浏览器传递到服务器端进行会话验证，不会被窃取到Cookie的具体内容。

  :::warning
  使用**http**协议的情况下，设置`secure`为`true`会导致Cookie无法发送给服务器，请确认当前使用的协议为**https**
  :::

  ```xml
  <session-config>
      <cookie-config>
        <secure>true</secure>
      </cookie-config>
  </session-config>
  ```

- Tomcat AJP协议文件包含/文件读取漏洞：Tomcat AJP协议存在缺陷，攻击者利用该漏洞可通过构造特定参数，读取webapp下的任意文件。若目标服务器同时存在文件上传功能，攻击者可进一步实现远程代码执行

  **解决方法1**:

  升级Tomcat至`7.0.100`、`8.5.51`、`9.0.31`以后的版本，新版本中已经修复了该漏洞

  **解决方法2**：

  在`/conf/web.xml`中注释AJP配置，禁用AJP协议端口

  ```xml
  <!--
  <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  -->
  ```

- `SameSite`属性：Cookie的SameSite属性用来限制第三方Cookie，从而减少安全风险，可以设置以下3种值：

  - Strict：最为严格，完全禁止第三方 Cookie，跨站点时，任何情况下都不会发送Cookie
  - Lax：规则稍稍放宽，大多数情况也是不发送第三方Cookie，但是导航到目标网址的Get请求除外
  - None：不限制第三方Cookie，前提是必须同时设置`Secure`属性

  可根据实际需求，在`conf/context.xml`中配置属性值

  ```xml
  <CookieProcessor  sameSiteCookies="Strict"/>
  ```

### 优化Tomcat性能{#performance}

优化tomcat性能，避免tomcat出现如下警告：

```bash
21-Nov-2019 15:54:04.600 警告 [TimerService-Timer] org.apache.catalina.webresources.Cache.getResource 无法将位于[/WEB-INF/resources/sysdata/settings/templates/fapp/GZRWGL/package.json]的资源添加到Web应用程序[]的缓存中，因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间。
```

将位于conf目录下的context.xml改为如下：

```xml
<Context reloadable="false" containerSciFilter="jasper">
    <!-- 启动时不要扫描jar，启动时间短一些-->
    <JarScanner scanManifest="false" scanClassPath="false" scanAllDirectories="false" scanAllFiles="false" scanBootstrapClassPath="false" />

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- 配置tomcat缓存静态资源，200mb-->
    <Resources cachingAllowed="true" cacheMaxSize="200000" />
</Context>
```

### 修改Tomcat端口号（可选）{#port}

优化网络传输，修改`/conf/server.xml`中的`Connector`添加自动压缩功能，并按需修改tomcat端口号：

```xml
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               compression="on"
               compressionMinSize="1024"
               compressableMimeType="text/plain,text/json,application/json"
               />
```

### 修改Tomcat会话超时时间（可选）{#timeout}

当用户在一定时间内都未进行操作时，为了更好的利用资源，系统会自动注销该用户，修改`/conf/web.xml`中的`session-timeout`可设置该会话超时时间，默认为30分钟，负数或0为不限制超时时间：

```xml
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
```

## 常见问题{#faq}

### Windows下tomcat控制台乱码{#messycode}

**问题原因**：使用`startup.bat`启动tomcat时，它会读取`catalina.bat`的代码并打开一个新终端运行，而Windows命令行终端的默认编码为`GBK`，与tomcat的默认字符集`UTF-8`不一致

**解决方法**（任选其一）：

1. 修改`/bin/startup.bat`中的启动参数，将`start`修改为`run`，在运行`startup.bat`后不会打开新的控制台

```sh
call "%EXECUTABLE%" run %CMD_LINE_ARGS%
```

2. 修改系统注册表，规定名称为`Tomcat`的命令行终端字符编码为`UTF-8`，具体步骤如下：

   1. `Windows` + `R`打开`运行`，在运行框中输入`regedit`，进入注册表编辑器中
   2. 在**HKEY\_CURRENT\_USER**>**Console**>**Tomcat**(若不存在则创建)中修改`CodePage`为十进制的`65001`
