Для простоты следующим шагом в качестве web-сервера я запущу apache. Его большое преимущество в том, что php очень просто ставится, как модуль, и не требуется дополнительных ухищрений. Поэтому я запущу сайт именно под apache, а уже после этого переделаю всё под nginx, который мне нравится больше.

В Mac OS X есть штатный apache, его можно запустить в System Preferences/Sharing/Web Sharing:

Это полноценный Apache/2.2.13, но для наших целей он не подходит - PHP в портах требует установленного apache, причём из портов. Ухищряться можно было бы, но особого желания у меня делать это не было. Поэтому я спокойно смиряюсь с мыслью, что в системе будет стоять Apache родной и Apache из портов.

Установка Apache2 проста:

$ sudo port install apache2

Запуск (пока его запускать не нужно):

$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist

Остановка:

$ sudo launchctl unload -w /Library/LaunchDaemons/org.macports.apache2.plist

Я привык управлять apache через apachectl, и не собираюсь изменять своим привычкам. Но apachectl от штатного Apache находится в /usr/sbin/apachectl:

$ which apachectl
/usr/sbin/apachectl

Apachectl же свежеустановленного порта лежит в /opt/local/apache22/bin/apachectl, для простоты делаем симлинк в каталог, находящийся первее в путях, чем /usr/sbin:

$ sudo ln -s /opt/local/apache22/bin/apachectl /opt/local/bin/

Теперь очередь за PHP, ставим полный набор, который нужен для Wordpress (некоторые модули не нужны, но я их использую все). В процессе установки читаем сообщения:

$ sudo port install php5-web
To customize php, copy
/opt/local/etc/php5/php.ini-development (if this is a development server) or
/opt/local/etc/php5/php.ini-production (if this is a production server) to
/opt/local/etc/php5/php.ini and then make changes.
$ sudo port install php5-mysql
To use mysqlnd with a local MySQL server, edit /opt/local/etc/php5/php.ini and set
mysql.default_socket, mysqli.default_socket and pdo_mysql.default_socket
to /opt/local/var/run/mysql5/mysqld.sock

Дальше полезных сообщений не будет:

$ sudo port install php5-mbstring
$ sudo port install php5-mcrypt
$ sudo port install php5-zip
$ sudo port install php5-gd
$ sudo port install php5-eaccelerator
$ sudo port install php5-openssl
$ sudo port install php5-sockets
$ sudo port install libssh2

Для eaccelerator создаю нужный каталог:

$ sudo mkdir /tmp/eaccelerator/
$ sudo chown www:www /tmp/eaccelerator/

Беру php.ini-production и делаю в нём базовые правки (тюнинг PHP-тема отдельная)

$ sudo cp /opt/local/etc/php5/php.ini-production \
	/opt/local/etc/php5/php.ini
$ sudo vim /opt/local/etc/php5/php.ini
date.timezone = Europe/Kiev
error_log = /var/log/php_errors.log
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock

Не забываю создать файл для логов, иначе они могут не писаться

$ sudo touch /var/log/php_errors.log
$ sudo chown www:www /var/log/php_errors.log

Для интересующихся модули PHP поставились в каталог:

$ ls -al /opt/local/lib/php/extensions/no-debug-non-zts-20090626/
-rwxr-xr-x   2 root  admin    71880 Jan  9 22:29 eaccelerator.so
-rwxr-xr-x   2 root  admin   338560 Jan  9 22:32 gd.so
-rwxr-xr-x   2 root  admin  2031040 Jan  9 22:27 mbstring.so
-rwxr-xr-x   2 root  admin    38384 Jan  9 22:29 mcrypt.so
-rwxr-xr-x   2 root  admin    46648 Jan  9 22:26 mysql.so
-rwxr-xr-x   2 root  admin   111672 Jan  9 22:26 mysqli.so
-rwxr-xr-x   2 root  admin   117480 Jan 10 21:41 openssl.so
-rwxr-xr-x   2 root  admin    30496 Jan  9 22:26 pdo_mysql.so
-rwxr-xr-x   2 root  admin    45016 Jan 10 21:47 sockets.so
-rwxr-xr-x   2 root  admin    81680 Jan  9 22:29 zip.so

Теперь приступаем к конфигурированию Apache. Я отключаю ненужные мне модули, убираю все комментарии и вычищаю мусор. Рассказывать об этом не буду подробно, могу сказать, что и в "дефолтовом" состоянии Apache работает хорошо, главное сделать несколько коррекций, которые я приведу ниже:

$ sudo vim /opt/local/apache2/conf/httpd.conf

В конце секции загрузки модулей добавляем:

LoadModule php5_module modules/libphp5.so

Меняем строку

DirectoryIndex index.html

на

DirectoryIndex index.html index.php

Раскомментариваем включаемые файлы

Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-default.conf

Добавляем конфиг для php (файл установился, я удивился, почему сам модуль не активировался в LoadModule):

Include conf/extra/mod_php.conf

httpd-mpm.conf можем не править, там всё в порядке.

