インフラ

Apacheがファイルを見つけれない場合考える事

こんにちは!ともです(@_tomo_engineer)!

Web ServerであるApacheがファイルを表示してくれない場合に考える事をいくつか列挙したいと思います。

この記事では、ApachなどのWebサーバがファイルを表示してくれない場合の対処方法についてまとめます。

SELinux

SELinux(Security-Enhanced-Linux)とはredhat系ディストリビューションにデフォルト導入されている、アクセス制御を設定するためのシステムです。

強制アクセス制御方式 セキュリティ管理者以外変更できない制限
Type Enforcement プロセス毎にファイル等のリソースへのアクセス制御
ロールベースアクセス制御 rootを含む全てのユーザの役割に制限

といった風に細かいアクセス制御が可能です。

信頼出来る内部ネットワークでの使用や、開発環境やテスト環境ではSELinuxを無効化しておく事がよくあります。

Enforcing SELinuxが有効な状態
Permissive SELinuxが無効であるが、ログは記録している状態
Disabled 無効な状態

の3つの状態を持ちます。

いくつかコマンドを紹介すると

getenforce 3状態の確認
sestatus 詳細な状態の確認
setenfoce 0 一時的にPermissiveに変更 (0:Permissive、1:Enfocing)

永久的に無効化する方法としては、「/etc/selinux/config」ファイルのSELINUXをpermissiveかdisableに変更し、PCを再起動します。

もしここで設定を間違える(Typo等)とカーネルパニックという状況に陥ります。その場合はセーフモードでCeontOSを起動し、configファイルを再設定する必要がありますので注意が必要です。

SELinuxのログは「/var/log/audit/audit.log」に格納されますので、setenforce等で状態を変更し、ログを確認すると良いと思います。

ファイアウォール

ドキュメントルートにindex.htmlを置いたにも関わらずWebサーバが返してくれない場合ファイアウォールによって遮断されている可能性があるかもしれません。

CentOS7ではfirewalldが提供されており、内部でiptablesの実行を行なっています。

もしかしたらファイアウォールの可能性かもしれませんので

systemctl stop firewalld.service

でファイアウォールを停止させて確認してみます。このコマンドではシステムの再起動時にはファイアウォールが復活するので、完全に無効化したい場合は

systemctl disable firewalld.service

で常にファイアウォールを起動しない様にできます。セキュリティにはご注意下さい。

アクセス権限

ファイルにはパーミッション(許可)という設定があります。そのファイルにApachがアクセスする権限が無い場合や禁止されている場合には見ることができません。

権限の確認

ls -l

でファイルの詳細を確認してみます。

これにより権限や所属グループなどを確認することができます。

権限とは

対象 u(所有者) g(所属グループ o その他ユーザ a 全員(=ugo)
種類 + 許可追加 – 許可削除 = 設定
動作 r 読み取り w 書き込み x 実行

の様に英語で言うSVOの関係にあります。

例えば『g+r』は『所有グループに読み取りを許可する』と言うことになります。

権限の変更

ファイルの権限の変更には『chmod(Change Mode)コマンドが利用できます。

『chmod モード fime名』と言う書式であり『chmod g+r index.html』と言う風に実行します。

Webサーバのログをみる

エラーが発生した時にまずログを見るという考えが頭に浮かぶのでは無いでしょか。

Apacheの場合にログは、『/var/log』配下にaccess_logやerror_logなどログファイルがあります。ログを確認しどの様なエラーなのか確認しましょう。

Permissionエラーの場合、SELinuxやファイルの権限の可能性が高いです。

まとめ

今回はWebサーバがファイルを認識してくれない場合に考えることについて書きました。

私の場合はSELinuxの設定をすることで解決しました。何か参考になれば幸いです。