SSH 세션을 종료하면 갑자기 Apache가 종료됩니다.

SSH 세션을 종료하면 갑자기 Apache가 종료됩니다.

좋아, 이건 멍청이야. Ubuntu 16.04 서버 인스턴스에서 Apache 2.4를 실행하고 있습니다. 저는 프로덕션 인스턴스와 테스트 인스턴스 모두에 거의 동일한 환경을 사용하고 개발을 위해 Vagrant를 사용하여 관리하는 거의 동일한 VirtualBox 인스턴스를 사용합니다. 가장 오랫동안 Apache를 실행하는 동일한 사용자로 이러한 서버 인스턴스에 SSH를 연결하고 일부 애플리케이션 코드 변경 사항을 배포한 다음 실행하여 exitSSH 세션을 종료할 수 있었습니다. 그러면 Apache는 이후에 정상적으로 실행될 것입니다. . 그러나 이제 exitApache 서비스에 치명적인 오류가 발생하지 않고는 작업을 수행할 수 없습니다 .

[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!

노트:

  • 아파치 사용자는 입니다 app.
  • 로 SSH를 수행 하고 로 서비스를 로 전환하고 다시 app으로 전환한 다음 세션을 종료하면 Apache가 종료됩니다.rootrestartrootapp
  • 서비스로 SSH를 시작한 다음 세션을 종료하면 Apache는 괜찮 root습니다 .restart
  • SSH로 서비스를 전환하고 다시 전환한 다음 세션을 종료하면 rootApache restartapp괜찮 root습니다.
  • 서비스로 SSH를 실행하고 세션을 종료하고 다시 SSH로 root서비스 를 종료 한 다음 세션을 다시 종료하면 Apache가 종료됩니다.restartapp
  • 이번 주 이전에는 Apache를 종료하지 않고 SSH를 일관되게 로 전환하고 서비스 를 app종료 하고 세션을 종료 할 수 있었습니다 .rootrestartroot
  • 나는 /lib/systemd/system/apache2.service.d/apache2-systemd.conf행을 수정하고 변경하려고 RemainAfterExit=no시도 했고 RemainAfterExit=yes, a를 수행했으며 systemctl daemon-reload, 마지막으로 a는 service apache2 restart효과가 없었습니다.

갑작스러운 행동 변화에 대한 설명이 있나요? 이전 동작을 복원할 수 있는 합리적인 수정 방법이 있습니까? 그렇지 않은 경우 애플리케이션 코드에 변경 사항을 배포하고 appSSH 세션에 로그인하지 않고도 Apache(사용자)가 이를 읽을 수 있는 권한을 부여하는 모범 사례는 무엇입니까 root? 으로 로그인하는 전체 이유는 처음에 app로그인할 필요성을 제한하기 위한 것이었습니다 .root

나는 여기서 완전히 헤매고 있으며 어떻게 모든 것이 갑자기 깨질 수 있는지 이해하지 못합니다.

답변1

이 문제의 근본 원인은 systemd(219부터)가 로그인한 사용자가 생성한 IPC 개체를 처리하는 방식이 변경되었기 때문입니다. 기본적으로 사용자가 로그아웃한 후에 남아 있는 모든 IPC 개체를 제거합니다. 이는 시스템이 아닌 모든 사용자(uid >= 1000)에게 적용됩니다. 시스템 사용자(uid < 1000)는 영향을 받지 않습니다.

시스템 사용자가 아닌 사용자로 실행되도록 Apache를 변경했으므로 해당 사용자 계정에서 로그아웃할 때마다 systemd는 Apache의 모든 IPC 개체를 핵으로 처리하고 Apache는 뮤텍스 손실에 대해 불평하고 죽습니다.

RemoveIPC=no에서 설정 하고 /etc/systemd/logind.conf(Ubuntu의 기본값은 yes) 다시 시작하여 이 동작을 변경할 수 있습니다 systemd-logind.service.

www-dataApache를 시스템 사용자(예 : Ubuntu)로 실행하고 권한과 ACL을 사용하여 www-data읽기/쓰기에 필요한 파일에 대한 액세스 권한을 부여 하는 것이 더 좋습니다 .

관련 정보