![]()
Для простоты следующим шагом в качестве 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://theapplegeek.ru/"
</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
<?php
phpinfo();
?>
Проверим конфигурацию 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://theapplegeek.ru/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.





