tomcatをインストールしてみる。

# 1.はじめに
APミドルと言ったら、「tomcat！！」ということで、tomcatを触ってみたいと思います。
完全に初心者向けです。（私が初心者なので）
■やろうとしていること
・インストール
・jvmメモリ設定
・warファイルデプロイ
・パラメータいじってみる

# 2.tomcatインストール
まずは、tomcatのインストールします。yumで
```bash
(root)# yum install tomcat
(~~~略~~~)
Downloading packages:
tomcat-7.0.76-16.el7_9.noarch.rpm                          |  93 kB   00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : tomcat-7.0.76-16.el7_9.noarch                   1/1
  検証中                  : tomcat-7.0.76-16.el7_9.noarch                   1/1

インストール:
  tomcat.noarch 0:7.0.76-16.el7_9

完了しました!
```
無邪気に、サービス開始してみる。
```bash
(root)# systemctl start tomcat
(root)# systemctl status tomcat
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since 土 2022-02-26 15:44:25 JST; 1s ago
 Main PID: 25128 (java)
   CGroup: /system.slice/tomcat.service
           mq25128 /usr/lib/jvm/jre/bin/java -Djavax.sql.DataSource.Factory=o...

 2月 26 15:44:25 agent systemd[1]: Started Apache Tomcat Web Application C...r.
 2月 26 15:44:25 agent server[25128]: Java virtual machine used: /usr/lib/...va
 2月 26 15:44:25 agent server[25128]: classpath used: /usr/share/tomcat/bi...ar
 2月 26 15:44:25 agent server[25128]: main class used: org.apache.catalina...ap
 2月 26 15:44:25 agent server[25128]: flags used: -Djavax.sql.DataSource.F...ry
 2月 26 15:44:25 agent server[25128]: options used: -Dcatalina.base=/usr/s...er
 2月 26 15:44:25 agent server[25128]: arguments used: start
Hint: Some lines were ellipsized, use -l to show in full.
```
起動できた。（当たり前）
# 3.jvmメモリ設定
tomcatの起動パラメータを設定して、jvmの初期メモリ/最大メモリを設定します。
よくjavaが"outofmemory"発生してお亡くなりになるので、すぐに拡張できるように。
```bash:/usr/share/tomcat/conf/tomcat.conf
CATALINA_OPTS="-server -Xm1024m -Xms1024m -Xss512k"
```

```bash
###再起動する前
(root)# ps -aux | grep tomcat
tomcat   25128  0.9 17.1 3680480 83708 ?       Ssl  15:44   0:06 /usr/lib/jvm/jre/bin/java -Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start

###再起動
(root)# systemctl restart tomcat

###再起動した後
(root)# ps -aux | grep tomcat
tomcat   25246 24.3 32.2 4586128 157100 ?      Ssl  15:58   0:06 /usr/lib/jvm/jre/bin/java -Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory -server -Xmx1024m -Xms1024m -Xss512k -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
```
tomcat再起動後に、ちゃんと「/usr/lib/jvm/jre/bin/java -server -Xmx1024m -Xms1024m -Xss512k」という設定が反映されているのでOK！
# 4.warファイルデプロイ
WARは「Web application ARchive」または「Web Application Resource」の略でWebアプリを構成するモジュールを固めたファイル。
warを作成できる技術がないので、以下のサイトからダウンロードします。
[https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/](https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/)

以下のディレクトリにダウンロードしたwarをコピーします。
/usr/share/tomcat/webapps/

