Каждый веб-разработчик, выбравший Mac, после первичной настройки системы ищет рабочий инструментарий. И если c IDE и редакторами всё понятно, то что-либо подобное по удобству win-довым OpenServer или Denwer за бесплатно найти трудно. Есть отличное решение MAMP PRO, но оно стоит две тысячи деревянных. Да и работа через Apache некоторых может смутить.

Занимаясь решением этого вопроса, набрёл на интереснейший материал, который рассказывает о том, как при помощи консольного пакет-менеджера Homebrew настроить рабочее пространство буквально за 5-10 минут. Публикую его перевод, потому что кому-нибудь подобная инструкция по настройке веб-окружения на Mac обязательно пригодится.

mac-nginx-mysql-php

«Только что получил новый MacBook Pro и решил настроить его с чистого листа, потому что я использую тот же бэкап Time Machine примерно уже четверы года. Хороший шанс избавиться от стэка веб-сервера/LAMP (Linux Apache MySQLPHP) и заменить его Nginx и PHP-FPM как реализацию FastCGI. Ниже вы можете прочесть, как настроить Nginx, PHP-FPM, MySQL и PhpMyAdmin на OS X 10.9 / Mavericks.

Xcode

Прежде всего, установите последнюю версию Xcode через Mac App Store:

Скачать Xcode.app (через Mac App Store)

Как только закончится загрузка, откройте Xcode в папке /Applications и согласитесь с лицензией.

Откройте окно Терминала и установите Xcode через следующую команду:

xcode-select --install

Подтвердите установку при помощи кнопки Install.

Вернитесь обратно в Xcode, нажмите ⌘ + , для доступа к настройкам и перейдите на вкладку Locations. УстановитеCommand Line Tools на последнюю доступную версию, Xcode 5.0.2 (5A3005) в моём примере:

Xcode.app → Preferences → Location | Command Line Tools

Homebrew

Теперь необходимо установить Homebrew, который является менеджером пакетов для OS X. Вы возможно уже слышали про apt-get или aptitude на дистрибутивах Linux для установки пакетов и зависимостей для конкретный приложений. brew работает также, только на компьютерах под управлением Mac OS X. Он также удостоверится, что вы получите последние обновления для установленных приложений, так что вам не нужно будет беспокоиться из-за просроченных версиях или брешах в системе безопасности, эксплойтах и так далее.

Прежде всего, нам понадобиться Xquarz:

curl http://xquartz-dl.macosforge.org/SL/XQuartz-2.7.5.dmg -o /tmp/XQuartz.dmg
open /tmp/XQuartz.dmg

Теперь нам необходимо загрузить и установить Homebrew при помощи следующей команды:

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

Поверим на любые конфликты и проблемы:

brew doctor

Обновим репозитории и приложения при помощи Homebrew:

brew update
brew upgrade

PHP-FPM

Потому как Homebrew не имеет репозитория по-умолчанию для PHP-FPM, нам необходимо его добавить:

brew tap homebrew/dupes
brew tap josegonzalez/homebrew-php

Установим PHP-FPM при помощи следующих аргументов:

brew install --without-apache --with-fpm --with-mysql php55

Homebrew загрузит исходный код PHP-FPM и скомпилирует его аз вас. Дайте ему немного времени, это может занять несколько минут.

Настройка PHP в командной строке

Если вы хотите использовать PHP в командной строке, вам необходимо обновить переменную окружения $PATH в файле ~/.bash_profile:

echo 'export PATH="$(brew --prefix josegonzalez/php/php55)/bin:$PATH"' >> ~/.bash_profile

Настройка автозапуска

mkdir -p ~/Library/LaunchAgents
cp /usr/local/Cellar/php55/5.5.9/homebrew-php.josegonzalez.php55.plist ~/Library/LaunchAgents/

И старт PHP-FPM:

launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php55.plist 

Удостоверьтесь, что PHP-FPM слушает порт 9000:

lsof -Pni4 | grep LISTEN | grep php

