OSX Mavericks: Làm cách nào tôi có thể khởi chạy máy chủ web khi khởi động và nghe cổng 80 mà không cần chạy máy chủ web với quyền root?


1

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ư _wwwngườ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: _wwwkhai 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ì?


1
Tôi tin rằng nó sẽ không hoạt động, ngay cả với launchd. AFAICT bạn cần chạy nó với quyền root. Bạn có thể làm cho nginx tự bỏ các đặc quyền sau đó. Tôi không chắc chắn về những gì cần phải thay đổi trong nginx.conf, nhưng nên có một cái gì đó như User- thay đổi nó thành _www.
jweyrich

1
@jweyrich Trừ khi tôi nhầm, tài liệu của Apple nêu rõ rằng những gì tôi yêu cầu có thể. Xem phần đầu của câu hỏi. Cảm ơn bạn đã chỉ ra nginx '' user 'directive. Nếu tôi không thể tìm thấy một cách tốt hơn, tôi sẽ sử dụng nó. Tuy nhiên, nginx chỉ áp dụng chỉ thị này cho các quy trình worker - quy trình chủ vẫn chạy dưới quyền root. (Tôi vừa mới kiểm tra nó để chắc chắn.)
Pitarou

1
Bạn hoàn toàn đúng khi bạn nói điều đó là có thể, tuy nhiên, launchd không làm được điều gì kỳ diệu. Một daemon cần "lấy" ổ cắm bị ràng buộc bởi launchd (ví dụ 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.
jweyrich

1
@jweyrich Tôi thấy. Cảm ơn đã dành thời gian để làm cho rõ ràng. :-)
Pitarou

1
Không vấn đề gì. Không có gì.
jweyrich

Câu trả lời:


2

Một daemon cần "lấy" ổ cắm bị ràng buộc bởi launchd (ví dụ 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, vì vậy tôi đề xuất một trong các tùy chọn sau:

  • Điều chỉnh cổng nginx thành> 1024, sau đó thiết lập tường lửa của bạn để chuyển hướng lưu lượng truy cập từ / đến cổng 80 đến / từ cổng nginx;
  • Để launchd chạy nginx với quyền root và làm cho nginx bỏ các đặc quyền của nó sau đó bằng cách thay đổi lệnh usertrên tệp cấu hình của nó;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.