24

Я установил Nginx с помощью homebrew и после завершения установки появилось следующее сообщение:

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

Но я хочу , чтобы Nginx на порту 80 работал при входе в систему, и я не хочу открывать терминал и вводить sudo nginx чтобы сделать это. Я хочу, чтобы он загружался из файла plist, как это делают Redis и PostgreSQL.

Я переместил plist в /Library/LaunchAgents/ из эквивалентной папки пользователя и изменил его владельца, также попытался установить user директиву в файле nginx.conf и все то же сообщение об ошибке в Console.app:

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

(наряду с другим сообщением о том, что nginx запускался без привилегий суперпользователя, директива user игнорировалась)

5 ответов5

12

Я нашел более простой подход - создать файл добавления plist в /Library /LaunchDaemons /

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

Или, если вы хотите, чтобы он запускался при входе в систему, вы можете поместить его в ~/Library/LaunchAgents/, тот же файл plist. Это позволит вам получить доступ к команде launchd launchctl от вашего имени пользователя без необходимости вызова sudo.

и вставьте следующее (не забудьте обновить путь к вашей установке nginx и имя пользователя к вашему имени пользователя):

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

Я попал сюда, потому что столкнулся с той же проблемой. Мое решение было похоже на приведенное выше, за исключением того, что я использовал стартовый скрипт Homebrew nginx:

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

Для справки вот как выглядит этот 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>

У меня есть 2 псевдонима, добавленные в мой $ HOME/.profile, чтобы упростить запуск и остановку 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'

Моя проблема была в том, что по какой-то причине nginx изначально не запускался должным образом. Мне просто нужно было запустить stop-nginx, чтобы выгрузить его, а затем снова запустить его с помощью start-nginx.

1

Не точный ответ на ваш вопрос, но может подойти достаточно близко: вы можете перенаправить порт 80 на порт 8080, используя фильтр пакетов pf (протестировано на OS X 10.9). Добавьте следующую строку в ваш /etc/pf.conf (она должна быть выше правил фильтрации):

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

Объяснение (большинства) элементов этой строки можно найти здесь.

Для получения дополнительной информации см. Https://superuser.com/a/521803 и http://www.openbsd.org/faq/pf/index.html, хотя последняя, по-видимому, описывает более новую версию pf , в которой данная строка будет написана по-другому.

0

Я черпал вдохновение из сервера Pow и составил список, который настраивает переадресацию портов. Он перенаправляет порт 80 на порт 8080, а порт 443 на порт 8443. Таким образом, я могу запустить nginx под обычным пользователем, и все мои соединения прозрачно работают.

Плейст здесь: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

0

Я могу придумать два объяснения:

  1. В вашем файле .plist строки:

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

    Это говорит launchd запустить nginx с правами указанного пользователя, а не root.

    Если вы хотите, чтобы nginx связывался с портом 80, вы должны установить имя пользователя в директиве пользователя nginx, а не в .plist. Затем nginx откажется от привилегии для рабочих процессов, хотя главный процесс все еще будет корневым.

  2. У вас есть nginx .plist в ~/Library/LaunchAgents/ (обратите внимание на начальный ~), а не в /Library/LaunchAgents .

    Обратите внимание, что возможно активировать и деактивировать .plists, поэтому возможно, что в вашей системе есть два .plists nginx, но активен только один из них.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .