開発環境で'yum update'がうまくいったからってそのまま本番環境でyum update
をやったもんだから別のApacheがインストールされて死ぬかと思いました。
同じような目に遭ってる人もいるようですね。
本番環境でsudo yum updateしてサービスが動かなくなった
今後同じ轍を踏んでしまった人のために解決法を残しておきます。
#何が起きたのか
まず、原因はタイトルの通リ以下のコマンドです。
[root]# yum update
このコマンドを打つとyumリポジトリから最新のパッケージを全部インストールしてくれるようです。
その中には当然の様にApacheが混じっている訳で、これが標準としてインストールされてしまいます。
したがって、元々ApacheがインストールされているとApacheが以下の場所に2つインストールされてしまうわけですね。
/user/local/apache2/ …元からインストールされていたApache2.2
/etc/httpd/ …yumによってインストールされたApache2.4
このとき、systemctl
的にはyum
によってインストールされたApacheを起動します。httpd.conf
もApache2.4のものがロードされます。
yum
でインストールされたApache2.4のhttpd.conf
はphpのモジュールをロードしませんから、このままだとphpのコードが世界に晒されてしまいます。
#トラブルシューティング
ではお待ちかねのトラブルシュートのお時間です。
##Apache2.4のアンインストール
まずはApache2.4が邪魔なのでこれをアンインストールします。
[root]# yum remove httpd
##SSL設定のリカバリ
ssl.conf
が参照する証明書ファイルのパスがデフォルトのlocalhost
になっている可能性があるので、これを直しに行きます。
[root]# vi /usr/local/apache2/conf/ssl.conf
私はLet's Encryptの証明書を使っていたのでこちらのサイトが参考になりました。
CentOS 7 + Apache 2.4 に Let’s Encrypt の証明書を導入する手順
##起動スクリプトの復元
yum remove httpd
によって起動スクリプトが消滅します。これをリカバリします。
手順はこちらのサイトを参考にしました。
Apache起動スクリプト作成
まずは起動スクリプトが無いことを確認します。
[root]# ls /etc/init.d
次に、apachectl
を/etc/init.d
配下にコピーします。
[root]# cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd
ここで、httpd
を編集してサーバ起動時にhttpd
も起動するようにchkconfig
の設定を足しておきます。
[root]# vi /etc/init.d/httpd
#!/bin/sh
#
# chkconfig: 345 85 15
…
ファイルができたら自動起動登録します。
# httpdが登録されていないことを確認
[root]# chkconfig --list httpd
# httpdを登録
[root]# chkconfig --add httpd
# httpdが登録されたことを確認
[root]# chkconfig --list httpd
httpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
最後にservice
コマンドから起動してみましょう。
[root]# service httpd start
起動すれば成功です。
sysytemctlに登録
このままではsystemctl
視点で起動できていませんので、登録します。
こちらのサイトを参考にしました。
【CentOS7】init.d起動スクリプトでApache2.2が起動しない場合の対処方法(systemd起動スクリプト作成で解決)
まずはsystemd
に対応した起動スクリプトを作成します。
[root]# vi /etc/systemd/system/httpd.service
[Unit]
Description=Apache Web Server Name
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl -k start
ExecReload=/usr/local/apache2/bin/apachectl graceful
ExecStop=/usr/local/apache2/bin/apachectl -k stop
PrivateTmp=true
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
作成したファイルに実行権限をつけます。
[root]# chmod 755 /etc/systemd/system/httpd.service
次に、サービスを有効に設定します。
[root]# systemctl enable httpd.service
では実行してみます。
[root]# systemctl start httpd.service
最後に動作を確認してトラブルシューティング完了です。
#さいごに
終わってみれば「こんなもんだったかなぁ」というぐらいの手順ですが、嵌るとなかなか解決しないものですね。
(Gitの最新版をインストールしたかっただけなのになぁ)