¿Cómo inicio nginx en el puerto 80 al iniciar sesión en OS X?

24

Instalé Nginx usando homebrew y después de completar la instalación se mostró el siguiente mensaje:

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

Pero quiero que Nginx, en el puerto 80, se ejecute al iniciar sesión y no quiero tener que abrir el terminal y escribir sudo nginxpara hacerlo. Quiero que se cargue desde un archivo plist como Redis y PostgreSQL.

Moví el plist a /Library/LaunchAgents/la carpeta de usuario equivalente y cambié su propiedad, también intenté configurar la userdirectiva en el nginx.confarchivo y aún el mismo mensaje de error en Console.app:

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

(junto con otro mensaje que me dice que, dado que nginxse estaba ejecutando sin privilegios de superusuario, la userdirectiva se estaba ignorando)

Bryson
fuente
Asegúrese de que su archivo plist tenga la propiedad "root: wheel" cuando lo mueva en cualquiera de las carpetas LaunchDaemons. de lo contrario, launchctl no lo ejecutará debido a "propiedad dudosa".
risyasin

Respuestas:

12

Encontré que un enfoque más fácil era crear un archivo agregar plist en / Library / LaunchDaemons /

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

O, si desea que se inicie al iniciar sesión, puede ponerlo en ~ / Library / LaunchAgents /, el mismo archivo plist. Esto le permitirá acceder al comando launchd launchctl desde su nombre de usuario sin necesidad de llamar a sudo.

e inserte lo siguiente (asegúrese de actualizar la ruta a su instalación de nginx y el nombre de usuario a su nombre de usuario):

<?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
fuente
Esta es una respuesta útil, pero técnicamente inicia nginx en el arranque, no inicia sesión. Si @Bryson realmente solo quiere que se ejecute después de iniciar sesión en una determinada cuenta de GUI, entonces esta no es la respuesta correcta. Pero sospecho que realmente quiere hacerlo funcionar tan pronto como la máquina ha arrancado, incluso si la interfaz gráfica de usuario está esperando en la ventana de inicio, en lugar de esperar hasta que realmente inicia la sesión.
Spiff
He añadido a ~/Library/LaunchAgents/y consigo los siguientes errores en la consola: 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. Cambié la Programsecuencia a /usr/local/Cellar/nginx/1.2.7/sbin/nginxsi eso importa.
hobbes3
3
De hecho, me acaba de tomar el original homebrew.mxcl.nginx.plist, cambiado UserNamea root, entonces sudo chown root, y corrió sudo launchctl load -wy funcionó.
hobbes3
¿Puedo verificar que tiene un .plist en ~ / Library / LaunchAgents / (por lo que es solo para un usuario), pero comienza como root? Nunca he visto esa posibilidad mencionada en la documentación, y cuando la probé en Mavericks falló.
Pitarou
@ hobbes3 @ rich-kroll Casi un año después, pero KeepAlive puede ser cierto o establecerse en un dict que contiene NetworkState. Entonces, el ejemplo anterior debería decir <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(tenga en cuenta que reemplacé KeepAlive's truecon el diccionario que contiene NetworkState). Fuente: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange
9

Llegué aquí porque me encontraba con el mismo problema. Mi solución fue similar a la de Rich anterior, excepto que usé el script de inicio Homebrew nginx:

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

Como referencia, así es como se ve esa 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>

Tengo 2 alias agregados a mi $ HOME / .profile para que sea más fácil iniciar y detener 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'

Mi problema fue que, por alguna razón, nginx no se estaba iniciando correctamente inicialmente. Simplemente tuve que ejecutar stop-nginx para descargarlo y luego reiniciarlo nuevamente con start-nginx.

skuld
fuente
44
Alternativa: lunchy restart nginxvisite github.com/mperham/lunchy
Andrei
1

No es una respuesta exacta a su pregunta, pero podría acercarse lo suficiente: puede redirigir el puerto 80 al puerto 8080, utilizando el filtro de paquetes pf(probado en OS X 10.9). Agregue la siguiente línea a su /etc/pf.conf(debe estar por encima de las reglas de filtrado):

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

Una explicación de (la mayoría de) los elementos de esta línea se puede encontrar aquí .

Para obtener más información, consulte /superuser//a/521803 y http://www.openbsd.org/faq/pf/index.html , aunque este último parece describir una versión más nueva de pf, en la que la línea se escribiría de manera diferente.

Entusiasta de la web
fuente
0

Se me ocurren dos explicaciones:

  1. Hay algunas líneas como esta en su .plistarchivo:

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

    Esto le dice a launchd que inicie nginx con los privilegios del usuario especificado, en lugar de root.

    Si desea que nginx se enlace al puerto 80, debe establecer el nombre de usuario en la directiva de usuario de nginx , en lugar de en el .plist. nginx luego eliminará el privilegio para los procesos de trabajo, aunque el proceso maestro seguirá siendo root.

  2. Tiene un nginx .plisten ~/Library/LaunchAgents/(tenga en cuenta el inicio ~) en lugar de /Library/LaunchAgents.

    Tenga en cuenta que es posible activar y desactivar .plists, por lo que es posible que haya dos nginx .plists en su sistema, pero solo uno de ellos está activo.

Pitarou
fuente
0

Me inspiré en el servidor Pow e hice una lista que configura el reenvío de puertos. Reenvía el puerto 80 al puerto 8080 y el puerto 443 al puerto 8443. De esta manera puedo ejecutar nginx con un usuario normal, y todas mis conexiones funcionan de manera transparente.

El plist está aquí: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

stefansundin
fuente