目次
こんにちは!ともです(@_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の設定をすることで解決しました。何か参考になれば幸いです。