Каждый веб-разработчик, выбравший Mac, после первичной настройки системы ищет рабочий инструментарий. И если c IDE и редакторами всё понятно, то что-либо подобное по удобству win-довым OpenServer или Denwer за бесплатно найти трудно. Есть отличное решение MAMP PRO, но оно стоит две тысячи деревянных. Да и работа через Apache некоторых может смутить.
Занимаясь решением этого вопроса, набрёл на интереснейший материал, который рассказывает о том, как при помощи консольного пакет-менеджера Homebrew настроить рабочее пространство буквально за 5-10 минут. Публикую его перевод, потому что кому-нибудь подобная инструкция по настройке веб-окружения на Mac обязательно пригодится.
«Только что получил новый MacBook Pro и решил настроить его с чистого листа, потому что я использую тот же бэкап Time Machine примерно уже четверы года. Хороший шанс избавиться от стэка веб-сервера/LAMP (Linux Apache MySQL PHP) и заменить его 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) в моём примере:
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
Последние тесты
Вот оно, всё должно работать. Щелкайте на ссылках ниже с целью удостовериться в этом:
- http://localhost → «Nginx works» page
- http://localhost/info →
phpinfo()
- http://localhost/nope → " Not Found" page
- https://localhost:443 → «Nginx works» page (SSL)
- https://localhost:443/info →
phpinfo()
(SSL) - https://localhost:443/nope → «Not Found» page (SSL)
- https://localhost:306 → phpMyAdmin (SSL)
Управление сервисами
В силу того, чтоы вам рано или поздно понадобиться перезапустить тот или иной вресив, вам возможно понадобятся дополнительные алиасы:
curl -L https://gist.github.com/frdmn/7853158/raw/bash_aliases -o /tmp/.bash_aliases
cat /tmp/.bash_aliases >> ~/.bash_aliases
echo "source ~/.bash_aliases" >> ~/.bash_profile
Вы можете или открыть новое окно/сессию Терминала или же вручную перезагрузить ~/.bash_profile
при помощи команды:
source ~/.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
.
Рекомендую отключить работу Apache во избежание конфликта с Nginx из-за работы на 80-ом порте:
Автор: CuamckuyKot