さくらVPSのCentOS7にTomcat8をインストール
せっかくさくらVPSを契約したので(まだお試し期間中ですが)、Tomcatを入れてみることにしました。昔WindowsではTomcatをよく使ってたんですが、Linuxでやると勝手が違いました。
まとめ
- yumのリポジトリ―にないっぽい?ので、手動でダウンロードしてインストール
- systemctlのしきたりにのっとってサービスに登録
- firewalldで8080番ポートを開ける
- Tomcat起動が無茶遅いことへ対処
- 80番でアクセスしたいのでfirewalldでポートフォワードの設定
Tomcatのダウンロードとインストール
TomcatのWebサイトに書いてるダウンロードURLからダウンロードして、展開するだけっぽいです。お手本にならってインストール先は /opt 以下に。今回はrootじゃなくてちゃんとtomcatユーザー作りましたよ。
ここではダウンロード、展開とsystemctlのサービスの登録までで、ポート関連は次。
8080ポートを開ける
Tomcatのデフォルトポートは8080なので、8080番ポートを開ける必要があります。ここを参考にしてやりました。
CentOS7 で Tomcat のポートを解放する Firewall 設定方法: 私的な技術メモ
パスを間違えてて無駄にはまる
/etc/systemd/system/tomcat.service のExecStartとかに記述するtomcatのパスを間違えてて、無駄にはまりました。Linuxビギナーだとエラーを見てもtomcat.shが呼ばれてさえいないということが分からないんですよね~
Tomcat自体のログはTomatをインストールしたディレクトリの下の log/catalina.out なので、少なくともTomcatが起動されようとしていれば、ここにログが記録されるはずです。↓Tomcatのログの場所
/opt/apache-tomcat-xxx/logs/catalina.out
とりあえず、さくらVPSのCentOS7上でTomcat8を起動して、うちのブラウザからアクセスできました。
Tomcatの起動が無茶遅い
一応ブラウザからアクセスできたはできたんですが、Tomcatを再起動したときとかの起動が無茶苦茶遅いです。catalina.outを見てみると、ROOTのデプロイ処理のとこで5分くらい止まっています。
というわけでエラーメッセージでぐぐったら、回答発見。グーグルさん便利だわ~
HowTo/FasterStartUp - Tomcat Wiki
セッションIDの初期化に使われるSecureRandomのrandomというのが無茶苦茶遅いらしい。このアルゴリズムをあまり厳密でない?urandomにすればOKとのこと。
JREのjava.securityを書き換えてもいいらしいけど
ここでは、以下のページを参考にTomcatにわたすJVMのパラメータで指定することにしました
How To Install Apache Tomcat 8 on CentOS 7 | DigitalOcean
/etc/systemd/system/tomcat.service に以下の1行を追加
[Unit]
Description=Apache Tomcat 8
After=syslog.target network.target
[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/apache-tomcat-xxx/tomcat.pid
RemainAfterExit=yes
Environment='JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom'
ExecStart=/opt/apache-tomcat-xxx/bin/startup.sh
ExecStop=/opt/apache-tomcat-xxx/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat-xxx/bin/shutdown.sh;/opt/apache-tomcat-xxx/bin/startup.sh
[Install]
WantedBy=multi-user.target
Tomcatに80番ポートでアクセスする
Apache(HTTPサーバー)と連携とかさせずに、Tomcat単体で運用したいと思ったのですが、Tomcatのserver.xmlのポートを8080から80に変えるだけじゃダメっぽい。この記事によると、80番は特別なものらしく、ユーザ権限では使わしてくれないらしい。
Tomcatサーバに80番ポートでアクセスする。 | 三度の飯とエレクトロン
ポートフォワードでやればいいらしいけど、iptablesじゃなくてfirewalldの例が見つからない。Tomcatの例そのものはなかったけど、このあたりを参考にやりました。
centos7 - How to port forward with firewalld depending on source IP - Server Fault
CentOS7のfirewalldをまじめに使うはじめの一歩(systemdも少し) - Qiita
https://fedoraproject.org/wiki/Firewalld?rd=FirewallD
これでめでたく、80番ポートでTomcatにアクセスできました!
Tomcatのsever.xmlはいじってなくてproxyPortの記述とかしてないんですが、まだhelloサーブレットぐらいしか作って動かしてないので、もしかしたら必要なのかも。
あと、この前にApache(tomcatじゃなくてhttpd)が動いてるときはsystemctlでhttpdを停止して自動起動も無効にしておきます。
(追記)ルールを削除する場合は、addの部分をremoveにしてやるとOKでした。あと--list-allコマンドで表示されるのはリロード後かも。
[root@xxx ~]# firewall-cmd --permanent --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
参考 Introduction to FirewallD on CentOS
To remove the rules, substitute --add with --remove. For example...
作ったアプリの配置
自分で作ったアプリは、Tomcatをインストールしたディレクトリの下のwebappの下にディレクトリを作って、その下に必要なファイルをおけば、他に設定を記述しなくても動きます。
/opt/apache-tomcat-xxx/webapps
docs/
exampes/
...
web1/ ←webappsの下に自分のフォルダを作る
hoge.html
WEB-INF/
classes/
web1というディレクトリを作って、その下にhoge.htmlを作ったら、ブラウザから
http://xxxxx/web1/hoge.html
のURLでアクセスできます。
サーブレットなどJavaのクラスファイルはWEB-INF/classes以下に置きます。サーブレットもWebアノテーション( @WebServlet("/hello")とか )使えますし、比較的簡単。