Come posso avviare nginx sulla porta 80 al login OS X?


24

Ho installato Nginx usando homebrew e dopo aver completato l'installazione è stato visualizzato il seguente messaggio:

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

Ma voglio Nginx, sulla porta 80, in esecuzione al login e non voglio aprire il terminale e digitare sudo nginxper farlo. Voglio che si carichi da un file plist come fanno Redis e PostgreSQL.

Ho spostato il plist /Library/LaunchAgents/dall'equivalente della cartella utente e ho cambiato la sua proprietà, ho anche provato a impostare la userdirettiva nel nginx.conffile e comunque lo stesso messaggio di errore in Console.app:

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

(insieme a un altro messaggio che mi diceva che dato che nginxera stato eseguito senza privilegi di superutente, la userdirettiva veniva ignorata)


Assicurati che il tuo file plist abbia la proprietà "root: wheel" quando lo sposti in una delle cartelle di LaunchDaemons. altrimenti launchctl non lo eseguirà a causa della "proprietà dubbia".
risyasin,

Risposte:


12

Ho trovato un approccio più semplice era quello di creare un file di aggiunta plist in / Library / LaunchDaemons /

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

Oppure, se si desidera che venga avviato all'accesso, è possibile inserirlo in ~ / Library / LaunchAgents /, lo stesso file plist. Ciò ti consentirà di accedere al comando launchd launchctl dal tuo nome utente senza la necessità di chiamare sudo.

e inserisci quanto segue (assicurati di aggiornare il percorso alla tua installazione nginx e il nome utente al tuo nome utente):

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

Questa è una risposta utile, ma tecnicamente avvia nginx all'avvio, non al login. Se @Bryson vuole davvero che funzioni solo dopo aver effettuato l'accesso a un determinato account GUI, questa non è proprio la risposta giusta. Ma sospetto che lo voglia davvero funzionare non appena la macchina si è avviata, anche se la GUI è in attesa nella finestra di accesso, piuttosto che attendere fino a quando non effettua effettivamente l'accesso.
Spiff

Ho aggiunto a ~/Library/LaunchAgents/e ottengo i seguenti errori 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. Ho cambiato Programstringa in /usr/local/Cellar/nginx/1.2.7/sbin/nginxse questo è importante.
hobbes3

3
In realtà ho appena preso l'originale homebrew.mxcl.nginx.plist, cambiato UserNameper root, poi sudo chown root, e corse sudo launchctl load -we ha funzionato.
hobbes3,

Posso solo controllare - hai un .plist in ~ / Library / LaunchAgents / (quindi è solo per un utente), ma inizia come root? Non ho mai visto quella possibilità menzionata nella documentazione e quando l'ho provata su Mavericks non è riuscita.
Pitarou,

@ hobbes3 @ rich-kroll Quasi un anno dopo, ma KeepAlive può essere vero o impostato su un dict che contiene NetworkState. Quindi l'esempio sopra dovrebbe dire <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(nota che ho sostituito KeepAlive truecon il dizionario contenente NetworkState). Fonte: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange

9

Sono arrivato qui perché stavo incontrando lo stesso problema. La mia soluzione era simile a quella di Rich sopra, tranne per il fatto che ho usato lo script di avvio di Homeginw nginx:

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

Per riferimento, ecco come appare l'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>

Ho aggiunto 2 alias al mio $ HOME / .profile per rendere più semplice l'avvio e l'arresto di 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'

Il mio problema era che per qualche motivo inizialmente nginx non si avviava correttamente. Ho dovuto solo eseguire lo stop-nginx per scaricarlo, quindi riavviarlo nuovamente con start-nginx.


4
Alternativa: lunchy restart nginxvedi github.com/mperham/lunchy
Andrei

1

Non è una risposta esatta alla tua domanda, ma potrebbe avvicinarsi abbastanza: puoi reindirizzare la porta 80 alla porta 8080, usando il filtro pacchetti pf(testato su OS X 10.9). Aggiungi la seguente riga al tuo /etc/pf.conf(dovrebbe venire sopra le regole di filtro):

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

Una spiegazione di (la maggior parte) degli elementi di questa linea è disponibile qui .

Per ulteriori informazioni, consultare /superuser//a/521803 e http://www.openbsd.org/faq/pf/index.html , sebbene quest'ultimo sembra descrivere una versione più recente di pf, in cui il dato la riga verrebbe scritta diversamente.


0

Posso pensare a due spiegazioni:

  1. Ci sono alcune righe come questa nel tuo .plistfile:

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

    Questo dice a launchd di avviare nginx con i privilegi dell'utente specificato, piuttosto che root.

    Se si desidera che nginx si associ alla porta 80, è necessario impostare il nome utente nella direttiva utente di nginx , piuttosto che nella .plist. nginx eliminerà quindi il privilegio per i processi di lavoro, sebbene il processo principale rimarrà comunque root.

  2. Hai un nginx .plistin ~/Library/LaunchAgents/(nota il primo ~) piuttosto che /Library/LaunchAgents.

    Nota che è possibile attivare e disattivare .plists, quindi è possibile che ci siano due .plist nginx sul tuo sistema, ma solo uno di essi è attivo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.