我使用 Ubuntu 20.04。我已编辑/etc/apache2/envvars
将运行用户更改为userA
:export 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 并进行拖放,则所有者为。userA
www-data
userA:www-data
答案1
所以,这在很大程度上取决于您如何编写 PHP。
Apache 有两种典型的方法可以解决此问题,每种方法都有不同的考虑来解决这个问题。
php
Apache 中的嵌入式模块
这是使 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 模块以及alias
和proxy_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。