Theo tài liệu của Applelaunchd
:
[launchd] Loại bỏ lý do chính để chạy daemon như root. Vì launchd chạy dưới quyền root, nó có thể tạo ra các ổ cắm nghe TCP / IP được đánh số thấp và đưa chúng ra daemon .
Điều đó tốt ... nhưng làm thế nào?
Tôi muốn làm như sau:
- khởi động máy chủ web Nginx khi khởi động
- nghe nó ở cổng 80
- nó chạy như
_www
người dùng
đó chính xác là kịch bản mà tài liệu trên đang nói đến. Nhưng tôi không tìm thấy cách nào để làm điều đó mà không cho tôi một bind() to 0.0.0.0:80 failed (13: Permission denied)
thông báo lỗi.
Đây là tập tin .plist tôi có tại /Systems/Library/LaunchDemons/homebrew.mxcl.nginx.plist
:
<!--
Adapted from the .plist file provided as part of
the Mac Homebrew distribution of nginx.
-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!--
Here's the problem!!
<key>Username</key>
<string>_www</string>
-->
<!--
I thought that Sock(et) declarations would be
the way to tell launchd to hand off a port to the
daemon. So I added these lines, but they don't
appear to make any difference at all.
-->
<key>SockServiceName</key>
<string>http</string>
<key>SockType</key>
<string>stream</string>
<key>SockFamily</key>
<string>IP4</string>
<key>Label</key>
<string>homebrew.mxcl.nginx</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>StandardOutputPath</key>
<string>/var/log/nginx.log</string>
<key>StandardErrorPath</key>
<string>/var/log/nginx.log</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/nginx/bin/nginx</string>
</array>
<key>WorkingDirectory</key>
<string>/usr/local</string>
</dict>
</plist>
Như bạn có thể thấy, Username: _www
được nhận xét. Vì vậy, khi tôi chạy launchd với quyền root, nginx chạy bằng root và mọi thứ đều hoạt động tốt. Nhưng khi tôi đưa vào Username: _www
khai báo, nginx không thành công và để lại thông báo lỗi này trong logfile:
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
Tôi đang thiếu gì?
launch_data_get_fd
:) - nó cần được nhận biết bằng launchd và thực hiện một số logic bên trong. AFAIK không phải là trường hợp của nginx.
User
- thay đổi nó thành _www.