Comment démarrer nginx sur le port 80 lors de la connexion à OS X?

24

J'ai installé Nginx en utilisant homebrew et après avoir terminé l'installation, le message suivant s'est affiché:

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

Mais je veux que Nginx, sur le port 80, s'exécute à la connexion et je ne veux pas avoir à ouvrir le terminal et taper sudo nginxpour le faire. Je veux qu'il se charge à partir d'un fichier plist comme Redis et PostgreSQL.

J'ai déplacé le plist vers /Library/LaunchAgents/l'équivalent du dossier utilisateur et changé sa propriété, j'ai également essayé de définir la userdirective dans le nginx.conffichier et toujours le même message d'erreur dans Console.app:

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

(avec un autre message me disant que, nginxétant exécuté sans privilèges de super-utilisateur, la userdirective était ignorée)

Bryson
la source
Assurez-vous que votre fichier plist a la propriété "root: wheel" lorsque vous le déplacez dans l'un des dossiers LaunchDaemons. sinon launchctl ne l'exécutera pas en raison d'une "propriété douteuse".
risyasin

Réponses:

12

J'ai trouvé qu'une approche plus simple consistait à créer un fichier d'ajout de plist dans / Library / LaunchDaemons /

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

Ou, si vous voulez qu'il se lance à la connexion, vous pouvez le mettre dans ~ / Library / LaunchAgents /, le même fichier plist. Cela vous permettra d'accéder à la commande launchd launchctl à partir de votre nom d'utilisateur sans avoir à appeler sudo.

et insérez ce qui suit (assurez-vous de mettre à jour le chemin d'accès à votre installation nginx et le nom d'utilisateur à votre nom d'utilisateur):

<?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
la source
C'est une réponse utile, mais techniquement, cela démarre nginx au démarrage, pas la connexion. Si @Bryson ne veut vraiment l'exécuter qu'après s'être connecté à un certain compte GUI, alors ce n'est pas tout à fait la bonne réponse. Mais je soupçonne qu'il veut vraiment qu'il fonctionne dès que la machine a démarré, même si l'interface graphique attend dans la fenêtre de connexion, plutôt que d'attendre qu'il se connecte réellement.
Spiff
Je l' ai ajouté à ~/Library/LaunchAgents/et je reçois les erreurs suivantes dans la 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. J'ai changé la Programchaîne en /usr/local/Cellar/nginx/1.2.7/sbin/nginxsi cela compte.
hobbes3
3
En fait , je viens de prendre l'original homebrew.mxcl.nginx.plist, changé UserNamepour root, ensuite sudo chown root, et RAN sudo launchctl load -wet cela a fonctionné.
hobbes3
Puis-je simplement vérifier - vous avez un .plist dans ~ / Library / LaunchAgents / (donc c'est pour un seul utilisateur), mais il démarre en tant que root? Je n'ai jamais vu cette possibilité mentionnée dans la documentation, et quand je l'ai essayée sur Mavericks, elle a échoué.
Pitarou
@ hobbes3 @ rich-kroll Presque un an plus tard, mais KeepAlive peut être vrai ou défini sur un dict contenant NetworkState. Ainsi, l'exemple ci-dessus devrait dire <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(notez que j'ai remplacé KeepAlive truepar le dictionnaire contenant NetworkState). Source: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange
9

Je suis arrivé ici parce que je rencontrais le même problème. Ma solution était similaire à celle de Rich ci-dessus, sauf que j'ai utilisé le script de démarrage Homebrew nginx:

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

Pour référence, voici à quoi ressemble 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>

J'ai 2 alias ajoutés à mon $ HOME / .profile pour faciliter le démarrage et l'arrêt de 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'

Mon problème était que pour une raison quelconque, nginx ne démarrait pas correctement au départ. J'ai juste eu à exécuter stop-nginx pour le décharger, puis à le redémarrer à nouveau avec start-nginx.

skuld
la source
4
Alternative :,lunchy restart nginx voir github.com/mperham/lunchy
Andrei
1

Pas une réponse exacte à votre question, mais pourrait se rapprocher assez: vous pouvez rediriger le port 80 vers le port 8080, en utilisant le packetfilter pf(testé sur OS X 10.9). Ajoutez la ligne suivante à votre /etc/pf.conf(elle doit dépasser les règles de filtrage):

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

Une explication de (la plupart) des éléments de cette ligne peut être trouvée ici .

Pour plus d'informations, voir /superuser//a/521803 et http://www.openbsd.org/faq/pf/index.html , bien que ce dernier semble décrire une version plus récente de pf, dans laquelle la donnée la ligne serait écrite différemment.

Webthusiast
la source
0

Je peux penser à deux explications:

  1. Il y a quelques lignes comme celle-ci dans votre .plistfichier:

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

    Cela indique à launchd de lancer nginx avec les privilèges de l'utilisateur spécifié, plutôt que root.

    Si vous souhaitez que nginx se lie au port 80, vous devez définir le nom d'utilisateur dans la directive utilisateur de nginx , plutôt que dans le .plist. nginx supprimera alors le privilège pour les processus de travail, bien que le processus maître soit toujours root.

  2. Vous avez un nginx .plistdans ~/Library/LaunchAgents/(notez le début ~) plutôt que /Library/LaunchAgents.

    Notez qu'il est possible d'activer et de désactiver les .plists, il est donc possible qu'il y ait deux nginx .plists sur votre système, mais qu'un seul d'entre eux est actif.

Pitarou
la source
0

Je me suis inspiré du serveur Pow et j'ai créé une liste qui configure la redirection de port. Il transfère le port 80 au port 8080 et le port 443 au port 8443. De cette façon, je peux exécuter nginx sous un utilisateur normal et toutes mes connexions fonctionnent de manière transparente.

La liste est ici: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

stefansundin
la source