« オールシーズンタイヤを買いました | メイン | 包丁の簡単な研ぎ方 »

2017年12月17日 (日)

サーバー復旧奮戦記(6.systemd、tomcat を非root で自動起動)

Unit ファイルに User=tomcatUser を記述したら動かない。。。ググりまくった結果、
「User= を記述した場合は Unit ファイルは /etc/systemd.system/ にではなく /usr/lib/systemd/system/ 以下に置く必要がある」というのを見つけました。/usr/lib/systemd 以下に system フォルダがなかったので作成して tomcat.service を格納してテスト。
結果はNG。起動スクリプトを spawn する時に「権限がない」のまま。権限はあるのに・・どういう事か・・
tomcat8.service の所有者が tomcatUser ではなかったので、苦しまぎれに所有者を tomcatUser に変更してテスト。

user 権限で tomcat が動きました。やったね。ところが、クライアントから接続できない。

原因は起動スクリプト内で iptables コマンドを用いて port80 を 8080 に、443 を 8443 にフォワーディングしていたからでした。iptables コマンドって、root でないと動かないんだよね。自動起動にばかり目が行っていたので、気付くのに時間がかかってしまいました。ログを見たら、やはり iptables の行で「権限がない」で失敗していました。

iptables で設定した値は、システムを止める(再起動する)と消えてしまうんですね。どうするか暫く考えて、結局 iptables-persistent をインストールしました。これを使う予定はないのですが、インストール時に iptables の設定内容を保存してくれます。これでOK。

tomcat を自動起動する・・・まとめ
・/etc/init.d 以下に起動スクリプトを記述するのではなく、systemd のスタイルでやる。
/etc/init.d 以下の起動スクリプトは、systemd がそれらしく動かしてくれるが、なんか動きが変。起動スクリプト自体はどこにあってもOKらしいので、/etc/init.d/ 以下に置いても良さそう。(確認していません)私は別のフォルダを作って、そこに格納しました。

・シェルから /etc/init.d/tomcat start とした時と systemctl start tomcat とした時では動きが違うみたい。どこがどう違うとは説明できないのですが・・・そこまでは記録してないので・・・ごく基本的な起動のデバッグ、テストならばシェルから /etc/init.d/tomcat start でいいと思いますが、自動起動のための作業には適当ではないようです。

---- 以下、非root ユーザーで自動起動する場合 ----
・ユーザー権限で tomcat を起動するには Unit ファイルに User=tomcatUser を記述し、それを /usr/lib/systemd/system 以下に置く。/etc/systemd/system 以下に同名の Unit ファイルがあると、/etc・・・のものが優先されるので、削除する。
起動スクリプト内で su tomcatUser -c /etc/init.d/・・・とするのはお勧めしません。Unit に User=tomcatUser を記述したものが動いたので、su tomcatUser として動くかは確認していません。

・execStart= に記述する起動スクリプトの所有者が tomcatUser である必要がある。所有者が tomcatUser でない場合、起動スクリプトを起動する時「権限がない」が報告されました。rwx 権限があってもNGでした。

・root 以外で実行すると、port80, port443 にバインドできません。server.xml <connector> の 8080, 8443 に proxyPort="80" などと設定し、port80, port443 のコネクタは削除する。

・iptables コマンドを用いて port80 ---> port8080, port443 ---> port8443 のようにフォワーディングする設定をする。iptables での設定内容はメモリー上に記憶されているだけなので、システム停止時に消えてしまいます。iptables は root でしか実行できないので、起動スクリプト内に記述しても失敗します。
設定内容を保存するには iptables-persistent をインストールするのが簡単です。
iptables の設定を行い、動作を確認したら iptables-persistent をインストールします。インストールした時の設定を保存してくれます。

コメント

コメントを投稿