Перейти к содержимому

31.05.2013

Web-разработка с использованием nginx, php-fpm, node.js на Mac OS X.

nginxКак известно, в комплекте с Mac OS X идет веб-сервер apache и php. Но как быть, если мы хотим использовать node.js, да не просто как отдельный сервер, висящий на отдельном порту, а иметь возможность проксировать http-запросы как к нему, так и к php. Небольшая инструкция по замене штатного httpd/php-module на связку nginx+php-fpm+node.js ниже.

Начнем по порядку.

1. Отключение загрузки httpd при старте системы.

В Mac OS httpd, как впрочем и многие другие демоны и сервисы, грузится как LaunchDaemon. Все управление осуществляется через launchctl.

2. Установка Nginx.

Есть несколько способов установить Nginx:

  • Установка из исходников
  • Установка через macports
  • Установка через homebrew

Лично я как-то перешел с macports на homebrew, поэтому выбрал третий вариант. Тем более, что в brew доступна версия 1.4.1 и даже 1.5.0, а в macports только 1.4.1. Но, правда для меня это не принципиально, главное что там уже есть поддержка проксирования веб-сокетов.

Установка из homebrew крайне проста.

Не знаю, как в macports, а в homebrew что прекрасно, это то, что в комплекте с самим nginx’ом идет уже готовый plist для launchd, поэтому можно сразу прописать автостарт демона при загрузке ОС. Сделать это можно командами, указанными brew:

Однако, если вы хотите повесить nginx на 80 порт, это потребует запуска демона из-под рута. Для этого необходимо немного подправить этот plist и положить его в папку системных LaunchDaemons. Поскольку мы будем запускать его как демона, а поставляемый plist предназначен для запуска nginx из-под пользователя и под управлением launchd, надо удалить в plist строчки про отключение демонизации. Вот подправленный файлик и команды для запуска как LaunchDaemon:

Если использовать macports, nginx ставится так же одной командой: sudo port install nginx.

Опустим процесс настройки nginx. Он такой же как везде. Тонкости настройки проксирования будут показаны позже.

3. Установка node.js

Это, пожалуй, самый простой пункт, потому что готовый установочный пакет можно скачать прямо на сайте ноды: nodejs.org/download. Качаем, ставим.

4. Php-fpm у нас уже есть, так что ничего ставить дополнительно не надо.

5. Проксирование запросов к php-fpm в nginx.

Здесь все как всегда: в настройках виртуального хоста прописываем обращение к fastcgi.

Можно, кстати, сразу повесить nginx на стандартный, 80 порт, потому как апачи уже остановлен.

6. Теперь сделаем, чтобы php-fpm запускался при старте системы.

Для этого надо написать plist-файлик для launchd. А так как запускать php-fpm нужно от рута (это если оставить в конфиге переключение на nobody или же на www), то этот plist нужно так же положить в папку системных демонов.

Вот мой вариант plist для запуска php-fpm

Ну и положим этот файлик куда надо и загрузим.

Теперь у нас при загрузке Mac OS автоматом стартуют nginx и php-fpm.

7. Проксирование веб-сокет запросов.

Осталось настроить проксирование веб-сокет запросов к node.js (для тех, кому это нужно) и настроить автостарт node.js, опять же, если это необходимо.

Для проксирования веб-сокетов надо прописать в конфиге виртуального хоста, ну или же всего веб-сервера, если он у вас один, следующее:

Теперь все запросы по адресу http://your-server/socket/* будут проксироваться на адрес http://127.0.0.1:5000/, на котором мы запустим ноду.

8. Для автостарта ноды надо так же написать plist и положить его в LaunchAgents.

Вот мой вариант plist для автозапуска node.js

Ну и положим этот файлик куда надо и загрузим. Поскольку ноду нет необходимости запускать от рута, то положим ее в пользовательские LaunchAgents

Если кому надо, можно скачать мои готовые plist’ы:
ksdaemon.ru.nginx.plist
ksdaemon.ru.php-fpm.plist
ksdaemon.ru.node-js.plist

Ну вот собственно и все. Теперь сам не забуду, а может и еще кому-то пригодится 🙂