Я использую Ubuntu 20.04. Я отредактировал /etc/apache2/envvars
, чтобы изменить пользователя запуска на userA
: export APACHE_RUN_USER=userA
Когда я запускаю этот PHP скрипт из W3 Schools для загрузки файла, загрузка работает - но владельцем файла является не userA
, как я предполагал. Он остается www-data
.
И все же:
sudo apache2ctl -S
сообщает User: name="userA" id=1002
, как установлено в envvars.
Так почему www-data
владеет файлом, а не userA
? Что определяет право собственности на файл? FWIW, разрешения каталога, в который загружен файл, составляют 774
, а право собственности - userA:www-data
. "Set UID" и/или "Set GID" на каталог также не повлияли.
Если я перетаскиваю файл в каталог с помощью WinSCP (используя ssh), владельцем является userA:userA
(да, userA
является членом группы userA
и группы www-data
). Если я устанавливаю GID и перетаскиваю, владельцем является userA:www-data
.
Итак, это будет сильно зависеть от того, как вы используете свой 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
Затем вам нужно включить модуль FCGId в Apache, а также модули псевдонима
и 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>
Это должно быть в ваших блоках
везде, где вы используете PHP.
Затем вы должны настроить /etc/php/7.4/fpm/pool.d/www.conf
, чтобы он использовал пользователя, которого вы намереваетесь - найдите user = www-data
и настройте ее под нужного пользователя. Я бы прокомментировал эту строку, а затем поместил бы под ней строку, определенную вашим пользователем, но это изменит пользователя, использующего php-fpm
, чтобы он мог читать / писать.
Любой из этих подходов исправит вашего пользователя / группу PHP, с которой он пишет / создает файлы - это просто зависит от того, как вы устанавливаете PHP - встроенный модуль Apache или FPM.