Thoát các phiên SSH đột ngột giết Apache

Aug 18 2020

Được rồi, đây là một trò đùa. Tôi đang chạy Apache 2.4 trên các phiên bản máy chủ Ubuntu 16.04. Tôi sử dụng các môi trường gần giống nhau cho cả phiên bản sản xuất và thử nghiệm, cũng như phiên bản VirtualBox gần giống hệt nhau mà tôi quản lý bằng cách sử dụng Vagrant để phát triển. Trong thời gian dài nhất, tôi đã có thể SSH vào bất kỳ phiên bản máy chủ nào trong số những phiên bản máy chủ này với tư cách là cùng một người dùng mà Apache điều hành, triển khai một số thay đổi mã ứng dụng và sau đó chạy exitđể kết thúc phiên SSH và Apache sẽ chạy tốt sau đó . Tuy nhiên, bây giờ tôi không thể thực hiện exitmà không có dịch vụ Apache gặp phải lỗi nghiêm trọng:

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

Ghi chú:

  • Người dùng Apache là app.
  • Nếu tôi SSH với tư cách app, chuyển sang root, restartdịch vụ với tư cách root, chuyển trở lại app, sau đó kết thúc phiên, nó sẽ giết Apache.
  • Nếu tôi SSH với tư cách root, restartdịch vụ, sau đó kết thúc phiên, Apache vẫn ổn.
  • Nếu tôi SSH với tư cách root, restartdịch vụ, chuyển sang app, chuyển trở lại root, sau đó kết thúc phiên, Apache vẫn ổn.
  • Nếu tôi SSH với tư cách root, restartdịch vụ, kết thúc phiên, SSH lại với tư cách app, sau đó kết thúc phiên một lần nữa, nó sẽ giết Apache.
  • Trước tuần này, tôi đã có thể SSH liên tục như app, chuyển sang root, restartdịch vụ dưới dạng rootvà kết thúc phiên mà không giết Apache.
  • Tôi đã thử sửa đổi /lib/systemd/system/apache2.service.d/apache2-systemd.confvà thay đổi dòng RemainAfterExit=nothành RemainAfterExit=yes, thực hiện a systemctl daemon-reload, và cuối cùng là a service apache2 restartmà không có tác dụng.

Có một số lời giải thích cho sự thay đổi đột ngột trong hành vi? Có cách sửa chữa hợp lý để khôi phục hành vi trước đó không? Nếu không, thì cách tốt nhất để triển khai các thay đổi đối với mã ứng dụng và cấp quyền cho Apache ( appngười dùng) đọc nó mà không cần đăng nhập vào một phiên SSH là rootgì? Toàn bộ lý do đăng nhập applà để hạn chế nhu cầu đăng nhập như rootlúc đầu.

Tôi hoàn toàn mất mát ở đây và không hiểu làm thế nào mà mọi thứ lại có thể đột ngột bị phá vỡ.

Trả lời

25 MichaelHampton Aug 18 2020 at 09:43

Nguyên nhân sâu xa của điều này là sự thay đổi trong cách systemd (từ 219) xử lý các đối tượng IPC được tạo bởi người dùng đã đăng nhập. Theo mặc định, nó sẽ xóa mọi đối tượng IPC còn lại sau khi người dùng đăng xuất. Điều này áp dụng cho tất cả người dùng không thuộc hệ thống (uid> = 1000). Người dùng hệ thống (uid <1000) không bị ảnh hưởng.

Vì bạn đã thay đổi Apache để chạy dưới quyền người dùng không thuộc hệ thống, bất cứ khi nào bạn đăng xuất khỏi tài khoản người dùng đó, systemd sẽ xóa tất cả các đối tượng IPC của Apache và Apache sau đó phàn nàn về việc mất mutex và chết.

Bạn có thể thay đổi hành vi này bằng cách thiết lập RemoveIPC=notrong /etc/systemd/logind.conf(mặc định trên Ubuntu là yes) và khởi động lại systemd-logind.service.

Tốt hơn là để Apache chạy với tư cách người dùng hệ thống (ví dụ: www-datatrên Ubuntu) và sử dụng các quyền và ACL để cấp www-dataquyền truy cập vào các tệp mà nó cần để đọc / ghi.