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

J'ai installé Nginx en utilisant homebrew et après avoir terminé l'installation, le message suivant a été 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 Nginx, sur le port 80, en cours d'exécution et je ne souhaite pas ouvrir le terminal et taper sudo nginx pour le faire. Je veux qu'il soit chargé à partir d'un fichier plist tel que Redis et PostgreSQL.

J'ai déplacé le programme vers /Library/LaunchAgents/ de l'équivalent du dossier utilisateur et j'ai changé sa propriété, j'ai également essayé de définir la directive user dans le fichier nginx.conf 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 depuis que nginx était exécuté sans privilèges de superutilisateur, la directive user était ignorée)

J'ai trouvé qu'une approche plus simple était de créer un fichier add plist dans / Library / LaunchDaemons /

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

Ou, si vous voulez le lancer lors de 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 appeler sudo.

Et insérez les éléments suivants (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> 

Je suis arrivé 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 comment appartient ce 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 d'abord. J'ai juste dû exécuter l'arrêt-nginx pour le décharger, puis redémarrer avec start-nginx.

J'ai eu la même question et trouvé la réponse et une écriture approfondie ici: http://wiki.summercode.com/running_homebrewed_nginx_with_sudo_on_mac_os_x

Pas une réponse exacte à votre question, mais pourrait être assez proche: vous pouvez rediriger le port 80 vers le port 8080 en utilisant le filtre de paquet pf (testé sur OS X 10.9). Ajoutez la ligne suivante à votre /etc/pf.conf (cela devrait être supérieur aux 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 https://superuser.com/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 La ligne donnée serait écrite différemment.

Je peux penser à deux explications:

  1. Il existe des lignes comme dans votre fichier .plist :

     <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 de racine.

    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 fichier .plist. Nginx déposera alors le privilège pour les processus de travail, bien que le processus principal soit toujours root.

  2. Vous avez une page nginx dans ~/Library/LaunchAgents/ (notez le ~ principal) plutôt que /Library/LaunchAgents .

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