Назад | Перейти на главную страницу

PHP не может сохранять сеансы из-за ошибки разрешения

Я знаю, что этот вопрос должен был быть задан (и дан ответ) раньше, но я не могу найти решения своей проблемы ни в одном из этих вопросов. Это немного странно ... Проблема в том, что мои сценарии PHP (и мой сервер Apache) не могут записывать в папки в моей системе. Не за что.

Например, при запуске скрипта я получаю следующую ошибку:

Неустранимая ошибка: неперехваченное исключение Zend_Session_Exception с сообщением Zend_Session :: start () - /var/www/subdomains/vmb/vendor/zendframework/zendframework1/library/Zend/Session.php(Line:482): Error # 2 session_start (): открыть (/ var / www / subdomains / vmb / application /../ var / session / sess_ingph33ir4shr1e60kkifp37s7, O_RDWR) не удалось: отказано в разрешении (13)

У меня есть VPS с CentOS 7, Apache2.4, PHP5.6 (который работает с модом apache php) и некоторыми другими вещами. Apache запускается как пользовательский apache и групповой apache (как установлено в файле httpd.conf). Я установил session_path в обоих /etc/php.ini и /etc/httpd/conf.d/php.conf к /tmp/phpsessions и chown'd / chmod 'эту папку как apache: apache 777. В приведенном выше примере сеансы хранятся в другой папке (которая также chown'd / chmod' как apache: apache 777), но я получаю ту же ошибку для других папок.

Итак, мой сервер apache работает как apache: apache, я пересылаю нужные мне папки в apache: apache, и даже с разрешениями 777 Apache не может записывать в эти папки.

Вы когда-нибудь видели что-то подобное? Я раньше не ...

при условии, что разрешения и права собственности в порядке, я считаю, что это относится к SELinux.

Быстрый и грязный способ: ... при условии, что вы получаете Permissive во время пробежки getenforce, попробуйте отключить SELinux бегом setenforce 0 и снова нажмите свой скрипт, если он работает, значит, он был SELinux, оттуда вы можете либо оставить его отключенным (не рекомендуется), либо снова включить, запустив setenforce 1 и проверь свой /var/log/audit/audit.log и работаем над окончательным решением.

Отказ от SELinux из-за некоторых проблем с конфигурацией кажется плохим выбором. Вместо этого я бы посоветовал потратить немного времени на то, чтобы познакомиться с этим и найти подходящее решение. В этом случае, похоже, решением может быть установка httpd_sys_rw_content_t (обратите внимание на 'w' для записи) контекст файла в папке, которая вам нужна для записи. Имейте в виду, что selinux fcontext принимает регулярные выражения для целей, поэтому ваша команда, вероятно, будет выглядеть примерно так:

semanage fcontext --add \
    -t httpd_sys_rw_content_t \
    '/var/www/subdomains/vmb/var/session(/.*)?'

Регулярное выражение применяет правило контекста ко всем файлам в каталоге сеанса, а также к самому каталогу.

Примените политику (нужно только один раз) к каталогу и всем файлам в нем:

restorecon -R /var/www/subdomains/vmb/var/session

Могло быть много других вещей, но это, по крайней мере, сработало для меня.