1

проблема

Каждые несколько недель папка сеанса php на компьютере меняется на владельца apache хотя я использую nginx. Это нарушает работу PHP-приложений, например phpMyAdmin, с session_start(): open(SESSION_FILE, O_RDWR) failed: Permission denied (13) -Error.

Я могу это исправить, вручную выполнив sudo chown -R nginx /var/lib/php/session/

Среда

  • Виртуальная машина с CentOS Linux версии 7.4.1708, yum-cron с включенной автоматической установкой обновлений безопасности
  • EPEL-репозиторий установлен
  • Версия nginx: nginx/1.14.0
  • версия php: 7.0.29 (PHP-FPM)

дополнительные детали

  • Кажется, что это происходит каждые несколько недель, но я не могу сказать, когда именно, так как мы не используем этот PMA ежедневно. Тем не менее, он сломался на этой неделе, и в /var/log/yum.log я вижу, что nginx был обновлен на этой неделе: Apr 18 04:35:53 Aktualisiert: nginx.x86_64 1:1.14.0-1.el7_4.ngx
  • Я не могу найти упоминания о пользователе apache в моем /etc/php.ini .
  • Пока он не работает, права доступа к папке: drwxrwx---. 2 root apache 94 28. Mär 07:49 session

Вопрос

Почему (автоматическое) nginx-updates меняет владельца папки сеанса php, тем самым нарушая мои приложения?

1 ответ1

1

Есть несколько способов решения этой проблемы.

поиск пакетов

Если подозревается, что пакет вызвал какое-либо изменение, проверьте пакеты, чтобы узнать, принадлежат ли они данному файлу; RPM содержит раздел %files который подробно описывает, для каких файлов данный пакет является официальным. Это можно сделать с помощью rpm -ql . Например, грубая сила, чтобы найти, какой пакет (если есть) имеет /etc/passwd может выглядеть так:

$ rpm -qa | while read p; do rpm -ql $p | grep -q /etc/passwd && echo $p; done
setup-2.8.71-9.el7.noarch

Однако этот метод не найдет файлы, которые были косвенно изменены пакетом; RPM содержит сценарии, которые могут выполнять произвольные действия (или вызывать произвольные другие биты кода, которые выполняют поиск изменений). Эти сценарии могут быть перечислены с помощью команды rpm -q --scripts а затем этот код проверен. Это может помочь ограничить поиск только теми пакетами, которые были недавно установлены (проверьте журналы, для каких это пакетов), так как может быть много кода для просмотра.

отладка ядра

Ядро linux предлагает различные средства отладки, основанные на ядре, которые могут быть проинструктированы, чтобы сказать вам, если что-то касается данного файла. С помощью этого метода будет настроен подходящий код для SystemTap или sysdig или чего-либо еще, и тогда вы подождете, пока он не сообщит вам, какой процесс изменил файл. Например, с помощью sysdig если что-то изменяет интересующий вас каталог:

# sysdig "fd.directory contains /var/lib/php"

должен показывать подробности (которые можно настроить с помощью флага -p ) о системных вызовах, связанных с этим каталогом. Эту команду нужно будет где-то запустить, возможно, в сеансе tmux или в качестве пользовательской службы, чтобы она запускалась автоматически до тех пор, пока не будет найден код, вызывающий сбой. (Также вам может потребоваться ограничить вывод отладочной информации, поскольку отладка ядра может привести к обильному объему информации, если поиск слишком широк и команда остается запущенной в течение длительных периодов времени.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .