Настройка wordpress с apache-itk и nginx
Перенёс блог на другую VDS, при этом в корне изменив механизм работы.
Раньше было nginx+php-fpm+кэширование в nginx (причём это кэширование – целая жопа, так как там пришлось сделать огромное число location`ов с разными настройками)
Ну, вообщем, поехали по пунктам.
-
Для начал нужен сервер на котором всё это будет работать.
У меня блог сейчас работает на VDS с системой виртуализации VDSmanager-FreeBSD на FreeBSD 8.
Со 128 мегабайтами оперативной памяти.
Заказать такой можно по кнопке “FirstVDS.ru” в сайдбаре. При заказе по этой кнопке, на первый месяц будет скидка в 25%. Заказывать надо тариф не ниже “VDS-Разгон”. Шаблон диска FreeBSD-8-ISPmanager. -
nginx уже стоит в данном шаблоне. Поэтому его достаточно просто включить в ISPmanager в разделе “Возможности”. Далее создать пользователя, WWW домен и т.п.
Ну и, наконец, закачать сам сайт куда надо.
В данном дисковом шаблоне стоит apache22-itk. Он обрабатывае PHP скрипты не от пользователя www, а от пользователя, которому принадлежит сайт. Потому нету никаких проблем с закачкой файлов, и т.п. -
Оптимизируем апач.
В /usr/local/etc/apache22/extra/httpd-mpm.conf пропишем следующие настройки (лучше вне ifmodule)
StartServers 1
MinSpareServers 1
MaxSpareServers 5
MaxClients 3
MaxRequestsPerChild 1000
Как ни странно, но 3-х процессов апача хватает для обработки запросов. -
А теперь, собственно, начинается самое интересное.
Ставим в wordpress плагин wp-super-cache, включаем, ну и можно поднастроить немного его.
Данный плагин создаёт статические html файлы страниц. При этом, если страницу открывал авторизованный пользователь, то в качестве имени файла используется хитрых хэш.
А если нет, то (тут самое интересное), в директории /wp-content/cache/supercache/ создаются директории и файлы вида имя_сайта/адрес_страницы/index.html
А раз это статический файл, то его может отдать nginx минуя апач. -
В файл wp-config.php добавляем строку
define('TEST_COOKIE', 'test_wordpr_cookie');
Для чего это? Эта cookie ставится при открытии страницы wp-login.php, причём независимо от того, залогинился пользователь или нет. По умолчанию, кука называется wordpress_test_cookie. А все куки, начинающиеся со слова “wordpress_”, учитываются плагином wp-super-cache, и если есть такая кука, то пользователь считается авторизованным, и соответственно статичная страница в кэшэ создаётся с именем в виде хэша. А нужно, чтобы создавалась с “человеческим” именем. -
Собственно, настраиваем nginx. Далее будет конфиг /usr/local/etc/nginx.conf с комментариями.
server { listen 82.146.41.102:80; index index.php #определяем индексную страницу server_name reonaydo.org.ru www.reonaydo.org.ru; rewrite ^(/manager/.*)$ https://$host$1 permanent; # выше - стандартная часть, создаваемая ISPmanager`ом # далее часть, отвечающая за обработку запросов к PHP файлам. Проксируем к апачу. location ~ \.php { proxy_pass http://82.146.41.102:8080; proxy_redirect http://reonaydo.org.ru:8080/ /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; } # Запрещаем доступ к файлам с именем в виде хэша, и к htaccess файлам в директории с кэшэм location ~ (/wp-content/cache/(wp-cache-.*\.html|meta)|\.htaccess) { deny all; } # Собственно, основная секция. Далее поподробнее. location / { access_log /home/httpd-logs/reonaydo.org.ru.access.log; root /home/tuupic/data/www/reonaydo.org.ru; # Данная конструкция if проверяет наличие куки, учитываемых плагином. # И в случае их наличия(пользователь авторизован), делается внутренняя переадресация # на страницу /authed if ($http_cookie ~ "comment_author_|wordpress|wp-postpass_") { rewrite ^/(.*) /authed$1 last; } # на самом деле такого url нету, и далее будет ещё один внутренний реврайт # и реврайтим туда же запросы с аргументами (например поиск) if ($args) { rewrite ^/(.*) /authed$1 last; } # try_files проверят наличие файла, соответствующего запросу, либо находящегося в кэшэ # если и там и там нету, то запрос уходит в специальный location @fallback # я не стал делать проверку существования директории ($uri/), # так как у вордпресса нету директорий, в которых ещё есть индексные файлы try_files $uri /wp-content/cache/supercache/$host/$uri/index.html @fallback; } # Собственно специальный location для авторизованных пользователей. location /authed { access_log /home/httpd-logs/reonaydo.org.ru.access.log; internal; rewrite ^/authed(.*) /$1 break; # делаем обратный внутренний реврайт root /home/tuupic/data/www/reonaydo.org.ru; # и проверям наличие файла. Иначе на @fallback try_files $uri @fallback; } # А сам @fallback представляет из себя копию location`а для PHP файлов location @fallback { proxy_pass http://82.146.41.102:8080; proxy_redirect http://reonaydo.org.ru:8080/ /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; } } - В результате, при большом времени кэширования, большая часть страниц сайта является статическими файлами и отдаётся nginx`ом, не нагружая “медленный” апач.
- Any questions?