コピーすると、自動的にwarが展開されて、ディレクトリが作られます。
```bash:/usr/share/tomcat/webapps/
(root)# ll /usr/share/tomcat/webapps/
合計 8
drwxr-xr-x 5 tomcat tomcat   86  2月 26 18:42 sample
-rw-r--r-- 1 root   root   4606  2月 28  2022 sample.war
```
http://192.168.1.150:8080/sample/にアクセスします。
※warデプロイ前
![000084.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/705fca86-50aa-2b2a-f65f-d4849d19a2ca.jpeg)
※warデプロイ後
![000085.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532143/71760b36-f234-b0b7-fead-ef8f266ac729.jpeg)
トム猫来ました！！
ちなみに、war置くだけでunpack＆デプロイされるのは、/etc/tomcat/server.xml内に記載されている「unpackWARs="true"」「autoDeploy="true"」（両方ともデフォルト）が効いている。
```bash:/etc/tomcat/server.xml
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
```
### unpackWARs
自動的にwarファイルを展開してくれるかどうかを設定する。
以下は、「unpackWARs=false」でwarをコピーして、curlでアクセスした結果です。
warファイルを展開しなくても、tomcatがデプロイしてくれました。
```bash
(root)#ll /usr/share/tomcat/webapps/
合計 8
-rw-r--r-- 1 root root 4606  2月 28  2022 sample.war

(root)# curl -v http://192.168.1.150:8080/sample/
* About to connect() to 192.168.1.150 port 8080 (#0)
*   Trying 192.168.1.150...
* Connected to 192.168.1.150 (192.168.1.150) port 8080 (#0)
> GET /sample/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.1.150:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< ETag: W/"636-1185780388000"
< Last-Modified: Mon, 30 Jul 2007 07:26:28 GMT
< Content-Type: text/html
< Content-Length: 636
< Date: Sat, 26 Feb 2022 10:35:40 GMT
<
<html>
<head>
<title>Sample "Hello, World" Application</title>
</head>
<body bgcolor=white>

<table border="0">
<tr>
<td>
<img src="images/tomcat.gif">
</td>
<td>
<h1>Sample "Hello, World" Application</h1>
<p>This is the home page for a sample application used to illustrate the
source directory organization of a web application utilizing the principles
outlined in the Application Developer's Guide.
</td>
</tr>
</table>

<p>To prove that they work, you can execute either of the following links:
<ul>
<li>To a <a href="hello.jsp">JSP page</a>.
<li>To a <a href="hello">servlet</a>.
</ul>

</body>
</html>
* Connection #0 to host 192.168.1.150 left intact
```
ちなみにwebapps配下に同じ名前の「ディレクトリ」と「war」があった場合は、ディレクトリを優先的に読みに行ってくれるみたい。

### autoDeploy
Tomcat起動中に自動的にアプリをデプロイしてくれる設定である。
Tomcatを再起動することなく、アプリをバージョンアップには、これをtrueにする必要ある。
autoDeployが実行されるトリガーは、tomcatが$TOMCAT_HOME/webappsにあるwarファイルを常に監視していて、タイムスタンプの更新があったら再デプロイ、もしくは、新規のwarファイルが置かれたら新しいアプリとしてデプロイしてくれる動きみたい。

注意点があって、Tomcatが停止している状態から起動した場合には、このautoDeployは走らないで通常のデプロイがされる。
つまり、バージョンアップしたいwarと同じ名前のディレクトリが既にある場合、アプリはバージョンアップせず、既に存在するディレクトリのアプリを読み取りに行く。
これだと、アプリがバージョンアップされないので、要注意です。

じゃあ、、どうすんの？？？
⇒手順の中で、ディレクトリ削除した後にwarを書き変えちゃいましょう。
そうすれば、autoDepployでも、停止→起動でもどちらでも新しいアプリはデプロイされるので、ミスが少なくなる。

