Ладно, это круто. Я запускаю 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 работает нормально.restart
app
root
- Если я подключаюсь по 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
доступ к файлам, которые ему необходимы для чтения/записи.