web-dev-qa-db-ja.com

Centos 7 / Apache / PHP-mkdir():権限が拒否されました

DUPLICATEと叫ぶ前に!そして私を奈落の底に追いやる、聞いてくれ。 :)

私は協力している会社のイントラネットサイトを開発しており、元々はWindows 7/IISを実行しているワークステーションから直接開発していました。サイト/アプリケーションの完成に近づくと、Centos 7実行中のボックスApacheが与えられたので、それに移行するプロセスを開始しましたシステム。マイナーな問題のほとんどを整理し、サイトを稼働させました。ただし、サイトの一部でデータベースとやり取りし、ログインしたユーザーに基づいてログディレクトリ/ファイルを作成します。この部分ではmkdir()関数を使用していますが、権限に関する問題が発生しています。

mkdir(): Permission denied

これが私がすでに行ったことです:

  • Centos 7を使用しているため、Apacheユーザー/グループはApache:apacheです。私はchownを使用して、/ var/www/html /の所有者とLogsフォルダーをApache user/groupに変更しました。安全のために、httpd.confをダブルチェックし、実行中のプロセスもチェックして、正しいユーザー/グループがあることを確認しました。
  • 私は、テストの目的で、これらすべてのフォルダーのアクセス許可をchmod 777に変更しようとしましたが、同じエラーが発生しました。
  • StackOverflowを上から下に検索し、私がすでに試したものについてのみ回答を得ましたが、役に立ちませんでした。

したがって、chmodまたはchownを使用して、アクセスされるフォルダーのアクセス許可を変更しても、同じ種類のエラーが発生します。安全のために、PHPユーザーもチェックしましたが、Apacheユーザーも使用しています。

権限が変更されていても、なぜ機能しないのかについてさらに洞察が得られる可能性がある場合は、教えてください。この特定の状況を説明する1つの記事を見逃した場合は、複製を叫び、私を奈落の底に追い込みます。笑 :)


[〜#〜] edit [〜#〜]わかりました。そのため、さらにテストを行ったところ、この全体的な問題を引き起こしていると思われる2つの問題を発見しました。

  1. PHPはフォルダーがスクリプトから作成されたときにフォルダーのアクセス許可を設定しようとしています。Apacheが所有者であっても、サーバーはそのようにしないようです。コードのその部分を削除すると、アクセス許可エラーがなくなり、「そのようなファイルまたはディレクトリはありません」というエラーが表示されます。
  2. Sudoを介してユーザーApacheでディレクトリの作成をテストしたところ、問題なくディレクトリを作成できました。ただし、私のPHPスクリプトは2つのディレクトリを作成し、最後に作成したログファイルを作成しています。同時に2つのディレクトリを作成できないようです??たとえば、すでに作成されたLogsフォルダーがあり、PHPはその下に2つのディレクトリを作成しようとしています。したがって、PHPスクリプトが実行されると、「Logs/5235/3-3-2015 /」のようなものが作成されます。

注意してください。PHPのmkdirで再帰的な値をtrueに設定しようとしましたが、そのとき、最初に指摘した権限の問題が発生します。再帰/モードが削除されると、権限の問題は発生しませんが、ネストされたディレクトリを作成することはできません。


編集2

私の理論をテストするために、ネストを削除し、mkdirに1つのディレクトリのみを作成させようとしたところ、以前と同じエラーが発生しています。 Apacheが所有していますが、777に設定しても、アクセス許可の問題が発生します。

16
Fata1Err0r

755/777の権限はあるものの、SELinuxがhttpdによるdirsの書き込み/作成をブロックしている可能性があります。

試してください:

chcon -R -t httpd_sys_content_t /path/to/www
chcon -R -t httpd_sys_content_rw_t /path/to/www/dir/for/rw

詳細情報: http://wiki.centos.org/TipsAndTricks/SelinuxBooleans

41
drack

確かではありませんが、CentosのPHPバイナリのファイルアクセス権が壊れている可能性があります。これを修正するには2つの方法があります。

  • PHPゼロからコンパイル。すべてのコントロールはあなたのものになるので、私はこれを好みます。
  • または、PHPのUmask()関数を使用するようにphpスクリプトを変更します。 ドキュメントリンク
2
risyasin