最後に修正を考え出しました。これら 2 つの関数を実行して、www およびその中のフォルダーとファイルのアクセス許可を再帰的にファイルしました。
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
ここでこのページを読みました:https://wiki.apache.org/httpd/13PermissionDeniedand 基本的に説明し、アクセス許可が継承されることを思い出させてくれました。「ディレクトリと各親ディレクトリに対して同じことをしてください」。そのため、これら 2 つを実行したところ、すべてが再び機能するようになりました。
通常、この質問のように、1 つのパスの実行権限は設定されていません。これを解決する最も簡単な方法は、次のコマンドです:
chmod a+rX -R /var/www
ただし、CentOS7 または RHEL7 を使用すると、SELinux で問題が発生する場合があります。ファイルのアクセス許可が正しくてもエラーが発生する場合は、次のログを参照してください:
tail -f /var/log/audit/audit.log
次のようなメッセージが表示された場合:
type=AVC msg=audit(1464350432.916:8222): avc: denied { getattr } for pid=17526 comm="httpd" path="/var/www/app/index.html" dev="sda1" ino=42021595 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file
type=SYSCALL msg=audit(1464350432.916:8222): arch=c000003e syscall=4 success=no exit=-13 a0=7fde4e450d40 a1=7ffd05e79640 a2=7ffd05e79640 a3=7fde42e43792 items=0 ppid=17524 pid=17526 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
これは、SELinux がドキュメント ルートへのアクセスをブロックすることを意味します。このようなコマンドを試すことができます (オプション -Rv
で再帰的かつ冗長 ):
chcon --user system_u --type httpd_sys_content_t -Rv /var/www/app/public
適切な設定を見つけるには、/var/www/html
のような作業ディレクトリを調べます。 これで:
ls -laZ /var/www/
次のようになります:
drwxr-xr-x. server server system_u:object_r:httpd_sys_content_t:s0 .
drwxr-xr-x. root root system_u:object_r:var_t:s0 ..
drwxr-xr-x. server server system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. server server system_u:object_r:httpd_sys_content_t:s0 html
drwxrwxr-x. server server unconfined_u:object_r:var_t:s0 app
上記を試しても問題が解決しない場合は、パス内のどのディレクトリにも、Apache アクセスを妨げている ACL がないことを確認してください。
以下を使用できます:
getfacl <directoryname>
ACL を使用して設定された可能性のあるディレクトリのアクセス許可を取得します。基本的に、ユーザーにはすべての権限があり、グループには読み取りと実行 (または検索) があり、書き込みはできないという、次のような内容が表示されます:
# file: <directoryname>
# owner: username
# group: username
user::rwx
user:1000:rwx
group::---
group:username:r-x
mask::rwx
other::rwx
ACL を使用するためのアクセス権を apache またはグループに付与するには、次を使用します:
setfacl -m g:<groupname>:rx <directoryname>
親ディレクトリが同じであることを確認してください。 -R スイッチを使用して、最上位ディレクトリで再帰的に変更を行うことができます。
私はこの同じ Apache パーミッションの問題に遭遇し、しばらく前に Samba を使用していたときにディレクトリに ACL を設定したことを思い出す前に、chmod と chown が効果を発揮しなかった理由を突き止めようとして頭を悩ませていました。