Как правильно настроить права доступа для веб-сервера Apache2, использующего PHP-FPM?

У меня установлены httpd и php-fpm. В системе создана группа `http`, в которую входят пользователи `http` (для запуска Apache) и `devops` (для редактирования и выполнения файлов). Домашняя директория пользователя `http` расположена по пути `/home/http/`, а в ней находятся папки с несколькими сайтами, которые также являются виртуальными хостами Apache. Все файлы в директории `/home/http/` имеют владельца `http`, группу `http`, и права доступа установлены как `775` для директорий и `664` для файлов, чтобы пользователь `devops` мог вносить изменения. 

PHP-FPM настроен с помощью следующего пула:

```ini
[http]
user = http
group = http
listen.owner = http
listen.group = http
listen.mode = 0660
listen.allowed_clients = 127.0.0.1
listen = /run/php-fpm/php-fpm-httpd.sock
pm = dynamic
pm.max_children = 4
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 2
catch_workers_output = yes
```

Для `httpd` также есть соответствующая конфигурация, указывающая на сокет. Однако, при включенной общей конфигурации Apache отдает файлы без их выполнения. При добавлении настроек в соответствующий виртуальный хост возникает ошибка 403. 

Моя конфигурация для Apache выглядит так:

```apache
<IfModule proxy_fcgi_module>
    <FilesMatch "\.(php)$">
        SetHandler "proxy:unix:/run/php-fpm/php-fpm-httpd.sock"
    </FilesMatch>
</IfModule>
```

Я использую httpd версии 2.4.62 и php (fpm-fcgi) версии 8.2.27, все запускается через systemd. После обновления программного обеспечения конфигурации не изменились, но теперь Apache перестал обрабатывать PHP, выдавая ошибку доступа (HTTP 403). В логах Apache появляется следующее сообщение:

```
AH01071: Got error 'PHP message: PHP Warning: PHP Request Startup: Failed to open st
```

Как мне решить эту проблему?
  • 9 февраля 2025 г. 4:04
Ответы на вопрос 2
Для решения проблемы с доступом к файлам и выполнением PHP через PHP-FPM у вас уже есть довольно хорошая основа, но давайте проверим и уточним несколько важных моментов:

### 1. Проверьте права на директории и файлы

Обратите внимание, что права доступа к файлам и директориям имеют большое значение. У вас установлены права `775` для директорий и `664` для файлов. Убедитесь, что все родительские директории до `/home/http/` также имеют соответствующие права доступа для группы `http`.

- Проверьте права на папку `/home/http/` и все её родительские директории, чтобы убедиться, что группа `http` может в них выполнять операции `cd` и т.д.

```bash
ls -ld /home
ls -ld /home/http
```

### 2. Проверьте конфигурацию SELinux (если используется)

Если на вашем сервере включен SELinux, он может блокировать операции, даже если права доступа установлены правильно. В таком случае попробуйте временно отключить SELinux, чтобы проверить, является ли это причиной проблемы:

```bash
sudo setenforce 0
```

Если это решает проблему, вам нужно будет настроить политику SELinux для корректной работы с Apache и PHP-FPM.

### 3. Убедитесь, что Apache и PHP-FPM используют одинаковую группу

Ваш PHP-FPM работает под группой `http`, убедитесь, что Apache тоже работает с этой же группой. Проверьте следующие настройки в файле конфигурации `httpd.conf`:

```apache
User http
Group http
```

### 4. Настройка виртуального хоста

Убедитесь, что конфигурация вашего виртуального хоста правильно настроена и учитывает файл `.htaccess`. Если вы используете файл `.htaccess`, убедитесь, что у вас есть следующие инструкции:

```apache
<Directory /home/http/ваш_путь_к_сайту>
    AllowOverride All
    Require all granted
</Directory>
```

### 5. Перезапустите службы

После внесения изменений всегда перезагружайте службы Apache и PHP-FPM:

```bash
sudo systemctl restart httpd
sudo systemctl restart php-fpm
```

### 6. Логи и отладка

Если проблема не решается, внимательно проверьте логи Apache (`/var/log/httpd/error_log`) и логи PHP-FPM (`/var/log/php-fpm/www-error.log` или их аналог, в зависимости от вашей конфигурации). Ошибки в этих логах могут дать важные подсказки о том, что именно не так.

### 7. Проверьте, что все необходимые модули включены

Убедитесь, что у вас включены модули Apache, необходимые для работы с PHP-FPM и проксированием, такие как `proxy`, `proxy_fcgi`, `rewrite`. Вы можете проверить это с помощью команды:

```bash
httpd -M | grep proxy
```

Если какой-либо из модулей не загружен, добавьте его в конфигурацию Apache.

### Заключение

Следуя этим шагам, вы сможете диагностировать и решить проблему доступа и выполнения PHP файлов через PHP-FPM на вашем сервере Apache. Если проблема по-прежнему не решена, пожалуйста, предоставьте дополнительные детали конфигурации или логи для более углубленной диагностики.
Самое первое, что стоит проверять в таких случаях - это selinux. 
Самое второе - что все папки в цепочке от корня читаемы для пользователя пхп.

А если говорить в целом, запускать пхп от пользователя хттп довольно бессмысленно. Пользователь фпм должен совпадать с владельцем файлов. То есть запускать надо от девопса.

Лично я делаю так: веб-сервер работает под своими группой/пользователем, а пхп - под SSH логином пользователя сайта. У вас это может быть видимо этот девопс.
Чтобы их поженить, просто добавляем пользователя веб-сервера в группу пользователя, usermod -a -G devops www-data , а папочке веб-сервера соответственно выставляются права 750. Веб-серверу нужно только чтение, и он его имеет через группу. Таким образом можно соорудить такой мини-хостинг, разные ползователи не могут ходить в папки друг друга, и при этом нет обычной чехарды, когда пользователь ssh/ftp и пользователь пхп-фпм разные.
Похожие вопросы