CentOS 7でTomcat 7

あちこちでそれなりに話題になっているけど、先日にCentOS 7がリリースされた。

CentOS 7にはifconfigコマンドが無いなど、結構アグレッシブにモリモリと変わっている部分も多いけど、その辺のレポートは色々あるのでわざわざ私は書かなくて良いだろう。

そこで、この記事ではCentOS 7のTomcatに絞って変更点をまとめておく。なお本記事では、以下のバージョンのCentOSで調査しました。

復習:CentOS 6でTomcat

CentOS 7でのTomcatを見る前に、まずCentOS 6ではどうだったかをちょっとおさらいしておく。

CentOS 6の公式rpmTomcatは長らくVer.6(Tomcat 6.0.24)で放置されており、Tomcat 7.xは提供されていない。何度かRedHatのSupport Forumで「Tomcat 7.xはいつ対応するの?」と質問は上がっていたが、そのたびに「まぁ、できたらね」ではぐらかされるのが風物詩だった(たぶん)。

[ozuma@cent6 ~]$ yum info tomcat6
...(略)...
Name        : tomcat6
Arch        : noarch
Version     : 6.0.24
Release     : 72.el6_5
Size        : 91 k
Repo        : updates
Summary     : Apache Servlet/JSP Engine, RI for Servlet 2.5/JSP 2.1 API
URL         : http://tomcat.apache.org/
License     : ASL 2.0
Description : Tomcat is the servlet container that is used in the official Reference
...(略)...

ということで、RedHat/CentOSTomcatを構築する場合には、直接tar.gzファイルを拾ってきて配置するケースが多かった。また、人によってはJPackageのTomcat7のrpmを使うこともあったようだ。

また、RedHat/CentOS公式リポジトリTomcatを入れるとOpenJDKが使われてしまうので、Oracle Javaを別に手動で入れる……という儀式が必要なこともよく知られている。

以上、この辺がCentOS 7でどう変わったかをまとめる。

CentOS 7の公式リポジトリTomcat

結論から言うと、CentOS 7では公式リポジトリTomcat 7.0.42が採用されている。そのため、何も考えずにyum installだけでTomcat 7が入るようになった。実にめでたい。

[ozuma@centos7 ~]$ yum info tomcat
...(略)...
Name        : tomcat
Arch        : noarch
Version     : 7.0.42
Release     : 6.el7_0
Size        : 84 k
Repo        : updates/7/x86_64
Summary     : Apache Servlet/JSP Engine, RI for Servlet 3.0/JSP 2.2 API
URL         : http://tomcat.apache.org/
License     : ASL 2.0
Description : Tomcat is the servlet container that is used in the official Reference
...(略)...

ただし、Tomcat 7を入れると同時に入るJavaは、以下に見えるようにOpenJDK(パッケージ名:java-1.7.0-openjdk)である。

[ozuma@centos7 ~]$ yum deplist tomcat
...(略)...
package: tomcat.noarch 7.0.42-6.el7_0
...(略)...
  dependency: java >= 1:1.6.0
   provider: java-1.7.0-openjdk.x86_64 1:1.7.0.65-2.5.1.2.el7_0
...(略)...

これは前から知られている「ねじれ」で、Tomcatプロジェクトは公式には「Oracle Javaで動かしてね」と言っている一方(RUNNING.txt)、RedHat/CentOSは「Tomcatパッケージで公式サポートするJavaは、OpenJDKです」と言っているわけだ。

実際の現場では、まだまだOracle Javaが主流で、OpenJDKでテストされているプロダクトは少ないだろう(む、私が時代遅れなだけか?)。というわけでせっかくTomcatyum一発で入るようになりはしたものの、Javaは手動インストールがまだ必要である。

なお、これでCentOS 7 + Tomcat 7の構成が向こう数年で増えるだろうが、現在のTomcat最新版は8.0系である。はてさて、どうなることやら。

tomcatユーザのuid

CentOS 6の時から変わらず、CentOS 7でも、Tomcatパッケージインストール時に作成されるtomcatユーザのuidは91である。

[ozuma@centos7 ~]$ id tomcat
uid=91(tomcat) gid=91(tomcat) groups=91(tomcat)

しかし実は、これも前から知られている「ねじれ」である。何が言いたいのかと言うと、CentOSでの基本的なuidは、以下のuidgidというテキストファイルとして示されている。

[ozuma@centos7 ~]$ head /usr/share/doc/setup-2.8.71/uidgid
NAME	UID	GID	HOME		SHELL	PACKAGES
root	0	0	/root		/bin/bash	setup
bin	1	1	/bin		/sbin/nologin	setup
daemon	2	2	/sbin		/sbin/nologin	setup
sys	-	3	-		-	setup
adm	3	4	/var/adm		/bin/bash	setup
tty	-	5	-		-	setup
...(略)...
tomcat	53	53	/var/lib/tomcat		/sbin/nologin	tomcat
...(略)...

見ての通り、本来ならばtomcatユーザはuidに53を使うべきなのだが……。ここで、rpmでのインストール時に実行されるスクリプトレットを見てみよう。rpmコマンドに、-qオプションと--scriptsオプションを付けて、preinstallのscriptletを確認すれば良い。

[ozuma@centos7 ~]$ rpm -q --scripts tomcat
preinstall scriptlet (using /bin/sh):
# add the tomcat user and group
/usr/sbin/groupadd -g 91 -r tomcat 2>/dev/null || :
/usr/sbin/useradd -c "Apache Tomcat" -u 91 -g tomcat \
    -s /sbin/nologin -r -d /usr/share/tomcat tomcat 2>/dev/null || :
...(略)...

見ての通り、ここではuidが91で決め打ちされている。ずれてますね。

が、もはや「CentOStomcatユーザは、uid=91」で世界的にも共通認識ができちゃったっぽいので、このねじれを気にしている人はもはや世界でも私一人である(言い過ぎか?)。なので皆さんも無視していいのですが、一応小ネタと言うことで。

CentOS 7でTomcat 7の初期設定

デフォルトでは、8080/tcpが空いていないため接続テストもできない。iptablesで空けてやらねばならないが……CentOS 7からは、iptablesではなくfirewalldを使うようになったため、これをsystemctlコマンドで操作する。

# systemctl stop firewalld.service

とりあえずiptables stop相当のことをしたいなら、上記のようにfirewalld.serviceをstopする。でもこんなことは本当はしちゃいけないので、きちんと設定するために、firewalldで8080/tcpを空けてください。とてもややこしいですが。


無事起動しました。

ディレクトリ構成

この辺は、CentOS 6と変わっていない。

感想

Tomcat7が、初期設定のままyum一発で入るようになったのは良かった。iptablesが無いので相当違和感があるが、まぁこれは慣れるだろう(か?)。