しいしせねっとわーくAmazon.co.jp アソシエイト
[しいしせねっと] [Java]

Tomcat お気楽設定

いろいろ消えているので復活予定。

mod_jk とか TLS とかMavenで自動配備とか

blog.developer.jp に昔Tomcatを設定した記事があるのですが、ちょっと違うかなと思ったりでこちらに書き直し中。

今回はRaspberryPi OSで管理されているcertbotとTomcatでどうなるのか挑戦。セキュリティ外して動かす野良Tomcatと違ってセキュリティ的な制限がいくつかありそうです。

ヒント的なものなので詳細はぐぐればよいよい。

バージョンを決める

Java EE と Jakarta EEの移行は段階的に進められていて、Jakarta EE 8 は Java EE 8とパッケージが同じままでプロジェクトを引き継ぎました。Jakarta EE 9でjakarta 系のパッケージ名に移動します。Jakarta EE 10以降でJakarta EEの機能が入るようになります。

Tomcatは Java EE系がTomcat 9まで、Jakarta EE系(9以降)がTomcat 10から、新しいものならTomcat 10.1以降対象にした方がよいかも。

両方必要な場合は別々の環境に入れるかポート番号の調整などが必要です。

Java EE/Jakarta EEとTomcat
  JDK Tomcat Web API Servlet JSP WebSocket
J2EE 8 / Jakarta EE 8 8 9 8 4.0 2.3 1.1
Jakarta EE 9 8 10 9 5.0 3.0 2.0
Jakarta EE 10 11 10.1 10 6.0 3.1 2.1
Jakarta EE 11 21 11.0 11 6.1 4.0 TBD

Apache Tomcat® - Which Version Do I Want?

インストールの確認

RaspberryPi に Apache HTTPdなしでTomcat と Let's Encrypt なマルチドメイン環境を作ってみます。

Java EE (Jakarta EE 8まで)な場合は Tomcat 9、Jakarta EE 9以降の場合は Tomcat 10.1以降を選びます。選べるのかな。

IPv6対応にしておくとルータのいろいろをパススルーにして便利だったりします。

RaspberryPi を用意しました。OSインストール毎にIPv6アドレスは変わってしまうかもしれません。IPv4はDHCPなどで割り振るとよいです。

サーバ名.local なアドレスも使えるかもしれませんがTLS用には別の名前を使いましょ。

DNSにIPv6で登録しておくのも便利です。

RaspberryPi OSは Javaが入っていないとJDK 11がインストールされてしまいます。JDK11は64bit CPUでしか使えないので 32bit環境のZero Wなどでは先にJDK 8をインストールしておきます。

RaspberryPiやUbuntu などはapt-get, CentOS Stream やRedHat は dnfだったり yum だったりします。パッケージ名もディストリビューションごとに違うのでRaspberryPi用を参考程度に。Tomcatの基本配置を知っている前提ですが、バラバラに配置されてしまう環境ではtar.gzなどからTomcatを入れるのもよいです。

# apt-get install openjdk-8-jdk 詳細は忘れた

# apt-get install tomcat9 tomcat9-admin くらい ほかに examples や docsなどがあるのかも

# apt-get install certbot か letsencrypt 今どきはhttps が必須かもしれない。

RaspberryPi などでは /var/lib/tomcat9 にインストールされている。

設定 ファイルは /etc/tomcat9 にリンクもある

ログは /var/log/tomcat9 ぐらい

開始と終了

# systemctl start tomcat9

# systemctl stop tomcat9

# systemctl restart tomcat9

ぐらいを覚えておくとよいです。パッケージを使うメリットはこれくらいかもしれません。Cent OS 7以降ぐらいも同じです。9がつかない環境もあります。tar.gzアーカイブから入れた場合は bin/startup.sh や bin/shutdown.sh を使うくらいでいいかもしれません。

port 8080 でIt works ! が見えたでしょうか。

セキュリティの確認

Raspberry PiのTomcat 9の注意点 Linux 標準で管理、インストールされているものの中には書き込み制限のついているものもあるので知らないと動かなかったりします。

/lib/systemd/system または /etc/systemd/system の tomcat9.service [Service] の下に # Security の項目があります。

[Service]
# Configuration
...


# Security
...
ProtectSystem=strict
ReadWritePaths=/etc/tomcat9/Catalina/
ReadWritePaths=/var/lib/tomcat9/webapps/

ProtectSystem が strict だと ReadWritePaths= で指定されているところ以外は書き込み禁止になっているのでアクセス権限があってもtomcatからは書き込めない。

webapps などの位置を追加・変更した場合はそこにも書き込み権限をつける必要があるので要注意です。

# systemctl daemon-reload

で読み込み直すのかな

つけないままwarを配備しても展開されないまま使えなくはない。

TomcatのmanagerとMaven で配備する場合などは設定が必須。

Maven で管理

Maven では warファイルでWebサイトを作成できます。webappsを変更している場合は↑セキュリティの設定は必須です。

Tomcat側は tomcat9-admin 的なパッケージが必要です。アーカイブ版(tar.gz, zip配布のもの)は全部入っているので追加要素はありません。

Mavenでの管理には tomcat7-maven-plugin を使います。tomcat7は7以降ぐらいの意味ですたぶん。

 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
      <url>http://example.siisise.net/manager/text</url>
      <server>1st</server>
      <path>/</path>
    </configuration>
  </plugin>
 </plugins>
</build>

を pom.xml の <plugins> の中に追加していきます。

Tomcat側では manager というものが標準で入っているので使えるようにしていきます。

Tomcat ファイルの編集

tomcatのconf/tomcat-users.xml の編集が必要です。

ユーザ名、パスワード、権限を設定します。

コメントを外しつつ、

<user username="netbeans" password="強そうなパスワード" role="manager-script"/>

的な行を追加します。netbeansのところはツールなどの任意のユーザ名、パスワードは外部から推測しにくい10文字以上くらいのものに変更してください。自分で使わないものでもいいです。

<role rolename="manager-script"/>は追加しなくても大丈夫なようです。

manager-gui だと manager/html が使えます。 manager-script だとスクリプト用管理ページが使えます。maven や netbeans というユーザをつくり manager-scriptをつけておくとよいです。

conf/Catalina/ドメイン名/manager.xml を置いてmanager 機能を有効にします。RaspberryPi の場合は

<?xml version="1.0" encoding="UTF-8"?>
<!--
ライセンス(略)
-->
<Context path="/manager"
    docBase="/usr/share/tomcat9-admin/manager"
    antiResourceLocking="false" privileged="true" />

のようになっているファイルがwebapps か conf/Catalina のどこかにあるので配置します。

さて、pom.xml の<configuration> の中身は。

<configuration>
  <url>http://サーバ/manager/text</url>
  <server>1st</server>
  <path>/</path>
</configuration>

のようになります。url はmanager のpath に /text を加えたものです。https では使えないかもしれません。

<username> と <password> は settings.xml の方に書く方が安全かもしれません。pom.xml の <server>と settings.xml の <id> をそろえて次のようにします。

<servers>
  <server>
    <id>1st</id>
    <username>netbeans</username>
    <password>強そうなパスワード</password>
  </server>
</servers>

初回配備は

mvn tomcat7:deploy

です。2回目以降は

mvn tomcat7:redeploy

とします。