Вывод должен выглядеть примерно следующим образом:

php-fpm   69659  frdmn    6u  IPv4 0x8d8ebe505a1ae01      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm   69660  frdmn    0u  IPv4 0x8d8ebe505a1ae01      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm   69661  frdmn    0u  IPv4 0x8d8ebe505a1ae01      0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm   69662  frdmn    0u  IPv4 0x8d8ebe505a1ae01      0t0  TCP 127.0.0.1:9000 (LISTEN)    

MySQL

Следующий шаг для установки MySQL:

brew install mysql

Настройка автозапуска

cp /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents

И запустите сервер баз данных:

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

Обезопасьте установку

Для безопасности нашего MySQL-сервера мы вызовем идущий в компоекте бинарник secure_mysql_installation для смены root-пароля, удаления анонимного пользователя и отключения возможности дистанционного логина под root-ом:

mysql_secure_installation
> Enter current password for root (enter for none):

Пожалуйста, укажите текущий пароль, если он уже установлен.

> Change the root password? [Y/n]

Нажите enter, указав пароль для root-пользователя. По желанию сохраните его в менеджерах паролей LastPass или 1Password.

> Remove anonymous users? [Y/n]

Да, в них нет необходимости.

> Disallow root login remotely? [Y/n]

Да, нет необходимости в авторизации под root с любого другого IP кроме 127.0.0.1.

> Remove test database and access to it? [Y/n]

Да. Нам не нужны тестовые таблицы.

> Reload privilege tables now? [Y/n]

Перезагрузка таблицы привилегий даст нам возможность удостовериться, что изменения вступили в силу.

Проверка соединения

mysql -uroot -p

Введите указанный ранее root-пароль и увидите консоль MySQL:

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql>

Закончите сессию при помщи команды q:

mysql> q
Bye

phpMyAdmin

Установите autoconf который необходим для phpMyAdmin:

brew install autoconf

Установите переменную окружения $PHP_AUTOCONF:

echo 'PHP_AUTOCONF="'$(which autoconf)'"' >> ~/.bash_profile

Приступим к установке phpMyAdmin:

brew install phpmyadmin

Nginx

Установите Nginx при помощи команды:

brew install nginx

Настройка автозапуска

Так как мы используем 80 порт, необходимо запускать Nginx под пользователем root:

