Wie starte ich Nginx auf Port 80 bei der Anmeldung unter OS X?


24

Ich habe Nginx mit Homebrew installiert und nach Abschluss der Installation wurde die folgende Meldung angezeigt:

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

Ich möchte jedoch , dass Nginx auf Port 80 bei der Anmeldung ausgeführt wird, und ich möchte nicht das Terminal öffnen und eingeben müssen, sudo nginxum dies zu tun. Ich möchte, dass es aus einer plist-Datei geladen wird, wie es Redis und PostgreSQL tun.

Ich habe die plist /Library/LaunchAgents/aus dem Benutzerordner in den entsprechenden Ordner verschoben und den Besitzer geändert. Außerdem habe ich versucht, die userDirektive in der nginx.confDatei zu setzen, und immer noch die gleiche Fehlermeldung in Console.app:

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

(zusammen mit einer anderen Nachricht, die mir mitteilte, dass nginxdie userDirektive ignoriert wurde , da sie ohne Superuser-Berechtigungen ausgeführt wurde)


Stellen Sie sicher, dass Ihre plist-Datei den Eigentümer "root: wheel" hat, wenn Sie sie in einen der LaunchDaemons-Ordner verschieben. Andernfalls wird launchctl wegen "zweifelhaften Eigentums" nicht ausgeführt.
Risyasin

Antworten:


12

Ich fand es einfacher, eine Add-Plist-Datei in / Library / LaunchDaemons / zu erstellen.

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

Wenn Sie möchten, dass es beim Anmelden gestartet wird, können Sie es in ~ / Library / LaunchAgents / ablegen, dieselbe plist-Datei. Auf diese Weise können Sie von Ihrem Benutzernamen aus auf den Befehl launchd launchctl zugreifen, ohne sudo aufrufen zu müssen.

und fügen Sie Folgendes ein (achten Sie darauf, den Pfad zu Ihrer Nginx-Installation und den Benutzernamen zu Ihrem Benutzernamen zu aktualisieren):

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

Dies ist eine nützliche Antwort, aber technisch gesehen startet nginx beim Booten, nicht beim Einloggen. Wenn @Bryson wirklich nur möchte, dass es ausgeführt wird, nachdem er sich bei einem bestimmten GUI-Konto angemeldet hat, ist dies nicht die richtige Antwort. Aber ich vermute, er möchte wirklich, dass es läuft, sobald der Computer hochgefahren ist, selbst wenn die Benutzeroberfläche am Anmeldefenster wartet, anstatt zu warten, bis er sich tatsächlich anmeldet.
Spiff

Ich habe es zu ~/Library/LaunchAgents/und ich erhalte die folgenden Fehler in Console: 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. Ich habe die ProgramSaite geändert , /usr/local/Cellar/nginx/1.2.7/sbin/nginxwenn das wichtig ist.
Hobbes3

3
Eigentlich habe ich nur das Original homebrew.mxcl.nginx.plist, geändert UserNamezu root, dann sudo chown root, und ran sudo launchctl load -wund es funktionierte.
Hobbes3

Kann ich nur überprüfen - Sie haben eine .plist in ~ / Library / LaunchAgents / (also nur für einen Benutzer), aber sie startet als root? Ich habe diese in der Dokumentation erwähnte Möglichkeit noch nie gesehen, und als ich sie auf Mavericks ausprobierte, schlug sie fehl.
Pitarou

@ hobbes3 @ rich-kroll Fast ein Jahr später, aber KeepAlive kann entweder true sein oder auf ein Diktat gesetzt werden, das NetworkState enthält. Das obige Beispiel sollte also <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>lauten (beachten Sie, dass ich KeepAlive truedurch das Wörterbuch ersetzt habe, das NetworkState enthält). Quelle: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange

9

Ich bin hierher gekommen, weil ich auf dasselbe Problem gestoßen bin. Meine Lösung war ähnlich wie die von Rich, außer dass ich das Homebrew-Nginx-Startskript verwendet habe:

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

Als Referenz sehen Sie hier, wie diese homebrew.mxcl.nginx.plist aussieht:

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

Ich habe 2 Aliase zu meinem $ HOME / .profil hinzugefügt, um das Starten und Stoppen von nginx zu vereinfachen.

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

Mein Problem war, dass Nginx aus irgendeinem Grund anfangs nicht richtig gestartet wurde. Ich musste nur stop-nginx ausführen, um es zu entladen, und es dann mit start-nginx erneut starten.


4
Alternativ: lunchy restart nginxsiehe github.com/mperham/lunchy
Andrei

1

Keine exakte Antwort auf Ihre Frage, könnte aber nah genug sein: Sie können Port 80 mithilfe des Paketfilters pf(getestet unter OS X 10.9) auf Port 8080 umleiten . Fügen Sie die folgende Zeile zu Ihrer hinzu /etc/pf.conf(sie sollte über den Filterregeln liegen):

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

Eine Erklärung der (meisten) Elemente dieser Zeile finden Sie hier .

Weitere Informationen finden Sie unter /superuser//a/521803 und http://www.openbsd.org/faq/pf/index.html . Letzteres scheint jedoch eine neuere Version von zu beschreiben pf, in der die angegebenen Zeile würde anders geschrieben werden.


0

Mir fallen zwei Erklärungen ein:

  1. In Ihrer .plistDatei befinden sich einige Zeilen wie diese :

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

    Dies weist launchd an, nginx mit den Rechten des angegebenen Benutzers anstelle von root zu starten.

    Wenn Sie möchten, dass Nginx an Port 80 gebunden wird , sollten Sie den Benutzernamen in der Benutzeranweisung von Nginx und nicht in der .plist festlegen. nginx löscht dann das Privileg für die Worker-Prozesse, obwohl der Master-Prozess immer noch root ist.

  2. Sie haben ein Nginx .plistin ~/Library/LaunchAgents/(beachten Sie die führenden ~) und nicht /Library/LaunchAgents.

    Beachten Sie, dass es möglich ist, .plists zu aktivieren und zu deaktivieren, sodass auf Ihrem System möglicherweise zwei nginx .plists vorhanden sind, von denen jedoch nur eine aktiv ist.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.