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

Aug 18 2020

Ладно, это круто. Я запускаю 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.
  • Если I SSH как app, переключитесь root, restartслужба в качестве rootпереключитесь обратно app, а затем завершить сеанс, он убивает Apache.
  • Если я SSH , как root, restartслужба, а затем завершить сеанс, Apache прекрасно.
  • Если I SSH , как root, restartслужбы, переключитесь appпереключитесь обратно root, а затем завершить сеанс, Apache прекрасно.
  • Если я 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в первую очередь.

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

Ответы

25 MichaelHampton Aug 18 2020 at 09:43

Основная причина этого - изменение в том, как 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) и использовать разрешения и ACL для предоставления www-dataдоступа к файлам, которые ему необходимо читать / писать.