В httpd-default.conf нужно подправить параметры, которые я выделил жирным. Если на сервер будет большое количество коннектов, и, например, база данных будет не справляться, то стоит выключить KeepAlive и размышлять о кешировании.

$ sudo vim /opt/local/apache2/conf/extra/httpd-default.conf
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
UseCanonicalName Off
AccessFileName .htaccess
ServerTokens Prod
ServerSignature Off
HostnameLookups Off

В httpd-vhosts.conf описываются виртуальные хосты. Я это делаю так:

$ sudo vim /opt/local/apache2/conf/extra/httpd-vhosts.conf
NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@theapplegeek.ru
    ServerName theapplegeek.ru
    ErrorLog "logs/theapplegeek.ru-error_log"
    CustomLog "logs/theapplegeek.ru-access_log" common
    DocumentRoot "/Users/ctrld/Sites/theapplegeek/public_html"
    <Directory "/Users/ctrld/Sites/theapplegeek/public_html">
        Options FollowSymLinks -Indexes
        AllowOverride All
        Order allow,deny
        Allow from all
     </Directory>

    <Location "/wp-content/uploads">
        php_admin_flag engine off
        AddType text/plain .html .htm .shtml
    </Location>
</VirtualHost>

<VirtualHost *:80>
    ServerName          www.theapplegeek.ru
    RedirectPermanent   /   "http://ctrld.me/"
</VirtualHost>

Обратите внимание на запрет php для /wp-content/uploads. Также вы видите, что основное имя хоста у меня без www - этот рудимент меня удивлял ещё лет семь назад. Но так как есть некоторые посетители, пытающиеся вводить www, то переучивать их можно только с помощью Permanent Redirect на основной домен.

Всё, Apache сконфигурирован. Конечно же, путь /Users/ctrld/Sites/theapplegeek/public_html должен существовать. Делаем тестовый файл для проверки php:

$ vim /Users/ctrld/Sites/theapplegeek/public_html/info.php

Проверим конфигурацию apache:

$ sudo /opt/local/apache2/bin/apachectl configtest
Syntax OK

Если всё в порядке, то запускаем его (в первый раз - через launchctl load -w, чтобы он смог стартовать после перезапуска системы):

$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist

А в дальнейшем можем использовать apachectl:

$ sudo apachectl start
$ sudo apachectl stop
$ sudo apachectl restart
$ sudo apachectl graceful

Последняя команда (graceful) позволяет рестартовать apache без обрыва соединений, что вежливо по отношению к посетителям.

Можно убедиться, что apache запущен:

$ ps ax | grep htt
37877   ??  Ss     0:00.10 /opt/local/apache2/bin/httpd -k start
37878   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start
37879   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start
37880   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start
37881   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start
37882   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start

Теперь небольшой "хинт". Я описал виртуальный хост реального сайта theapplegeek.ru. Но я ещё ничего не переносил и контента там нет. Для того, чтобы оттестировать сайт и исправить ошибки, я направляю запросы на новое место, модифицируя /etc/hosts на том компьютере, с которого я тестирую сайт, но другие посетители будут ходить до переключения в DNS на старое место.

$ sudo vim /etc/hosts
94.45.55.146	theapplegeek.ru
94.45.55.146	www.theapplegeek.ru

Всё, подготовительные работы сделаны, можно проверять. Открываю в браузере URL http://ctrld.me/info.php с тестовым скриптом PHP. Всё работает. Благодать. Если же есть какие-то проблемы, то нужно смотреть логи:

$ tail -f /opt/local/apache2/logs/theapplegeek.ru-error_log
$ tail -f /opt/local/apache2/logs/theapplegeek.ru-access_log
$ tail -f /opt/local/apache2/logs/error_log
$ tail -f /var/log/php_errors.log

Установка Wordpress не отличается от установки на любом Unix, его можно поставить по отличной инструкции на русском языке. Но если нужно, то напишите в комментариях, и я в отдельной части рассмотрю этот процесс.

Домашняя сеть у меня подключена через TimeCapsule, и проброс обращений извне к web-серверу, находящемся на адресе 192.168.98.2, я сделал через Port Mapping:

Внешний адрес я обычно смотрю через сервис WhatIsMyIP (94.45.55.146). Как только я перенёс сайт и проверил его работу, я зашёл в панель управления моими DNS-зонами и переключил записи со старого места на новое:

И затем начал следить за логами и корректировать проблемы, которые я пропустил. На помощь приходит в том числе такая конструкция, позволяющая искать 404/etc:

$ tail -1000 /opt/local/apache2/logs/theapplegeek.ru-access_log \
	| awk '$9 != 200 && $9 != 304 {print $9, $7}' | sort | uniq -c

Вуаля.

Через несколько часов убираем из /etc/hosts добавленные ранее записи.

Следующим шагом я сконфигурирую nginx с использованием fastcgi для обработки PHP. Ещё (это больше памятка самому себе) нужно будет включить ежедневную ротацию логов. И сделать тюнинг PHP и сетевых параметров Mac OS X.