Выход из сеансов SSH внезапно убивает Apache

Выход из сеансов SSH внезапно убивает Apache

Ладно, это круто. Я запускаю Apache 2.4 на экземплярах сервера Ubuntu 16.04. Я использую почти идентичные среды для производственных и тестовых экземпляров, а также почти идентичный экземпляр VirtualBox, которым я управляю с помощью Vagrant для разработки. Долгое время мне удавалось подключаться по SSH к любому из этих экземпляров сервера как к тому же пользователю, под которым работает Apache, развертывать некоторые изменения кода приложения, а затем запускать, exitчтобы завершить сеанс SSH, и Apache после этого работал бы просто отлично. Теперь, однако, я не могу обойтись exitбез того, чтобы служба Apache не столкнулась с фатальной ошибкой:

[mpm_prefork:emerg] [pid 23466] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[core:alert] [pid 17750] AH00050: Child 23466 returned a Fatal error... Apache is exiting!

Примечания:

  • Пользователь Apache — app.
  • Если я подключаюсь по SSH как app, переключаюсь на root, restartслужба как root, переключаюсь обратно на app, а затем завершаю сеанс, это завершает Apache.
  • Если я подключаюсь по SSH как rootк restartслужбе, а затем завершаю сеанс, Apache работает нормально.
  • Если я подключаюсь по SSH как к службе, переключаюсь на root, переключаюсь обратно на , а затем завершаю сеанс, Apache работает нормально.restartapproot
  • Если я подключаюсь по SSH как к службе root, restartзавершаю сеанс, снова подключаюсь по SSH как к службе app, а затем снова завершаю сеанс, Apache завершается.
  • До этой недели мне удавалось постоянно подключаться по SSH как app, переключаться на rootслужбу restartкак rootи завершать сеанс, не останавливая Apache.
  • Я пробовал изменять /lib/systemd/system/apache2.service.d/apache2-systemd.confи изменять строку RemainAfterExit=noна RemainAfterExit=yes, выполнял systemctl daemon-reload, и, наконец, , но service apache2 restartбезрезультатно.

Есть ли какое-то объяснение внезапному изменению поведения? Есть ли разумное исправление для восстановления предыдущего поведения? Если нет, то какой будет наилучшая практика для развертывания изменений в коде приложения и предоставления разрешений Apache (пользователю app) на его чтение без необходимости входа в сеанс SSH как root? Вся причина входа в систему как была в первую очередь в том, appчтобы ограничить необходимость входа в систему как .root

Я в полной растерянности и не понимаю, как все могло вдруг сломаться.

решение1

Основная причина этого — изменение в том, как systemd (с 219) обрабатывает объекты IPC, созданные вошедшими в систему пользователями. По умолчанию он удаляет все объекты IPC, оставшиеся после выхода пользователя из системы. Это касается всех несистемных пользователей (uid >= 1000). Системные пользователи (uid < 1000) не затронуты.

Поскольку вы изменили Apache для работы под несистемным пользователем, всякий раз, когда вы выходите из этой учетной записи, systemd уничтожает все объекты IPC Apache, а затем Apache жалуется на потерю мьютекса и завершает работу.

Вы можете изменить это поведение, установив RemoveIPC=no( /etc/systemd/logind.confпо умолчанию в Ubuntu — yes) и перезапустив systemd-logind.service.

Лучше оставить Apache запущенным от имени системного пользователя (например, www-dataв Ubuntu) и использовать разрешения и списки контроля доступа, чтобы предоставить www-dataдоступ к файлам, которые ему необходимы для чтения/записи.

Связанный контент