CentOSの6から7への移行時、何度かつまづいた箇所があったので紹介します。
前提知識
6と7のミドルウェアの違いやSystemdの基本的な使い方はこのあたりを参考にしてください。
落とし穴1: 消える/tmp
CentOS7にtmpwatchは入っていません。
だからといって何も考えずに/tmp下にキャッシュ等の一時ファイルを吐き出していると、
いつの間にか消去されていて泣くハメになります。
CentOS7にはtmpwatchはありませんが、その代わり
systemdの systemd-tmpfiles-clean.timer がその役割を担っています。
このサービスはtmpwatchと同じように、/tmp下に使われていないファイルを一定期間経つと削除します。
消されたくないファイルがあるのなら/etc/tmpfiles.d/
に設定ファイルを配置しましょう。
$ cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/
$ vi /etc/tmpfiles.d/tmp.conf
除外設定を追記
~~
x /tmp/cache*
落とし穴2: アクセス出来ない/tmp
使っているFWによっては、セッションファイルを/tmpに吐き出すこともあるでしょう。
もちろん/tmp/hoge_app/sessionディレクトリを作ってそこに吐き出します。
_人人人人人人人人人人人人人人人人人人_
> 対象のディレクトリが存在しません <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
SystemdのServiceにはPrivateTmpというオプションがあります。
そのService専用の/tmpと/var/tmpの領域を用意する機能です。
デフォルトで有効になっています。
/tmp/hoge_app/sessionディレクトリはService専用の/tmpには存在しません。
PrivateTmpを無効にするには、Serviceの設定を変更する必要があります。
例えばphp-fpmの設定ファイルは/usr/lib/systemd/system/php-fpm.service
です。
このファイルを/etc/systemd/system/
下にコピーし、それを修正します。
$ cp /usr/lib/systemd/system/php-fpm.service /etc/systemd/system/
$ vi /etc/systemd/system/php-fpm.service
以下のように修正
# PrivateTmp=true
PrivateTmp=false
Service設定ファイルの修正後は以下のコマンドで設定をリロードします。
$ systemctl daemon-reload
落とし穴3: 消える /var/run
CentOS7では、/runディレクトリがtmpfsファイルシステムでマウントされています。
つまり、 OSを再起動すると/run (=/var/run)に置かれたファイルは全て削除されてしまいます。
/var/run/hoge_app/hoge_app.pid
のように
/var/runにアプリごとのディレクトリを掘ってpidを配置していたりすると、
再起動時に作ったディレクトリが消えてしまっているので起動に失敗したりします。
対応として、/etc/tmpfiles.d
に設定ファイルを作り、
OS起動時に作っておきたいディレクトリを指定する必要があります。
$ vi /etc/tmpfiles.d/hoge.conf
以下のように記述します。
d /var/run/hoge_app 0755 hoge hoge
落とし穴4: 消えるシステムログ
CentOS7では、システムログはjournaldで管理されています。
参考: CentOS 7のログ管理「journald」
デフォルトのログファイル置き場は/run/log/journal
です。
先ほど書いたように、CentOS7では/run
はOS再起動すると消えます。
つまり、 障害発生時に一番見たいシステムログが、再起動すると消えているわけです。
(2016/1/4追記: 消えません。詳細は後述)
悲しい。
それを防ぐために、journaldの設定で
ログの配置場所を/var/log/journal
に変更します。
$ vi /etc/systemd/journald.conf
以下のように変更します。
[Journal]
# Storage=auto
Storage=persistent
2016/1/4追記
システムログはjournald経由でrsyslogにも送られるため、
再起動によってjournaldのログが消えても、rsyslogで管理されているシステムログは消えません。
上記の現象は、仮想環境上のCentOS7で発生する
rsyslogの不具合が原因のようです。
参考: rsyslogが出力してくれなかった話(CentOS 7)
おわりに
新しいOSを使うときには、思わぬ落とし穴にハマって泣かないよう
充分に検証しましょう。