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

Aug 18 2020

좋아, 이건 멍청이야. Ubuntu 16.04 서버 인스턴스에서 Apache 2.4를 실행하고 있습니다. 프로덕션 및 테스트 인스턴스 모두에 대해 거의 동일한 환경을 사용하고 개발을 위해 Vagrant를 사용하여 관리하는 거의 동일한 VirtualBox 인스턴스를 사용합니다. 가장 오랫동안 Apache가 실행되는 동일한 사용자로 이러한 서버 인스턴스에 SSH를 사용하고 일부 애플리케이션 코드 변경 사항을 배포 한 다음 실행 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다음 세션을 종료, 그것은 아파치는 죽인다.
  • 나는 SSH 경우 root, restart서비스가 다음 세션을 종료, 아파치는 괜찮습니다.
  • SSH를 root, restart서비스로 전환하고 app으로 다시 전환 root한 다음 세션을 종료하면 Apache는 괜찮습니다.
  • 내가 root, restart서비스 로 SSH를 사용 하고 세션을 종료하고 SSH를 다시으로 app한 다음 세션을 다시 종료하면 Apache가 종료됩니다.
  • 앞서 이번 주에, I는 지속적으로 SSH 할 수있었습니다 app로 전환 root, restart등의 서비스 root와 아파치를 죽이지 않고 세션을 종료합니다.
  • 나는 수정 /lib/systemd/system/apache2.service.d/apache2-systemd.conf하고 라인 RemainAfterExit=noRemainAfterExit=yes, 수행하고 systemctl daemon-reload, 마지막으로 service apache2 restart효과가없는 a 를 시도했습니다 .

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

나는 여기서 완전히 손실을 입었고 어떻게 모든 것이 갑자기 깨질 수 있는지 이해하지 못합니다.

답변

25 MichaelHampton Aug 18 2020 at 09:43

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

시스템이 아닌 사용자로 실행되도록 Apache를 변경했기 때문에 해당 사용자 계정에서 로그 아웃 할 때마다 systemd는 Apache의 모든 IPC 객체를 핵으로 만들고 Apache는 뮤텍스를 잃어버린 것에 대해 불평하고 죽습니다.

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

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