Apache 文件所有权和环境变量

Apache 文件所有权和环境变量

我使用 Ubuntu 20.04。我已编辑/etc/apache2/envvars将运行用户更改为userAexport APACHE_RUN_USER=userA

当我跑步时来自 W3 Schools 的 PHP 脚本上传文件,上传成功 - 但文件所有者不是userA我想要的。它仍然保留www-data

然而: sudo apache2ctl -S报告User: name="userA" id=1002,如在环境变量中所设置的。

那么为什么www-data拥有该文件,而不是userA? 什么决定了文件所有权? FWIW,文件上传到的目录的权限是774,所有权是userA:www-data。 目录上的“设置 UID”和/或“设置 GID”也没有影响。

如果我使用 WinSCP(使用 ssh)将文件拖放到目录中,则所有权为userA:userA(是的,是组和组userA的成员)。如果我设置 GID 并进行拖放,则所有者为。userAwww-datauserA:www-data

答案1

所以,这在很大程度上取决于您如何编写 PHP。

Apache 有两种典型的方法可以解决此问题,每种方法都有不同的考虑来解决这个问题。


phpApache 中的嵌入式模块

这是使 Apache 与 PHP 协同工作的最简单的解决方案。PHP 在 Apache 中运行,并以 Apache 配置用户的身份运行。

sudo apt install libapache2-mod-php
sudo a2enmod php
sudo systemctl restart apache2.service

PHP FPM

PHP FPM 是另一个选项 - 您可以安装该php-fpm软件包,但您还需要对 Apache 进行额外的工作才能使其工作。

sudo apt install libapache2-mod-fcgid php-fpm

然后,您需要在 Apache 中启用 FCGId 模块以及aliasproxy_fcgi模块:

sudo a2enmod actions fcgid alias proxy_fcgi

对于 Ubuntu 20.04,PHP 是 7.4,因此无论您在哪里使用,都需要将其添加到服务器配置中php-fpm

    <FilesMatch \.php$>
        # 2.4.10+ can proxy to unix socket
        SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost"
    </FilesMatch>

<VirtualHost ...>无论您在哪里使用 PHP,这都必须在您的块内。

然后,您必须进行调整/etc/php/7.4/fpm/pool.d/www.conf,使其使用您想要的用户 - 查找该user = www-data行,并将其调整为您想要的用户。我会注释掉这一行,然后将您的用户定义行放在它下面,但这会更改正在使用的用户,php-fpm以便它进行读/写。


这两种方法都可以修复您用来写入/创建文件的 PHP 用户/组 - 这只取决于您如何安装 PHP - Apache 嵌入式模块或 FPM。

相关内容