Як запустити 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щоб це зробити. Я хочу, щоб він завантажився з файлу плістів, як Redis і PostgreSQL.

Я перемістив пліст на /Library/LaunchAgents/еквівалентну папку користувача і змінив його право власності, також спробував встановити userдирективу у nginx.confфайлі та все одно те саме повідомлення про помилку в Console.app:

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

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


Переконайтеся, що ваш файл плісту має "root: wheel" право власності, коли ви переміщуєте його в будь-яку з папок LaunchDaemons. в іншому випадку startctl не запустить це через "сумнівну власність".
risyasin

Відповіді:


12

Мені здалося, що більш простим підходом було створення файлу додавання plist у / Бібліотека / LaunchDaemons /

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

Або, якщо ви хочете, щоб він запустився при вході в систему, ви можете помістити його в ~ / Бібліотека / LaunchAgents /, той самий файл списку. Це дозволить отримати доступ до запущеної команди startctl з вашого імені користувача без необхідності викликати 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 у ~ / Бібліотеці / LaunchAgents / (тож він призначений лише для одного користувача), але він починається як root? Я ніколи не бачив такої можливості, згаданої в документації, і коли я спробував її на Mavericks, вона не вдалася.
Пітару

@ hobbes3 @ rich-kroll Майже через рік, але KeepAlive може бути істинним, або встановити дік, що містить NetworkState. Отже, приклад вище повинен сказати <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(зауважте, що я замінив KeepAlive's trueсловником, що містить NetworkState). Джерело: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange

9

Я потрапив сюди, бо зіткнувся з тією ж проблемою. Моє рішення було подібним до вищезгаданого Річа, за винятком того, що я використовував сценарій запуску nbrex Homebrew:

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>

У моєму $ HOME / .profile додано 2 псевдоніми для полегшення запуску та зупинки 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.


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, у якій наведено рядок був би написаний інакше.


0

Я можу придумати два пояснення:

  1. У вашому .plistфайлі є такі рядки :

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

    Це сповіщає запускати запуск nginx з привілеями вказаного користувача, а не root.

    Якщо ви хочете, щоб nginx прив'язувався до порту 80, вам слід встановити ім'я користувача в директиві користувача nginx , а не в .plist. Потім nginx знизить привілей для робочих процесів, хоча головний процес все ще буде root.

  2. Ви маєте nginx .plistу ~/Library/LaunchAgents/(зверніть увагу на провідну ~), а не /Library/LaunchAgents.

    Зауважте, що можливо активувати та дезактивувати .plists, тому можливо, у вашій системі є два nginx .plist, але лише один із них активний.


0

Я взяв натхнення від сервера Pow і склав список, який налаштовує переадресацію портів. Він пересилає порт 80 на порт 8080 і порт 443 на порт 8443. Таким чином я можу запустити nginx під звичайним користувачем, і всі мої з'єднання прозоро працюють.

Пліст тут: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.