# 5.パラメータいじってみる
/usr/share/tomcat/conf/配下のファイルのパラメータを見ていきます。
## web.xml
Webアプリケーションを動かすために関係する環境（サーブレット、HTMLファイルなど）を設定するためのファイル。
中身はこんな感じ。
```bash:/usr/share/tomcat/conf/web.xml
<web-app>
   <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</webapp>
```
以下の2つが大事な要素です。
・servlet要素\<servlet\>
・servlet-mapping要素\<servlet-mapping\>
#### \<servlet\>要素
作成したjavaプログラムを定義します。
例えば、「HelloWorld.java」を作った場合、\<servlet-class\>に「HelloWorld」を登録します。
また、\<servlet-name\>にはわかりやすい任意の名前を付けます。今回は「hello」にしてます。
```bash:/usr/share/tomcat/conf/web.xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
```
#### \<servlet-mapping\>要素
このhelloに対してURLのマッピング（割り当て）作業を行います。
例えば、greetingという名前のURLにしたい場合は、以下のようにマッピングを行います。
```bash:/usr/share/tomcat/conf/web.xml
<servlet-mapping>
<servlet-name>
hello
</servlet-name>
<url-pattern>
/greeting
</url-pattern>
</servlet-mapping>
```
この設定によって、http://\<IPアドレス\>:8080/greetingにアクセスすると、上で定義した「HelloWorld.java」が呼び出されます。
## server.xml
Tomcatサーバの動作を定義する設定ファイルです。他にも設定ファイルはありますが、Tomcatに関する主要な設定はこのファイルで行います。
```bash:/usr/share/tomcat/conf/server.xml(抜粋版)
?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <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"
              description="User database that can be updated and saved"
              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>
```
\<Connector>タグを見ていきます。リクエスト処理を行うために定義します。
【port】コネクションを待ち受けるTCPのポート番号を設定。
【protocol】流れてくるトラフィックを処理するプロトコルを設定。初期設定はHTTP/1.1コネクタが設定される。
【connectionTimeout】コネクションを受け付けてからコネクタが待ち受ける時間を設定。単位はミリ秒
【maxThreds】このコネクタで処理できるリクエスト処理スレッドの最大数を設定。
```bash:/usr/share/tomcat/conf/server.xml(connectorタグ抜粋)
 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
```


\<host>タグを見ていきます。仮想ホスト(バーチャルホスト)別にHostタグを明示します。デフォルトでは、localhostの１つが定義されています。
HostタグのappBase属性は、仮想ホスト別に管理するWebアプリを配備するディレクトリを指定しています。appBase属性は、絶対パスか%CATALINA_BASE%からの相対パス形式で指定します。
```bash:/usr/share/tomcat/conf/server.xml(hostタグ抜粋)
<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>
```
## tomcat.conf
yumでインストールしたtomcatでは、以下のファイルに環境変数や起動パラメータを設定する。
jvmの起動メモリを変更したいときは、「CATALINA_OPTS="-Xmx128M -Xms64M"」を追加する。
```bash:/etc/tomcat/tomcat.conf
# This variable is used to figure out if config is loaded or not.
TOMCAT_CFG_LOADED="1"

# In new-style instances, if CATALINA_BASE isn't specified, it will
# be constructed by joining TOMCATS_BASE and NAME.
#TOMCATS_BASE="/var/lib/tomcats/"

# Where your java installation lives
JAVA_HOME="/usr/lib/jvm/jre"

# Where your tomcat installation lives
CATALINA_HOME="/usr/share/tomcat"
CATALINA_BASE="/usr/share/tomcat"

# System-wide tmp
CATALINA_TMPDIR="/var/cache/tomcat/temp"

# You can pass some parameters to java here if you wish to
#JAVA_OPTS="-Xminf0.1 -Xmaxf0.3"

# Use JAVA_OPTS to set java.library.path for libtcnative.so
#JAVA_OPTS="-Djava.library.path=/usr/lib"

# Set default javax.sql.DataSource factory to apache commons one. See rhbz#1629162
JAVA_OPTS="-Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory"

# You can change your tomcat locale here
#LANG="en_US"

# Run tomcat under the Java Security Manager
SECURITY_MANAGER="false"

# SHUTDOWN_WAIT has been deprecated. To change the shutdown wait time, set
# TimeoutStopSec in tomcat.service.

# If you wish to further customize your tomcat environment,
# put your own definitions here
# (i.e. LD_LIBRARY_PATH for some jdbc drivers)
CATALINA_OPTS="-server -Xmx1024m -Xms1024m -Xss512k"
```
# 6.参考
以下のサイトを参考にさせていただきました。
[ろば電子が詰まつてゐる](https://ozuma.hatenablog.jp/entry/20131227/1388151846)