Проблема: Ошибка каталога кеша Symfony 3.1

При использовании Symfony 3.1 на сервере CentOS 7.2 с Nginx 1.8.0 и PHP 7.0.31 приложение выдает следующую ошибку при попытке загрузить страницу:

PHP Fatal error: Uncaught RuntimeException: Cannot write to cache directory (/var/www/app.local/var/cache/prod)

Сведения об окружении:

  • Symfony: 3.1
  • ОС: CentOS 7.2.511
  • Веб-сервер: Nginx 1.8.0
  • PHP: 7.0.31
  • Структура каталогов:
    /var/www/app.local/
    ├── var/
    │   ├── cache/
    │   └── logs/
    
  • Каталог /var/www/app.local/var/cache имеет следующие права доступа:
    drwxrwxrwx.  4 user user 4096 Sep 13 08:37 cache
    

Наблюдения:

  • Лог ошибок показывает:
    FastCGI sent to stderr: "PHP message: PHP Fatal error: Uncaught RuntimeException: Cannot write to cache directory (/var/www/app.local/var/cache/prod)
    
  • Выполнение команды ls -ld /var/www/app.local/var/cache подтверждает, что права доступа установлены как 777.
  • SELinux включен (команда getenforce возвращает Enforcing).

Ключевые вопросы:

  1. Почему Symfony продолжает выдавать ошибку «Cannot write to cache directory», даже если права на каталог установлены как 777?
  2. Может ли политика SELinux или конфигурация PHP-FPM препятствовать записи в каталог?
  3. Как можно решить эту проблему, не отключая SELinux полностью?

Давайте обсудим возможные причины и пути решения!

 

2 ответа

Решение

1. Разрешения для пользователя PHP-FPM

Убедитесь, что служба PHP-FPM работает от имени пользователя, который имеет доступ к директории. Проверьте конфигурацию PHP-FPM в файле /etc/php-fpm.d/www.conf или /etc/php-fpm.conf:

user = nginx
group = nginx

Исправьте права доступа, назначив директорию правильному пользователю:

chown -R nginx:nginx /var/www/app.local/var/cache

2. Решение проблем с SELinux

На системах CentOS SELinux может блокировать доступ PHP к определённым директориям. Для диагностики выполните:

sudo cat /var/log/audit/audit.log | grep denied

Для исправления обновите контекст безопасности:

sudo chcon -R -t httpd_sys_rw_content_t /var/www/app.local/var/cache

Или отключите SELinux, если он не требуется, следуя инструкции Vultr: Отключение SELinux на CentOS 7.

3. Проверка параметра open_basedir

Настройка open_basedir в PHP может ограничивать доступ к директориям. Проверьте настройку:

php -i | grep open_basedir

Чтобы добавить директорию Symfony в разрешённые пути, измените файл конфигурации PHP (php.ini):

open_basedir = "/var/www/app.local/:/tmp/:/var/cache/"

4. Очистка кеша Symfony

После исправления конфигурации очистите кеш вручную:

php bin/console cache:clear --env=prod

Эти шаги помогут устранить проблему с директориями кеша в Symfony.

1. Разрешения для пользователя PHP-FPM

Убедитесь, что служба PHP-FPM работает от имени пользователя, который имеет доступ к директории. Проверьте конфигурацию PHP-FPM в файле /etc/php-fpm.d/www.conf или /etc/php-fpm.conf:

user = nginx
group = nginx

Исправьте права доступа, назначив директорию правильному пользователю:

chown -R nginx:nginx /var/www/app.local/var/cache

2. Решение проблем с SELinux

На системах CentOS SELinux может блокировать доступ PHP к определённым директориям. Для диагностики выполните:

sudo cat /var/log/audit/audit.log | grep denied

Для исправления обновите контекст безопасности:

sudo chcon -R -t httpd_sys_rw_content_t /var/www/app.local/var/cache

Или отключите SELinux, если он не требуется, следуя инструкции Vultr: https://docs.vultr.com/disabling-selinux-on-centos-7

3. Проверка параметра open_basedir

Настройка open_basedir в PHP может ограничивать доступ к директориям. Проверьте настройку:

php -i | grep open_basedir

Чтобы добавить директорию Symfony в разрешённые пути, измените файл конфигурации PHP (php.ini):

open_basedir = "/var/www/app.local/:/tmp/:/var/cache/"

4. Очистка кеша Symfony

После исправления конфигурации очистите кеш вручную:

php bin/console cache:clear --env=prod

Эти шаги помогут устранить проблему с директориями кеша в Symfony.

Другие вопросы по тегам