我有一个在 Linux - CentOS 上运行的 appache 服务器。
为了能够在 Windows 上编辑我的 php 文件,我将服务器链接到我的 Dropbox 帐户,并从位于 /root/Dropbox 下的 Dropbox 文件夹创建了一个符号链接到我的 public_html 文件夹。然后,当我尝试通过 Windows 编辑 public_html 中的文件时,其权限变为 root,因此我得到了著名的 500 错误。我猜想这与提到的符号链接的权限有关,所以我将符号链接的权限更改为我的用户帐户,但它没有改变。但接下来发生的事情让我不知所措:突然,当我尝试访问我网站上的任何页面时,我得到:
禁止您无权访问此服务器上的 /My/site/name/page.php。
经过一番挖掘,我发现 public_html 的所有者和组是 root,
ps aux | grep apache
显示
root 4533 0.0 0.0 10892 1604 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4534 0.0 0.1 10892 2956 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4535 0.0 0.1 10892 2952 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4536 0.0 0.1 10892 2956 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4537 0.0 0.1 10892 2956 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4538 0.0 0.1 10892 2956 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4551 0.0 0.1 10892 2208 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4556 0.0 0.1 10892 2200 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4565 0.0 0.1 10892 2200 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
nobody 4572 0.0 0.1 10892 2200 ? S Jul31 0:00 /usr/local/apache/bin/httpd -k start -DSSL
将 public_html 的组更改为 nobody 成功了,并消除了此错误。但我不知道它是否应该这样,我的意思是,我不知道它之前属于哪个组。
所以我有两个问题:
1. 给定上述 apache 的用户,public_html 应该属于哪个用户?
2. 如果1的答案是root,你能想到导致这个错误突然发生的任何原因吗,以及应该怎么做才能解决它?
值得一提的是,我首先发布了这个问题这里但我没有得到任何答复,所以我在这里尝试。希望这是合法的。
答案1
您可以以非 root 用户身份运行 Dropbox,让该用户和 apache 组拥有 public_html,并授予 rwxrwx--- 权限(即 770),以便您的用户和 Apache 都可以读写。
此外,作为 Linux/Unix 管理的一般原则,除非绝对必要,否则您绝不应该以 root 身份运行应用程序。
为了解释为什么 Apache 似乎使用 root,应用程序只有在以 root 权限启动时才允许监听特权端口(低于 1024 的端口)。由于 HTTP/HTTPS 分别在端口 80/443 上提供服务,因此 Apache 以 root 身份启动,然后在其自己的用户下分叉进程(默认情况下,在基于 Red Hat 的发行版(其中 CentOS 是其中之一)上称为“apache”,在基于 Debian 的发行版(例如 Ubuntu)上称为“www-data”)。非特权用户可以在您的 Apache 配置中配置,但对于 95% 的应用程序来说,默认设置就足够了。