我知道这个问题肯定有人问过(并回答过),但我在这些问题中找不到任何解决方案。这有点奇怪……问题是我的 PHP 脚本(和我的 Apache 服务器)无法写入系统上的文件夹。完全不行。
例如,运行脚本时出现以下错误:
致命错误:未捕获异常“Zend_Session_Exception”,消息为“Zend_Session::start() - /var/www/subdomains/vmb/vendor/zendframework/zendframework1/library/Zend/Session.php(Line:482): 错误 #2 session_start(): open(/var/www/subdomains/vmb/application/../var/session/sess_ingph33ir4shr1e60kkifp37s7, O_RDWR) 失败:权限被拒绝 (13)
我有一个 VPS,上面装有 CentOS 7、Apache2.4、PHP5.6(使用 apache php mod 运行)和一些其他东西。Apache 以用户 apache 和组 apache 的身份运行(如 httpd.conf 文件中所设置)。我已将和session_path
中的设置为 ,并将此文件夹 chown'd/chmod' 为 apache:apache 777。上面的示例将会话存储在另一个文件夹中(也将其 chown'd/chmod' 为 apache:apache 777),但我对其他文件夹也遇到了同样的错误。/etc/php.ini
/etc/httpd/conf.d/php.conf
/tmp/phpsessions
因此我的 apache 服务器以 apache:apache 的身份运行,我将需要的文件夹 chownd 到 apache:apache,即使有 777 权限,Apache 也无法写入这些文件夹。
你见过这样的事吗?我以前没见过……
答案1
假设权限和所有权都没有问题,我相信这与有关SELinux
。
Permissive
快速而肮脏的方法:...假设您在运行时得到getenforce
,尝试SELinux
通过运行禁用setenforce 0
并再次点击您的脚本,如果它有效那么它就是SELinux
,从那里您可以将其禁用(不推荐)或通过运行将其重新打开setenforce 1
并检查您的/var/log/audit/audit.log
并努力实现最终解决方案。
答案2
因为一些配置问题而放弃 SELinux 似乎不是一个好选择。相反,我建议花点时间了解它,并寻找合适的解决方案。在这种情况下,解决方案似乎是设置httpd_sys_rw_content_t(注意“w”表示写入)您需要可写的文件夹的文件上下文。请记住selinux ftext 函数采用正则表达式作为目标,因此您的命令可能看起来像这样:
semanage fcontext --add \
-t httpd_sys_rw_content_t \
'/var/www/subdomains/vmb/var/session(/.*)?'
正则表达式将上下文规则应用于会话目录下的所有文件,以及目录本身。
将策略(仅需要一次)应用于目录及其中的任何文件:
restorecon -R /var/www/subdomains/vmb/var/session
也可能是其他很多原因,但是至少对我来说这是有效的。