昨天我花了5个小时直接发现一个看似不合理的错误“无法打开流。权限被拒绝”,这是在写入文件系统的任何操作之后发生的:fopen(带有“w”和“a”标志) ,move_uploaded_file,file_put_contents。
我已经多次重新检查目录所有者(用户和组 - chown,chgrp),将文件夹属性更改为不安全777(rwx with chmod
),但它没有效果。我甚至重新安装了Apache和PHP,但仍面临同样的错误。
由于在阅读各种文档数小时后出现错误的原因是SELinux限制自动应用于Apache服务httpd。我只是通过更改线路编辑Fedora(版本20)上的/etc/selinux/config
文件来关闭SELinux:
SELINUX=enforcing
到
SELINUX=disabled
我重新启动了计算机,这个恼人的错误终于消失了。
我必须注意到Stack Overflow上关于LAMP环境中“许可被拒绝”问题的所有问题都只涉及文件夹权限问题,而我的情况并非如此。
(实用)如何在不完全禁用SELinux的情况下授予Apache httpd服务写入删除更新权限?
(理论)什么是SELinux?它的用途是什么?为什么(出于什么原因)创建它?我为什么要用它?是否有理由在本地开发机器上启用SElinux?
仅限于资源的主持人:我知道这个问题涵盖了比实际编程更多的管理,但我确信它会比新手管理员更严重地影响开发人员,因此在SuperUser和StackOverflow I之间进行选择采取后者。但是,由您来决定是在SuperUser移动问题还是留在这个地方。
答案 0 :(得分:5)
我不是专家,但我自己也遇到过SELinux的一些问题。我读了几篇文章,从我可以收集到的内容来看,SELinux是服务器的另一层安全,真的应该留下来,而不是因为无知而关闭(这是我读的引用,而不是我的话)。我发现这个网站很有帮助,也很滑稽,它可能会给你提供比我更多的信息。
http://stopdisablingselinux.com/
我将遇到的一些事情我将分享:
您可以使用以下命令检查当前的SELinux权限:
ls -lZ
您可以使用以下命令设置SELinux权限:
chcon unconfined_u:object_r:httpd_user_content_t:s0
您可以使用通配符更改目录中的所有文件,如下所示:
chcon unconfined_u:object_r:httpd_user_content_t:s0 *
您可以使用此设置递归地设置所有文件和目录的权限(这是可能会修复您的权限问题的命令,您应该像7月那样避免瘟疫):
chcon -R unconfined_u:object_r:httpd_user_content_t:s0 *
如果您希望使用主目录来提供站点或应用程序,则需要发出以下命令:
setsebool -P httpd_enable_homedirs=1
我在使用Selinux的centos上遇到了fsockopen的问题,我不得不使用以下内容(-P使这个更改成为永久性的,你也需要这个命令):
setsebool -P httpd_can_network_connect 1
您可以通过以下方式查看在HTTPD上设置的标志:
sestatus
我认为最后一点是,我在服务器上遇到了公钥/私钥验证的问题,并且需要运行此命令来修复它(这是我认为的已知错误):
restorecon -R -v /home
希望这些片段和信息中的一些对你有用,而这些不仅仅是一个疯子的谣言。
答案 1 :(得分:0)
除了HumbleRat非常有用的答案外,这还解决了我的Apache 不允许在专用目录中写日志的问题:
# Allow write only to specific dirs
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/logs -R