Làm cách nào để bắt đầu nginx trên cổng 80 khi đăng nhập OS X?


24

Tôi đã cài đặt Nginx bằng homebrew và sau khi hoàn tất cài đặt, thông báo sau được hiển thị:

In the interest of allowing you to run `nginx` without `sudo`, the default
port is set to localhost:8080.

If you want to host pages on your local machine to the public, you should
change that to localhost:80, and run `sudo nginx`. You'll need to turn off
any other web servers running port 80, of course.

You can start nginx automatically on login running as your user with:
  mkdir -p ~/Library/LaunchAgents
  cp #{prefix}/org.nginx.nginx.plist ~/Library/LaunchAgents/
  launchctl load -w ~/Library/LaunchAgents/org.nginx.nginx.plist

Though note that if running as your user, the launch agent will fail if you
try to use a port below 1024 (such as http's default of 80.)

Nhưng tôi muốn Nginx, trên cổng 80, chạy khi đăng nhập và tôi không muốn phải mở terminal và gõ vào sudo nginxđể làm điều đó. Tôi muốn nó tải từ một tệp plist như Redis và PostgreSQL làm.

Tôi đã chuyển plist sang /Library/LaunchAgents/từ thư mục người dùng tương đương và thay đổi quyền sở hữu của nó, cũng đã thử đặt lệnh usertrong nginx.conftệp và vẫn giữ nguyên thông báo lỗi trong Console.app:

nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

(cùng với một thông báo khác cho tôi biết rằng vì nginxđang được chạy mà không có đặc quyền siêu người dùng, lệnh userđã bị bỏ qua)


Hãy chắc chắn rằng tệp plist của bạn có quyền sở hữu "root: wheel" khi bạn di chuyển nó trong bất kỳ thư mục LaunchDaemons nào. nếu không launchctl sẽ không chạy nó beacuse của "quyền sở hữu đáng ngờ".
risyasin

Câu trả lời:


12

Tôi tìm thấy một cách tiếp cận dễ dàng hơn là tạo thêm tệp plist trong / Library / LaunchDaemons /

sudo vi /Library/LaunchDaemons/org.nginx.nginx.plist

Hoặc, nếu bạn muốn nó khởi chạy khi đăng nhập, bạn có thể đặt nó vào ~ / Library / LaunchAgents /, cùng một tệp plist. Điều này sẽ cho phép bạn truy cập lệnh launchctl launchd từ tên người dùng của bạn mà không cần phải gọi sudo.

và chèn các mục sau (đảm bảo cập nhật đường dẫn đến cài đặt nginx của bạn và tên người dùng cho tên người dùng của bạn):

<?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>
    <key>Label</key>
    <string>nginx</string>
    <key>Program</key>
    <string>/usr/local/Cellar/nginx/1.6.2/bin/nginx</string>
    <key>KeepAlive</key>
    <true/>
    <key>NetworkState</key>
    <true/>
    <key>LaunchOnlyOnce</key>
    <true/>
    <key>UserName</key>
    <string>yourusername</string>
</dict>
</plist>

Đây là một câu trả lời hữu ích, nhưng về mặt kỹ thuật, nó bắt đầu nginx khi khởi động, không đăng nhập. Nếu @Bryson thực sự chỉ muốn nó chạy sau khi anh ta đăng nhập vào một tài khoản GUI nhất định, thì đây không phải là câu trả lời đúng. Nhưng tôi nghi ngờ anh ta thực sự muốn nó chạy ngay khi máy khởi động, ngay cả khi GUI đang chờ ở Cửa sổ đăng nhập, thay vì đợi cho đến khi anh ta thực sự đăng nhập.
Spiff

Tôi đã thêm nó vào ~/Library/LaunchAgents/và tôi nhận được các lỗi sau trong Bảng điều khiển : 3/30/13 9:39:24.047 AM com.apple.launchd.peruser.501[884]: (nginx) Unknown key for boolean: NetworkState 3/30/13 9:39:24.047 AM com.apple.launchd.peruser.501[884]: (nginx) Ignored this key: UserName 3/30/13 9:39:24.047 AM com.apple.launchd.peruser.501[884]: (nginx) Ignored this key: UserName. Tôi đã thay đổi Programchuỗi thành /usr/local/Cellar/nginx/1.2.7/sbin/nginxnếu điều đó quan trọng.
hobbes3

3
Thật ra tôi chỉ lấy bản gốc homebrew.mxcl.nginx.plist, đổi UserNamethành root, sau đó sudo chown root, và chạy sudo launchctl load -wvà nó hoạt động.
hobbes3

Tôi chỉ có thể kiểm tra - bạn có .plist trong ~ / Library / LaunchAgents / (vì vậy nó chỉ dành cho một người dùng), nhưng nó bắt đầu bằng root? Tôi chưa bao giờ thấy khả năng đó được đề cập trong tài liệu này và khi tôi thử nó trên Mavericks thì nó đã thất bại.
Pitarou

@ hobbes3 @ rich-kroll Gần một năm sau, KeepAlive có thể đúng hoặc được đặt thành một lệnh có chứa NetworkState. Vì vậy, ví dụ trên nên nói <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(lưu ý rằng tôi đã thay thế KeepAlive truebằng từ điển có chứa NetworkState). Nguồn: developer.apple.com/l
Library / mac / documentation / Darwin / Reference / 50

9

Tôi đến đây vì tôi đang gặp vấn đề tương tự. Giải pháp của tôi tương tự như Rich ở trên, ngoại trừ tôi đã sử dụng tập lệnh khởi động Homebrew nginx:

sudo cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist /Library/LaunchDaemons/

Để tham khảo, đây là những gì homebrew.mxcl.nginx.plist trông giống như:

<?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>
    <key>Label</key>
    <string>homebrew.mxcl.nginx</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>UserName</key>
    <string>root</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/sbin/nginx</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
  </dict>
</plist>

Tôi có 2 bí danh được thêm vào $ HOME / .profile của tôi để giúp bắt đầu và dừng nginx dễ dàng hơn.

# Nginx needs to bind to port 80 so must run as /Library/LaunchDaemon with sudo
alias start-nginx='sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist'
alias stop-nginx='sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist'

Vấn đề của tôi là vì một số lý do, nginx ban đầu không khởi động đúng cách. Tôi chỉ phải chạy stop-nginx để dỡ nó ra, và sau đó khởi động lại nó với start-nginx.


4
Thay thế : lunchy restart nginx, xem github.com/mperham/lunchy
Andrei

1

Không phải là một câu trả lời chính xác cho câu hỏi của bạn, nhưng có thể đến đủ gần: bạn có thể chuyển hướng cổng 80 sang cổng 8080, bằng cách sử dụng bộ lọc gói pf(được thử nghiệm trên OS X 10.9). Thêm dòng sau vào của bạn /etc/pf.conf(nó sẽ vượt lên trên các quy tắc lọc):

rdr pass on lo0 inet proto tcp from any to any port http -> localhost port 8080

Một lời giải thích về (hầu hết) các yếu tố của dòng này có thể được tìm thấy ở đây .

Để biết thêm thông tin, hãy xem https://superuser.com/a/521804http://www.openbsd.org/faq/pf/index.html , mặc dù phiên bản sau có vẻ mô tả phiên bản mới hơn pf, trong đó phiên bản đã cho dòng sẽ được viết khác nhau.


0

Tôi có thể nghĩ về hai cách giải thích:

  1. Có một số dòng như thế này trong .plisttập tin của bạn :

    <key>Username</key>
    <string>some_user</string>
    

    Điều này nói với launchd để khởi chạy nginx với các đặc quyền của người dùng được chỉ định, thay vì root.

    Nếu bạn muốn nginx liên kết với cổng 80, bạn nên đặt tên người dùng trong chỉ thị người dùng của nginx , thay vì trong .plist. nginx sau đó sẽ bỏ đặc quyền cho các tiến trình worker, mặc dù tiến trình master vẫn sẽ là root.

  2. Bạn có một nginx .plisttrong ~/Library/LaunchAgents/(lưu ý hàng đầu ~) chứ không phải /Library/LaunchAgents.

    Lưu ý rằng có thể kích hoạt và hủy kích hoạt .plists, vì vậy có thể có hai nginx .plists trên hệ thống của bạn, nhưng chỉ một trong số chúng hoạt động.


0

Tôi lấy cảm hứng từ máy chủ Pow và thực hiện một kế hoạch thiết lập chuyển tiếp cổng. Nó chuyển tiếp cổng 80 đến cổng 8080 và cổng 443 sang cổng 8443. Bằng cách này tôi có thể chạy nginx dưới một người dùng bình thường và tất cả các kết nối của tôi đều hoạt động trong suốt.

Số nhiều ở đây: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

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.