如何为 apache2 设置权限以允许用户在 /var/www/ 中创建或编辑文件

How to set permissions for apache2 to let user create or edit files in /var/www/

我正在使用来自 DO 的 Ubuntu 14 服务器,安装了 LAMP 堆栈,我按照此处的说明在 ubuntu 上安装 Flask,因为我的主要目的是使用 Flask在我的网站上。

https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps

在测试期间,当用户连接到 "http:/myvpsip/createfile/" 在当前文件夹 /var/www/ 上创建一个新文件时,我从 Apache 收到错误消息说无法创建文件,"permission denied".

我再次尝试使用 PHP 脚本在同一目录 /var/www/ 上创建一个新文件,但遇到了同样的问题。这两项试验都是使用 root 帐户完成的。我尝试将 www 文件夹更改为 755 或 777,但它们不起作用。

我的问题是,如何设置 apache2 的权限,当用户浏览网站时,他们将能够 create/edit 当前目录中的文件?

谢谢

这是因为当您安装应用程序时,您是以根用户身份进行的。您所有的应用程序文件和目录都归 root 所有。

如果您在 /var/www 上执行 ls -l 并查看 FlaskApp 文件夹结构,您可能会看到权限设置如下:

-rw-r--r--  1 root     root

当Apache 运行时,它代表用户root 拥有的一个主进程和用户www-data 拥有的几个子进程运行。所以本质上,Apache 运行 就好像以用户 www-data.

登录一样

当您的应用程序需要执行文件或文件夹操作时(其 运行 代表 Apache www-data 用户),将使用 public/world 权限位,因为 Apache 子进程不是 运行 作为 root 用户而不是 root 组。

看上面,我们看到只为 public/world 权限设置了读取位 - 没有写入。这就是问题所在。

解决此问题的一种方法是让 /var/www/mywebsite 下的所有内容都归用户 root 和组 www-data 所有。这样设置,只有 root 用户才能拥有完全权限,而 www-data(其他所有人)只能读取和执行(不能写入)。

设置网站时,应将其设置在自己单独的文件夹下。这样您以后可以添加多个虚拟域(即更多网站)。假设 'mywebsite' 是您的域所在的位置,并且您已经在其中安装了应用程序软件 (Flask):

cd /var/www/mywebsite
chown -R root:www-data /var/www

作为系统管理员,您需要了解应用程序并完成文件夹和文件设置权限。一般应用权限,然后根据具体情况应用权限。

对于大多数目录 (750)

- Only root can rwx directory
- www-data can only read and execute directory
- no public/world bits set as it makes no sense (*)

对于可通过 Web 应用程序更改的目录 (770)

- Root can rwx directory
- www-data can rwx directory
- no public/world bits set as it makes no sense (*)
- for uploading files, creating images, documents, etc by the users of the site

对于大多数文件 (640)

- Never set the execute bit to avoid execution of misplaced shell or executable files
- PHP, Perl, etc. are just text files. They have nothing to do with exec permission
- No group write bit set
- Read must be set for owner and group else they cant see the web document

对于需要更改文件的特殊情况 (660)

- Set group write bit if you want www-data users to create things

(*)因为所有访问Apache的用户都是运行代表www-data