The Apple Geek

Чему ты научился сегодня?

Настройка блога Wordpress на Mac OS X. Часть 2, Apache

Для простоты следующим шагом в качестве 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-webTo 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-mysqlTo use mysqlnd with a local MySQL server, edit /opt/local/etc/php5/php.ini and setmysql.default_socket, mysqli.default_socket and pdo_mysql.default_socketto /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.inidate.timezone = Europe/Kieverror_log = /var/log/php_errors.logmysql.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.confInclude conf/extra/httpd-vhosts.confInclude 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.confTimeout 300KeepAlive OnMaxKeepAliveRequests 100KeepAliveTimeout 5UseCanonicalName OffAccessFileName .htaccessServerTokens ProdServerSignature OffHostnameLookups Off

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

$ sudo vim /opt/local/apache2/conf/extra/httpd-vhosts.confNameVirtualHost *:80    ServerAdmin [email protected]    ServerName theapplegeek.ru    ErrorLog "logs/theapplegeek.ru-error_log"    CustomLog "logs/theapplegeek.ru-access_log" common    DocumentRoot "/Users/ctrld/Sites/theapplegeek/public_html"            Options FollowSymLinks -Indexes        AllowOverride All        Order allow,deny        Allow from all                 php_admin_flag engine off        AddType text/plain .html .htm .shtml        ServerName          www.theapplegeek.ru    RedirectPermanent   /   "/"

Обратите внимание на запрет 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 configtestSyntax 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 htt37877   ??  Ss     0:00.10 /opt/local/apache2/bin/httpd -k start37878   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start37879   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start37880   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start37881   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start37882   ??  S      0:00.00 /opt/local/apache2/bin/httpd -k start

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

$ sudo vim /etc/hosts94.45.55.146    theapplegeek.ru94.45.55.146    www.theapplegeek.ru

Всё, подготовительные работы сделаны, можно проверять. Открываю в браузере URL /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.

Linux

« А сколько вы потратили на приложения в App Store? Решение проблемы с русскими буквами при соединении через ssh »

Comments