Tomcatの自分用メモ

新たにサーバ環境構築する場合の備忘録です。
Windows Tomcat版「Configure Tomcat」で設定することを、想定しています

想定している環境

* Tomcat7
* Windows Server
* Java8/Java7


# JavaOptionテキストボックスの中に空行を含めないこと

下記図のように空行があると、空行以下のオプションが無効になります。
![Configure Tomcat.png](https://qiita-image-store.s3.amazonaws.com/0/37903/cf782ccc-086a-805c-8ae2-f798882b3336.png)


# GC ログの設定

公式サイト: http://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/java.html
http://www.oracle.com/technetwork/systems/vmoptions-jsp-140102.html

参考サイト: http://n-agetsuma.hatenablog.com/entry/2014/08/31/152001

### Java8の場合

```
-Xloggc:C:\Program Files\Apache Software Foundation\Tomcat 8.0\logs\gclog\gc_%p_%t.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=1m
```

* ファイル名: `gc_[プロセル番号]_[タイムスタンプ].log`
* `-Xloggc:filename` : ロギングのため、詳細GCイベント情報をリダイレクトするファイルを設定します。このファイルに書き込まれる情報は、ロギングされた各イベントの前の最初のGCイベントから経過した時間での-verbose:gcの出力と似ています。同じjavaコマンドで両方が指定された場合に、-Xloggcオプションは、-verbose:gcをオーバーライドします。
* `-XX:+PrintGCDetails` : すべてのGCで詳細メッセージの出力を有効にします。デフォルトでは、このオプションは無効になっています。
* `-XX:+PrintGCDateStamps`: すべてのGCで日付スタンプの出力を有効にします。デフォルトでは、このオプションは無効になっています。
* `-XX:NumberOfGCLogFiles` : 保持するログファイルの個数 (Set the number of files to use when rotating logs, must be >= 1. The rotated log files will use the following naming scheme, `<filename>`.0, `<filename>`.1, ..., `<filename>`.n-1. )
* `-XX:GCLogFileSize`: GCログのロテートサイズ (The size of the log file at which point the log will be rotated, must be >= 8K.)


# PerGenサイズを256MBに増加
Java7の場合

PermGenのMaxSizeはデフォルト64MBで小さいので、256MBに増やします。
増やさないと、「OutOfMemoryError: PermGen space」が発生するかもしれません。


```
-XX:MaxPermSize=256m
```

公式サイト: http://www.oracle.com/technetwork/systems/vmoptions-jsp-140102.html
-XX:MaxPermSize=64m

>Size of the Permanent Generation.  [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]
>

# デフォルトエンコーディングをUTF-8に設定
特に理由が無い限り、エンコーディングは全てUTF-8に統一しましょう。
この設定をしないと、デフォルトエンコーディングはOSのエンコーディングになります。(WindowsだとShift_JIS)

```js
-Dfile.encoding=UTF-8
```

# デフォルトロケールをen_USに設定

「ブラウザの言語設定が対象外の場合は、英語で表記する」という要件では、デフォルトロケールを英語にする必要があります。

```
-Duser.language=en
-Duser.country=US
 ```

この設定をしないと、デフォルト言語はOSの言語(日本語)になります。

### 使い道
たとえば、リソースファイルが下記ファイル名で、英語用と日本語用が用意されているとします。

* message.properties : 英語メッセージ
* message_ja.properties : 日本語メッセージ

言語設定が"ja"以外は、message.propertiesを参照したい場合に、「デフォルト言語は英語にする」設定が必要です。


# Tomcat Managerの設定
ブラウザからwarファイルをデプロイするため、Tomcat Managerを有効にします。

```xml:conf/tomcat-users.xml
<tomcat-users>
  <role rolename="manager-gui"/>
  <user username="admin" password="admin" roles="manager-gui"/>
</tomcat-users>
```

user:admin, password:adminで設定しています。
下記サイトに接続すると、Tomcat Managerが開きます。
http://[host]:8080/manager/html




# Optionの意味

公式サイト: http://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/java.html

### プラス(`+`) / マイナス(`-`)の意味

>ブール・オプションは、デフォルトで無効にされている機能を有効にするか、デフォルトで有効にされている機能を無効にするために使用します。それらのオプションではパラメータは必要ありません。ブール-XXオプションは、プラス記号を使用して有効にし(-XX:+OptionName)、マイナス記号を使用して無効にします(-XX:-OptionName)。

### `-XX`の意味
拡張オプションを意味します。

>拡張オプションは不用意に使用することはお薦めしません。これらは、特定のシステム要件があり、システム構成パラメータに特権付きアクセスを必要とするようなJava HotSpot仮想マシンの操作の特定の領域のチューニングに使用するための開発者用オプションです。それらは、すべてのJVM実装でサポートされている保証はなく、変更されることがあります。拡張オプションは-XXから始まります。

### `-Dproperty=value`の意味

>システム・プロパティの値を設定します。property変数はプロパティの名前を表すスペースなしの文字列です。value変数はプロパティの値を表す文字列です。valueがスペースのある文字列の場合、それを引用符で囲みます(-Dfoo="foo bar"など)。



# Tomcatの起動時に`A child container failed during start`というエラーが出た場合

`<Context>`の`docBase`属性に存在しないパスを指定すると、Tomcat起動時に以下のエラーが出ます。

```txt
情報: Starting Servlet Engine: Apache Tomcat/8.0.39 [金 3 31 00:47:18 JST 2017]
重大: A child container failed during start [金 3 31 00:47:18 JST 2017]
重大: A child container failed during start [金 3 31 00:47:18 JST 2017]
重大: The required Server component failed to start so Tomcat is unable to start. [金 3 31 00:47:18 JST 2017]
情報: Pausing ProtocolHandler ["http-nio-8080"] [金 3 31 00:47:18 JST 2017]
情報: Pausing ProtocolHandler ["ajp-nio-8009"] [金 3 31 00:47:18 JST 2017]
情報: サービス Catalina を停止します [金 3 31 00:47:18 JST 2017]
情報: Destroying ProtocolHandler ["http-nio-8080"] [金 3 31 00:47:18 JST 2017]
重大: Failed to destroy end point associated with ProtocolHandler ["http-nio-8080"] [金 3 31 00:47:18 JST 2017]
```

```xml:server.xml
<Context path="/sample" docBase="C:\tmp" /> <!-- 存在しないパスだとエラー -->
```