Jak uruchomić nginx na porcie 80 przy logowaniu do OS X?

24

Zainstalowałem Nginx za pomocą homebrew i po zakończeniu instalacji wyświetlił się następujący komunikat:

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.)

Ale chcę, aby Nginx na porcie 80 działał przy logowaniu i nie chcę otwierać terminala i pisać, sudo nginxaby to zrobić. Chcę, aby ładował się z pliku plist, takiego jak Redis i PostgreSQL.

Przeniosłem plist /Library/LaunchAgents/z ekwiwalentu folderu użytkownika i zmieniłem jego własność, próbowałem również ustawić userdyrektywę w nginx.confpliku i nadal ten sam komunikat o błędzie w Console.app:

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

(wraz z innym komunikatem informującym, że ponieważ nginxbył uruchamiany bez uprawnień superużytkownika, userdyrektywa była ignorowana)

Bryson
źródło
Upewnij się, że plik plist ma własność „root: wheel” podczas przenoszenia go w dowolnym folderze LaunchDaemons. w przeciwnym razie launchctl nie uruchomi go z powodu „wątpliwej własności”.
risyasin

Odpowiedzi:

12

Odkryłem, że łatwiejszym podejściem było utworzenie pliku add plist w / Library / LaunchDaemons /

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

Lub, jeśli chcesz, aby uruchamiał się po zalogowaniu, możesz umieścić go w ~ / Library / LaunchAgents /, tym samym pliku plist. Umożliwi to dostęp do komendy launchd launchctl z nazwy użytkownika bez konieczności wywoływania sudo.

i wstaw następujące (pamiętaj o zaktualizowaniu ścieżki do instalacji nginx i nazwy użytkownika do swojej nazwy użytkownika):

<?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>
Rich Kroll
źródło
To przydatna odpowiedź, ale technicznie zaczyna się od nginx przy starcie, a nie przy logowaniu. Jeśli @Bryson naprawdę chce, aby działał tylko po zalogowaniu się na określone konto GUI, nie jest to odpowiednia odpowiedź. Podejrzewam jednak, że naprawdę chce, aby uruchomił się zaraz po uruchomieniu komputera, nawet jeśli GUI czeka w oknie logowania, zamiast czekać, aż się zaloguje.
Spiff
Dodałem go ~/Library/LaunchAgents/i w konsoli pojawiają się następujące błędy: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 . Zmieniłem Programciąg na, /usr/local/Cellar/nginx/1.2.7/sbin/nginxjeśli to ma znaczenie.
hobbes3
3
Właściwie właśnie wziąłem oryginał homebrew.mxcl.nginx.plist, zmieniłem UserNamena root, a potem sudo chown rootpobiegłem sudo launchctl load -wi zadziałało.
hobbes3
Czy mogę po prostu sprawdzić - masz .plist w ~ / Library / LaunchAgents / (więc jest tylko dla jednego użytkownika), ale zaczyna się jako root? Nigdy nie widziałem takiej możliwości wspomnianej w dokumentacji, a kiedy wypróbowałem ją na Mavericks, nie udało się.
Pitarou
@ hobbes3 @ rich-kroll Prawie rok później, ale KeepAlive może być prawdą lub ustawić na dyktando zawierające NetworkState. Tak więc powyższy przykład powinien powiedzieć<key>KeepAlive</key><dict><key>NetworkState</key><true/></dict> (zauważ, że KeepAlive zastąpiłem truesłownikiem zawierającym NetworkState). Źródło: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange
9

Przybyłem tutaj, ponieważ miałem ten sam problem. Moje rozwiązanie było podobne do powyższego Richa, z tym wyjątkiem, że użyłem skryptu startowego Homebrew nginx:

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

Dla porównania, oto jak wygląda ten homebrew.mxcl.nginx.plist:

<?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>

Mam 2 aliasy dodane do mojego $ HOME / .profile, aby ułatwić uruchamianie i zatrzymywanie nginx.

# 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'

Mój problem polegał na tym, że z jakiegoś powodu nginx początkowo nie uruchamiał się poprawnie. Musiałem tylko uruchomić stop-nginx, aby go zwolnić, a następnie ponownie uruchomić za pomocą start-nginx.

skuld
źródło
4
Alternatywnie: lunchy restart nginxpatrz github.com/mperham/lunchy
Andrei
1

Nie jest to dokładna odpowiedź na twoje pytanie, ale może być wystarczająco blisko: możesz przekierować port 80 na port 8080, używając filtru pakietów pf(testowany na OS X 10.9). Dodaj następujący wiersz do /etc/pf.conf(powinien znajdować się powyżej reguł filtrowania):

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

Wyjaśnienie (większości) elementów tej linii można znaleźć tutaj .

Aby uzyskać więcej informacji, zobacz /superuser//a/521803 i http://www.openbsd.org/faq/pf/index.html , chociaż ten ostatni wydaje się opisywać nowszą wersję pf, w której linia będzie napisana inaczej.

Webthusiast
źródło
0

Mogę wymyślić dwa wyjaśnienia:

  1. W twoim .plistpliku jest kilka takich linii :

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

    Mówi to uruchomione, aby uruchomić nginx z uprawnieniami określonego użytkownika, a nie root.

    Jeśli chcesz, aby nginx powiązał się z portem 80, powinieneś ustawić nazwę użytkownika w dyrektywie użytkownika nginx , a nie w .plist. nginx wówczas upuści uprawnienie do procesów roboczych, chociaż proces główny nadal będzie rootem.

  2. Masz nginx .plistw ~/Library/LaunchAgents/(zauważ wiodący ~) zamiast /Library/LaunchAgents.

    Zauważ, że można aktywować i dezaktywować .plists, więc możliwe jest, że w twoim systemie są dwie .listy nginx, ale tylko jedna z nich jest aktywna.

Pitarou
źródło
0

Wziąłem inspirację z serwera Pow i stworzyłem listę, która konfiguruje przekierowanie portów. Przekierowuje port 80 na port 8080, a port 443 na port 8443. W ten sposób mogę uruchomić nginx pod zwykłym użytkownikiem, a wszystkie moje połączenia działają transparentnie.

Plist jest tutaj: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

stefansundin
źródło