Thoát các phiên SSH đột ngột giết Apache
Đượ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 sangroot,restartdịch vụ với tư cáchroot, chuyển trở lạiapp, 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 sangapp, chuyển trở lạiroot, 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áchapp, 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 sangroot,restartdịch vụ dưới dạngrootvà 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òngRemainAfterExit=nothànhRemainAfterExit=yes, thực hiện asystemctl daemon-reload, và cuối cùng là aservice 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
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.