nginx Compatibility
Делаем WordPress дружелюбнее к nginx
Описание
Плагин предназначен для решения двух проблем:
- Когда WordPress обнаруживает, что используется FastCGI SAPI, код перенаправления, передаваемый в
wp_redirect(), игнорируется. Таким образом, все перенаправления с кодом 301 тихо превращаются в перенаправления с кодом 302, что не очень хорошо для SEO.
Если WordPress работает под управлением nginx, плагин переопределяет функциюwp_redirect(), что позволяет использовать коды перенаправления. - Если WordPress считает, что
mod_rewrite(модуль Apache, отвечающий за переписывание URL’ов — используется для красивых постоянных ссылок) не загружен (а nginx не использует модули и API Apache), он предлагает использовать постоянные ссылки в формате PATHINFO (Настройки » Постоянные ссылки). Такие ссылки не очень красивы, но всё же лучше, чем ничего.
Тем не менее, nginx умеет переписывать URL’ы, но не может об этом сказать WordPress. За него это делает плагин, заставляя WordPress думать, что mod_rewrite всё-таки загружен, и можно использовать красивые пермалинки.
Установка
- Загрузите каталог
nginx-compatibilityв/wp-content/plugins/ - Активируйте плагин в панели управления WordPress
- Это всё
Никакой настройки не требуется, плагин сам обо всём позаботится
Замечания по конфигурации nginx
Хотя данный плагин и позволяет WordPress использовать красивые постоянные ссылки, для этого требуются специальные правила в конфигурации виртуального хоста.
Для nginx версии 0.7.32 и старше могут использоваться такие правила (приведены только релевантные блоки):
server_name mysite.com www.mysite.com;
root /path/to/blog;
index index.php;
location / {
try_files $uri $uri/ @wordpress;
}
location @wordpress {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/blog/index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_NAME /index.php;
}
location ~ \.php$ {
try_files $uri @wordpress;
fastcgi_index index.php;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Для nginx младших версий конфигурация виртуального хоста будет несколько другой:
server_name mysite.com www.mysite.com;
root /path/to/blog;
index index.php;
location / {
log_not_found off;
error_page 404 = @wordpress;
}
location @wordpress {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/blog/index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_NAME /index.php;
}
location ~ \.php$ {
if (!-e $request_filename) {
rewrite ^(.+)$ /index.php break;
break;
}
fastcgi_index index.php;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Замените /path/to/blog путём к блогу, в fastcgi_pass задайте адрес сервера php-cgi (обычно это 127.0.0.1:9000).
Для старых версий nginx, возможно, придётся изменить строку rewrite ^(.+)$ /index.php break;, если блог расположен не в корне сайта.
Файл fastcgi_params (в Debian он обычно в /etc/nginx, в других системах он может располагаться в другом месте — используйте правильный путь в директиве include!) выглядит примерно так (скорее всего, он идёт в стандартной поставке nginx):
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_buffer_size 32k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
Есть вопросы по конфигурации — пишите.
Часто задаваемые вопросы
Вопросов пока нет, ответов тоже. Задавайте.
Замечания
GoPHP5! Плагину для работы требуется PHP 5. PHP 4 не поддерживается разработчиками, у меня тоже нет желания его поддерживать. Тем более, что шестая версия на носу.
Домашняя страница плагина на wordpress.org.
Связанные записи
Автор: Vladimir; метки: FastCGI, mod_rewrite, nginx, PHP, WordPress, плагин
Комментарии к статье «nginx Compatibility» (53) »
Оставить комментарий к записи «nginx Compatibility»
Вы должны быть авторизованы, чтобы иметь возможность оставить комментарий.

Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.






Именно так. Спасибо!!! (ушёл посыпать голову пеплом)
[...] nginx Compatibility (PHP5): for better operation behind nginx. [...]
Владимир, рассчитываю на Вашу компетентную помощь. На хостинге два сайта, настроена связка nginx+php+fast-cgi (один – на WordPress’е, и Ваши рекомендации и плагин уже помогли с этим).
Сайты с небольшой посещаемостью (несколько десятков человек и 100-200 страниц за сутки), и имеет место эффект своего рода холодного старта: при открытии сайта он грузится дольше, и дольше генерируется страница. Если сразу перейти на другую страницу – быстрее и отдача, и время генерации. (по вордпрессу 0.300-0.500 против двух и больше секунд, вся загрузка – порядка 3 сек против 6-7 секунд и больше после паузы). Стоит остаться на странице на минуту-полторы – всё сначала (я так понимаю – если кто-то ещё в этот момент на сайте не совершает переходы).
То есть новые посетители и внимательные читатели получают работу сайта зримо медленнее возможной – а ресурсы, наоборот, свободны. И если, скажем, подключение eaccelerator’а и сокращает время генерации на 100-200 мс, то на фоне описанной проблемы такие вещи уже мало радуют.
Заходя по ssh, я вижу, конечно, запущенные процессы nginx’а и php. Ресурсы, по данным панели хостинга, используются чуть больше чем наполовину по памяти, по процессам – 25-30%. Эффект не всегда резко выражен, возможно – днем сильнее, так что грешу даже на хитрости хостера (это ру-центр, 201 тариф). Можно ли с помощью настроек конфига nginx или php повлиять на эту проблему? Если да – то как, или хотя бы куда копать? Пока нашёл только диковатую рекомендацию запрашивать свою же страницу по крону раз в несколько минут.
А точно проблема не в медленных запросах к базе? Просто если Вы используете кэш, то причина холодного старта как раз понятна. Можно попробовать поставить SQLMon и посмотреть на запросы, возможно, что проблема там.
А еще в Вашем тарифе есть ограничение на число одновременных соединений с MySQL (16). Получается, что в конкретный момент времени к сайту могут обращаться не более 16 пользователей (с учетом всяких wp-cron/AJAX возможно, что и меньше), последующие соединения будут ставиться в очередь. Это тоже может быть причиной тормозов.
Похоже, база здесь не ограничивает. Да, кэш использую, и попробовал мониторить, там есть неоптимальные, видимо, запросы (красный цвет). Но когда поймал время генерации 2.217, то при этом SQL Monitor: Total 9 queries, time taken: 0.04014.
Обновил страницу, выждав пару минут – опять две с копейками секунды (8 queries). Сразу F5 – получил 0.346, а результаты по базе – близкие (и те же 8 запросов), хотя и чуть быстрее.
Антон, обновите плагин (SQLMon). Потом обратите внимание, сколько времени занимает запрос
CONNECT user:password@host/db(он, вероятно, будет самым первым).Да – первая строка, вот такие три результата для трёх последовательных запросов одной страницы: 0.0152 0.06547 0.00781. Время генерации страницы (в том же порядке):1.857 0.878 0.371, вроде бы нет корреляции.
[...] 2.9.2, standard Kubrick theme, nginx Compatibility plug-in [...]