Como inicio o nginx na porta 80 no login do OS X?


24

Instalei o Nginx usando homebrew e, após concluir a instalação, a seguinte mensagem foi exibida:

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

Mas eu quero o Nginx, na porta 80, rodando no login e não quero abrir o terminal e digitar sudo nginxpara fazê-lo. Eu quero que ele carregue de um arquivo plist como Redis e PostgreSQL do.

Mudei o plist para /Library/LaunchAgents/a pasta equivalente do usuário e alterei sua propriedade, também tentei definir a userdiretiva no nginx.confarquivo e ainda a mesma mensagem de erro no Console.app:

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

(junto com outra mensagem informando que, como nginxestava sendo executada sem privilégios de superusuário, a userdiretiva estava sendo ignorada)


Verifique se o seu arquivo plist possui propriedade "root: wheel" ao movê-lo em qualquer uma das pastas LaunchDaemons. caso contrário, o launchctl não o executará por causa de "propriedade duvidosa".
risyasin

Respostas:


12

Encontrei uma abordagem mais fácil: criar um arquivo add plist em / Library / LaunchDaemons /

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

Ou, se você deseja iniciar no login, você pode colocá-lo em ~ / Library / LaunchAgents /, o mesmo arquivo plist. Isso permitirá que você acesse o comando launchd launchctl do seu nome de usuário sem a necessidade de chamar sudo.

e insira o seguinte (certifique-se de atualizar o caminho para sua instalação do nginx e o nome de usuário para seu nome de usuário):

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

Esta é uma resposta útil, mas tecnicamente inicia o nginx na inicialização, não no login. Se o @Bryson realmente só quer que ele seja executado depois que ele faz login em uma determinada conta GUI, essa não é a resposta certa. Mas eu suspeito que ele realmente quer correr, logo que a máquina já foi iniciado, mesmo se o GUI está esperando na janela de login, ao invés de esperar até que ele realmente faz login.
Spiff

Eu adicionei-a ~/Library/LaunchAgents/e eu recebo os seguintes erros no 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. Mudei a Programstring para /usr/local/Cellar/nginx/1.2.7/sbin/nginxse isso importa.
hobbes3

3
Na verdade, peguei o original homebrew.mxcl.nginx.plist, mudei UserNamepara root, então sudo chown root, corri sudo launchctl load -we funcionou.
hobbes3

Posso apenas verificar - você possui um .plist em ~ / Library / LaunchAgents / (portanto, é apenas para um usuário), mas ele inicia como root? Nunca vi essa possibilidade mencionada na documentação e, quando tentei no Mavericks, ela falhou.
Pitarou

@ hobbes3 @ rich-kroll Quase um ano depois, o KeepAlive pode ser verdadeiro ou definido como um ditado que contém o NetworkState. Portanto, o exemplo acima deve dizer <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(observe que substituí o KeepAlive truepelo dicionário que contém NetworkState). Fonte: developer.apple.com/library/mac/documentation/Darwin/Reference/...
getWeberForStackExchange

9

Cheguei aqui porque estava com o mesmo problema. Minha solução foi semelhante à de Rich acima, exceto pelo uso do script de inicialização do Homebrew nginx:

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

Para referência, eis a aparência desse 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>

Eu tenho 2 aliases adicionados ao meu $ HOME / .profile para facilitar o início e a parada do 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'

Meu problema era que, por algum motivo, o nginx não estava inicializando corretamente inicialmente. Eu apenas tive que executar o stop-nginx para descarregá-lo e, em seguida, reiniciá-lo novamente com start-nginx.


4
Alternativa :,lunchy restart nginx consulte github.com/mperham/lunchy
Andrei

1

Não é uma resposta exata para sua pergunta, mas pode chegar perto o suficiente: você pode redirecionar a porta 80 para a porta 8080, usando o filtro de pacotes pf(testado no OS X 10.9). Adicione a seguinte linha ao seu /etc/pf.conf(ele deve estar acima das regras de filtragem):

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

Uma explicação para a maioria dos elementos desta linha pode ser encontrada aqui .

Para obter mais informações, consulte /superuser//a/521803 e http://www.openbsd.org/faq/pf/index.html , embora o último pareça descrever uma versão mais recente pf, na qual o dado linha seria escrita de forma diferente.


0

Eu posso pensar em duas explicações:

  1. Existem algumas linhas como esta em seu .plistarquivo:

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

    Isso diz ao launchd para iniciar o nginx com os privilégios do usuário especificado, em vez de raiz.

    Se você deseja que o nginx se ligue à porta 80, defina o nome de usuário na diretiva de usuário do nginx , em vez de no .plist. O nginx eliminará o privilégio dos processos de trabalho, embora o processo mestre ainda seja raiz.

  2. Você tem um nginx .plistem ~/Library/LaunchAgents/(observe o início ~) em vez de /Library/LaunchAgents.

    Observe que é possível ativar e desativar .plists, portanto, é possível que existam dois nginx .plists em seu sistema, mas apenas um deles esteja ativo.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.