Как запустить nginx на порту 80 при входе в OS X?

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директива игнорировалась)

Брайсон
источник
Убедитесь, что у вашего plist-файла есть владелец root: wheel, когда вы перемещаете его в любую из папок LaunchDaemons. в противном случае launchctl не будет работать из-за «сомнительного владения».
risyasin

Ответы:

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>
Рич Кролл
источник
Это полезный ответ, но технически он запускает nginx при загрузке, а не вход в систему. Если @Bryson действительно хочет, чтобы он запускался только после входа в определенную учетную запись GUI, то это не совсем правильный ответ. Но я подозреваю, что он действительно хочет, чтобы он работал, как только машина загрузится, даже если графический интерфейс ожидает в окне входа в систему, а не ждет, пока он фактически не войдет в систему.
Spiff
Я добавил его , ~/Library/LaunchAgents/и я получаю следующие ошибки в консоли: 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. Я изменил Programстроку, /usr/local/Cellar/nginx/1.2.7/sbin/nginxесли это имеет значение.
hobbes3
3
На самом деле я просто взял оригинал homebrew.mxcl.nginx.plist, изменился UserNameна root, затем sudo chown rootпобежал, sudo launchctl load -wи это сработало.
hobbes3
Могу я просто проверить - у вас есть .plist в ~ / Library / LaunchAgents / (так что это только для одного пользователя), но он запускается как root? Я никогда не видел такой возможности, упомянутой в документации, и когда я попробовал ее на Mavericks, она провалилась.
Питару
@ hobbes3 @ rich-kroll Почти год спустя, но KeepAlive может быть либо истинным, либо иметь значение dict, содержащее NetworkState. Таким образом, приведенный выше пример должен сказать <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(обратите внимание, что я заменил KeepAlive trueна словарь, содержащий NetworkState). Источник: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange
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.

Skuld
источник
4
Альтернатива: lunchy restart nginxсм. Github.com/mperham/lunchy
Андрей
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, в которой данный Линия будет написана по-другому.

Webthusiast
источник
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, но активен только один из них.

Pitarou
источник
0

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

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

stefansundin
источник