sudo cp /usr/local/opt/nginx/*.plist /Library/LaunchDaemons/
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

Протестриуйте веб-сервер

Запустите Nginx:

sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

Конфигурация по-умолчанию слушает порт 8080 вместо стандартного для протокола HTTP порта 80. Пока проигнорируем это:

curl -IL http://localhost:8080

Ответ должен выглядеть следующим образом:

HTTP/1.1 403 Forbidden
Server: nginx/1.4.4
Date: Sun, 08 Dec 2013 03:33:41 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

Снова остановим Nginx:

sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

Дальнейшая настройка

nginx.conf

Создайте папки, которые понадобятся нам при последующей конфигурации Nginx:

mkdir -p /usr/local/etc/nginx/logs
mkdir -p /usr/local/etc/nginx/sites-available
mkdir -p /usr/local/etc/nginx/sites-enabled
mkdir -p /usr/local/etc/nginx/conf.d
mkdir -p /usr/local/etc/nginx/ssl
sudo mkdir -p /var/www

sudo chown :staff /var/www
sudo chmod 775 /var/www

Удалите текущий файл nginx.conf (который всегда будет доступен по адресу /usr/local/etc/nginx/nginx.conf.default, если вы захотите взглянуть на его код) и загрузите созданные мною настройки при помощи curl с GitHub:

rm /usr/local/etc/nginx/nginx.conf
curl -L https://gist.github.com/frdmn/7853158/raw/nginx.conf -o /usr/local/etc/nginx/nginx.conf

Конфиуграционный файл прост и легковесен насколько это возможно: настройки worker, пути/форматы логов и несколько includes. Ничего лишнего в отличие от nginx.conf.default.

Загрузка PHP FPM

Скачайте мои настройки PHP-FPM с GitHub:

curl -L https://gist.github.com/frdmn/7853158/raw/php-fpm -o /usr/local/etc/nginx/conf.d/php-fpm

Создание виртуальных хостов

curl -L https://gist.github.com/frdmn/7853158/raw/sites-available_default -o /usr/local/etc/nginx/sites-available/default
curl -L https://gist.github.com/frdmn/7853158/raw/sites-available_default-ssl -o /usr/local/etc/nginx/sites-available/default-ssl
curl -L https://gist.github.com/frdmn/7853158/raw/sites-available_phpmyadmin -o /usr/local/etc/nginx/sites-available/phpmyadmin

Клонируйте тестовый виртуальный хост (включая рерайты для 404, 403 и phpinfo()) используя git:

git clone http://git.frd.mn/frdmn/nginx-virtual-host.git /var/www
rm -rf /var/www/.git

И удалите папку /var/www/.git, чтобы git не отслеживал последующие изменнения.

Настройка SSL

Создайте папку для наших сертификатов SSL и частных ключей:

mkdir -p /usr/local/etc/nginx/ssl

Сгенерируйте 4096bit RSA ключи и само-подписные сертификаты следюущей командой:

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=State/L=Town/O=Office/CN=phpmyadmin" -keyout /usr/local/etc/nginx/ssl/localhost.key -out /usr/local/etc/nginx/ssl/localhost.crt
openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=State/L=Town/O=Office/CN=localhost" -keyout /usr/local/etc/nginx/ssl/phpmyadmin.key -out /usr/local/etc/nginx/ssl/phpmyadmin.crt

Включение виртуальных хостов

Теперь нам нужно создать симлинки в папке sites-enabled для виртуальных хостов с целью включить их:

ln -sfv /usr/local/etc/nginx/sites-available/default /usr/local/etc/nginx/sites-enabled/default
ln -sfv /usr/local/etc/nginx/sites-available/default-ssl /usr/local/etc/nginx/sites-enabled/default-ssl
ln -sfv /usr/local/etc/nginx/sites-available/phpmyadmin /usr/local/etc/nginx/sites-enabled/phpmyadmin

Снова стартуем Nginx:

sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

Последние тесты

Вот оно, всё должно работать. Щелкайте на ссылках ниже с целью удостовериться в этом:

Управление сервисами

В силу того, чтоы вам рано или поздно понадобиться перезапустить тот или иной вресив, вам возможно понадобятся дополнительные алиасы:

curl -L https://gist.github.com/frdmn/7853158/raw/bash_aliases -o /tmp/.bash_aliases
cat /tmp/.bash_aliases >> ~/.bash_aliases
echo "code ~/.bash_aliases" >> ~/.bash_profile

Вы можете или открыть новое окно/сессию Терминала или же вручную перезагрузить ~/.bash_profile при помощи команды:

code ~/.bash_profile

Теперь вы можете использовать алиасы вместо печатания длинных команд launchctl, как то было выше.

Nginx

Вы можете стартовать, остановить и перезапустить Nginx при помощи команд:

nginx.start
nginx.stop
nginx.restart

Быстрый доступ к логам:

nginx.logs.access
nginx.logs.default.access
nginx.logs.phpmyadmin.access
nginx.logs.default-ssl.access
nginx.logs.error
nginx.logs.phpmyadmin.error

Проверка конфига:

[sudo] nginx -t

PHP-FPM

Старт, стоп и перезагрузка PHP-FPM:

php-fpm.start
php-fpm.stop
php-fpm.restart

Проверка конфига:

[sudo] php-fpm -t

MySQL

Старт, стоп и рестарт MySQL-сервера:

mysql.start
mysql.stop
mysql.restart

Дайте мне знать, если застряли или у вас есть какие-либо дополнения!»


От себя добавлю, что также при создании локальных доменов и настройке Nginx для работы с ними не забывайте прописывать пару «IP domain.name» в файле hosts при помощи команды sudo vi /etc/hosts.