![如何使文件夹始终可被 apache 写入?](https://linux22.com/image/1431380/%E5%A6%82%E4%BD%95%E4%BD%BF%E6%96%87%E4%BB%B6%E5%A4%B9%E5%A7%8B%E7%BB%88%E5%8F%AF%E8%A2%AB%20apache%20%E5%86%99%E5%85%A5%EF%BC%9F.png)
我想让文件夹始终可被 PHP 写入。
我临时将文件夹权限更改为 777,但文件夹的内容是由 ftp 用户上传的,因此每次我重新运行脚本时都会出现以下情况:
Warning: file_get_contents(/var/www/html/.../file.txt): failed to open stream: Permission denied in /var/www/html/.../autoimport.php on line 25
同样的情况也发生在这个脚本中,我在其中显示了 error.log 的内容。我将其更改为 777,但当它重新生成时,我再次失去访问权限。
Warning: fopen(/var/log/apache2/error.log): failed to open stream: Permission denied in /var/www/html/admin/errorlog.php on line 48
Could not get lines from file - /var/log/apache2/error.log
答案1
我在服务器设置中通常采用的方法是为网站创建一个组,然后结合使用 setgid 和 umask 来确保文件仍可由我想要的应用程序写入。以下是分步指南:
1/ 为您的网站创建一个新组:
$ sudo groupadd web-grp
2/ 将运行 Web 服务器的用户添加到组中:
$ sudo gpasswd -a www-data web-grp
3/ chown 您希望服务器有权访问的目录和文件:
$ sudo chown -R :web-grp /path/to/website
4/ 设置这些目录的 gid 位和其他权限:
$ sudo chmod -R ug+rw /path/to/website
$ find /path/to/website -type d -exec chmod g+xs {} \;
5/ 将 ftp 程序的 umask 设置为002
。这将取决于您的 ftp 客户端和服务器,请四处搜索以找出如何针对您的特定设置执行此操作。
6/ 重新启动您的 Web 服务器以获取新的组权限:
$ sudo service apache2 restart
有趣的是,setgid
这些目录上的位将导致目录中创建的新文件默认具有相同的组。这意味着您不需要777
权限 — 这意味着您拥有更高的安全性以及可以继续工作的系统。
这umask
部分也很重要。新文件将具有被剥离的权限位umask
,因此如果您的umask
是022
,新文件将无法进行组写入,并且工作不会很顺利。
我已经使用这个设置很多年了,并且非常成功。