昨天我花了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服务write-delete-update权限?
>(理论)什么是SELinux?它的用途是什么?为什么(出于什么原因)创建它?我为什么要用它?是否有理由在本地开发机器上启用SElinux?
仅限于资源的主持人:我知道这个问题涵盖了比实际编程更多的管理,但我确信它会比新手管理员以更严厉的方式影响开发人员,所以在SuperUser和*之间选择后者.但是,由您来决定是在SuperUser移动问题还是留在这个地方.
解决方法:
我不是专家,但我自己也遇到过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 *
您可以使用此设置递归地设置所有文件和目录的权限(这是可能会修复您的权限问题的命令,您应该像瘟疫一样避免使用777):
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
希望这些片段和信息中的一些对你有用,而这些不仅仅是一个疯子的谣言.