Я успешно использую метод, описанный здесь:Поддерживается одним пользователеми он хорошо работает для меня. Это мой скрипт для всех моих веб-сайтов:
sudo chown -R WebAdmin /var/www/example.com/
sudo chgrp -R www-data /var/www/example.com/
sudo chmod -R 750 /var/www/example.com/
sudo chmod g+s /var/www/example.com/
sudo chown www-data:www-data /var/www/example.com/Uploads/
sudo chmod -R 755 /var/www/example.com/Uploads/
Я обслуживаю все сайты на этом сервере, а WebAdmin — это общий пользователь, которого я использую для FTP, а также для SSH.
Однако я недавно перенес несколько сайтов Wordpress с хостинговой компании на свой сервер, и вышеперечисленное не работает. Обновление Wordpress или его тем/плагинов дало мне ошибку:
Для выполнения запрошенного действия WordPress необходимо получить доступ к вашему веб-серверу. Введите ваши учетные данные FTP для продолжения. Если вы не помните свои учетные данные, вам следует обратиться к вашему веб-хостеру.
Есть несколько «исправлений», таких какВот этоткоторые больше похожи на обходные пути и, вероятно, небезопасны. Поэтому я использовал самый безопасный (AFAIK) метод и сделал www-data владельцем сайтов WordPress, оставив не-WordPress сайты как прежде. Другими словами, я просто запустил
sudo chown -R www-data /var/www/wp_example.com/
на сайтах WordPress. Это, конечно, работало, но это становится головной болью, когда дело касается ручного управления сайтом, потому что для этого мне нужно войти в систему как root. Я также не смогу назначить веб-сайт(ы) кому-то другому для управления в будущем. Обратите внимание, что некоторые из моих сайтов являются гибридными (частично WordPress и частично пользовательские страницы).
Поэтому мне интересно, есть ли лучшее решение, более элегантное и более общее, то есть, которое будет работать как для сайтов на WordPress, так и для сайтов, не основанных на WordPress.
Одна из возможностей — добавить пользователя WebAdmin в группу www-data. Или, может быть, www-data в группу пользователей WebAdmin? Что имеет больше смысла и что более безопасно?
решение1
Если и пользователь WebAdmin
напрямую, и пользователь www-data
через группу www-data
должны писать в эти каталоги, этого 750
недостаточно. Что исправит ваш текущий дизайн:
sudo chmod -R 770 /var/www/example.com/
Соображения безопасности
Однако в целом это означает, что каждый сайт PHP работает на одном и том же пользователе, и после этой модификации каждый сайт может читать и писать файлы любого другого сайта. Это означает, что компрометация любого из сайтов компрометирует их все.
Использование отдельного пользователя и пула PHP-FPM для каждого сайта разделит сайты на изолированные отсеки, что снизит этот риск. Вы можете администрировать сайт с тем же пользователем, который его запускает:
/var/www$ ls -l
drwxr-x--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxr-x--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxr-x--- 2 example-org www-data 4096 Aug 30 7:00 example.org
Если вам абсолютно необходимо, чтобы пользователь WebAdmin
управлял всеми этими файлами, вы можете добавить пользователя в группу www-data
и предоставить ей права на запись, но я бы не рекомендовал этого делать.
/var/www$ ls -l
drwxrwx--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxrwx--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxrwx--- 2 example-org www-data 4096 Aug 30 7:00 example.org
PHP-FPM пулы
Поскольку я упомянул PHP FPM pools, вот краткий пример конфигурации. Существует несколько руководств, подробно объясняющих эти шаги.
Установите PHP-FPM.
/etc/php/8.2/fpm/pool.d/example-com.conf
:[example-com] user = example-com group = example-com listen = /run/php/example-com.sock chdir = /var/www/example.com listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[disable_functions] = exec,passthru,shell_exec php_admin_flag[allow_url_fopen] = off php_admin_value[cgi.fix_pathinfo] = 1 security.limit_extensions =
Последняя строка уменьшает безопасность, чтобы WordPress мог обрабатывать SEO URL, остальные — для повышения безопасности. Параметры
pm
должны быть настроены в соответствии с вашими потребностями.Включить модули Apache
mpm_event
,proxy
&proxy_fcgi
.Добавьте обработчик в
<VirtualHost>
блок Apache2 для сайта:<FilesMatch "\.php$"> SetHandler "proxy:unix:/run/php/example-com.sock|fcgi://localhost" </FilesMatch> <Proxy "fcgi://localhost/"> </Proxy>
Перезагрузите или перезапустите службы Apache2 и PHP-FPM.