В штаб-квартире Apple есть целый отдел, работа которого заключается в том, чтобы в очередной версии OS X, какой-нибудь функционал работал чуть-чуть, но ощутимо по-другому.
(В свободное от работы время - они устраивают викторину "а куда же нам засунуть в этот раз изменение пароля супер-пользователя?".)
Этот текст в основном для себя пишется, так как дедушка старенький, лениво каждый раз искать, что там завсегдатаи бара Голубая Устрица поменяли на этот раз.
Возможно, хипстеркам сейчас модно использовать Vagrant, но по мне - так он больше проблем создает, чем решает. И это я крайне деликатно выразился.
Сегодня мы будем ставить свой Apache 2.4, PHP7.0 и MySQL. Преимущественно из сырцов.
В общем.
Подразумевается, что вы не вейпер и не веган, а нормальный человек, и Homebrew у вас стоит.
Если это не так, то:
$ /usr/bin/ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew update
$ brew doctor
Сначала убираем из загрузки дефолтный апач. Его, конечно, можно оставить, но возникнет путаница. А она ну нафиг не нужна.
$ sudo apachectl stop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
Ставим Apache 2.4
$ brew install httpd24 --with-privileged-ports --with-http2
После этого делаем:
$ which apachectl
и убеждаемся, что apachectl берется от старого апача из /usr/sbin .
Некоторое время все будет работать и так, но через пару лет, когда выйдет какой-нибудь апач 2.6 - это аукнется. Поэтому подстелим заранее соломки и сделаем симлинк.
$ ln -s /usr/local/opt/httpd24/bin/apachectl /usr/local/sbin
И не забываем в начало своего $PATH добавить /usr/local/sbin , если это не было сделано в первый же день, после покупки мака.
Выглядеть строчка в rc файле (уж не знаю какой у вас шелл, я использую zsh) должна как-то так:
export PATH=/usr/local/sbin:$PATH
Проверяем:
$ source ~/.zshrc # в моем случае
$ which apachectl
/usr/local/sbin/apachectl
Радуемся, и идем ставить 7-й пых. На момент написания этого поста, я ставлю 7.0. С 7.1, в моем случае, есть некоторые неприятные проблемы с обратной совместимостью.
$ brew install php70 --with-apache
Выпив пару чашек кофе, и возрадовавшись, что пых скомпилился без ошибок, идем в /usr/local/etc/apache2/2.4 . Тут хранятся конфиги нашего (а не системного) апача.
В httpd.conf все стандартно меняем.
# Кулхэккир Вася нам нахуй не нужен на внешних интерфейсах
Listen 127.0.0.1:80
# Можно оставить и Cellar, но тогда при обновлении пыха - придется каждый раз менять путь руками. Тем более симлинк там уже создан)
LoadModule php7_module /usr/local/Cellar/php70/7.0.12_5/libexec/apache2/libphp7.so меняем на
LoadModule php7_module /usr/local/opt/php70/libexec/apache2/libphp7.so
# Если нет желания потом дебажить скрипты, "ой, а почему у меня permission denied" ?!
User <юзер>
Group staff
# Чтобы индексы отдавались и пыховские тоже.
DirectoryIndex index.html index.php
# И чтобы пыховские файлы вообще вообще парсились.
SetHandler application/x-httpd-php
# И список виртуальных хостов подхватим
Include /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf
Ну и идем создавать вирутуальные хосты, хотя-бы один.
Лично у меня, для нужд разработки, все сайты лежат в ~/sites .
$ mkdir -p ~/sites
$ vim /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf
ServerAdmin admin@localhost
DocumentRoot "/Users/<юзер>/sites/<хост>"
ServerName <хост>.dev
ServerAlias www.<хост>.dev
ErrorLog "/usr/local/var/log/apache2/<хост>-error_log"
CustomLog "/usr/local/var/log/apache2/<хост>.dev-access_log" common
/sites/<хост>>
AllowOverride none
Require all granted
В этот момент, чтобы не забыть, лезем (не забыв sudo) в /etc/hosts и прописываем там fqdn виртуалок.
$ sudo vim /etc/hosts
127.0.0.1 localhost site1.dev www.site1.dev
И чтобы все это потестить, создаем в корне какого нибудь хоста файл index.php с вызовом функции phpinfo();
$ vim ~/sites/site1.dev/index.php
Переходим браузером на тот хост, и если все окей - видим конфигурацию php. Если не окей - то плачем и читаем логи.
Дальше идем ставить mysql.
$ brew install mysql
$ mysql.server start
$ mysql_secure_installation
И когда эта скотина спросит насчет VALIDATE PASSWORD PLUGIN - шлем ее нахуй категоричным "No". Оно вам не надо, поверьте.
$ mysqladmin create <название_базы> -uroot -p
Вроде почти все.
Так как мне нафиг не нужно, чтобы весь этот зоопарк загружался по дефолту при загрузке системы, я пишу скриптик.
$ vim ~/dev.sh
#! /bin/sh
if [ $# -eq 0 ]; then
echo "Usage: start|stop"
exit 1
fi
for i in "$@"
do
case $i in
"start")
mysql.server start
echo "Starting apache"
sudo apachectl start
;;
"stop")
mysql.server stop
echo "Stopping apache"
sudo apachectl stop
;;
*)
echo "Unknown argument"
;;
esac
done
exit 0
Можно его повесить хоть на хоткеи альфреда, хоть из терминала запускать.
Вот и сказке конец, а кто слушал - теперь обладает достаточной квалификацией, чтобы устроиться на пол-ставки стажером заместителя третьего младшего помощника воспомогательного системного администратора воскресного отделения клуба веселых юниксойдов.
UPD: Криворукие животные из стаффа ЖЖ должны страдать. Я раз 15 пытался отформатировать этот пост красиво, но все тщено.