Август
14
2011

Настройка nginx для работы с WordPress

Настройка nginx для работы с WordPress

Nginx все активней захватывает рынок веб-серверов за счет быстрой отдачи статистических файлов. Все динамические запросы нужно пересылать на обработку соответствующим модулям. Для PHP лучше использовать PHP-fpm, и полностью отказаться от использования apache.

Ниже инструкция-описание моего конфига для nginx.

Действия с WordPress

Для работы WP Super Cache в паре с nginx нужно настроить ЧПУ.

nginx Compatibility

Старые версии WordPress тесно связаны с Apache, например для работы ЧПУ проверяется наличие mod_rewrite, которого в nginx отродясь не было. Для борьбы с этой и другими проблемами нужно поставить плагин nginx Compatibility. Если у вас стоит PHP5, то не нужно активировать плагин сразу, а перейти к списку плагинов и активировать версию для PHP5. Настраивать ничего не нужно.

Начиная с версии 3.3.1 (может быть и раньше) WordPress работает под nginx самостоятельно.

WP Super Cache

Для кеширования я использую WP Super Cache, самое главное, что сгенерированные страницы он складывает по папочкам, а оттуда их возьмет nginx, даже не вспоминая про PHP.

Особых хитростей в настройке нет, но я предпочитаю ставить время жизни кеша побольше, все равно в случае обновления страницы WP Supercache убирает старую, а комментарии прекрасно отображаются через Disqus.

Настройка Nginx

В конце файла конфигурации есть такая строчка

include /etc/nginx/conf.d/*.conf;

Это значит, что при старте nginx загружает все файлы с окончанием .conf, хранящиеся в папке /etc/nginx/conf.d/. Для удобства я для каждого домена создаю отдельный файл, а в него уже вписываю все настройки.

Постоянный редирект (301) с WWW на non-WWW

Вместо хитрых условий и проверок я использую отдельную запись server

server {
listen 80;
server_name www.tigors.net ;
rewrite  ^/(.*)$  http://tigors.net/$1  permanent;
}

Параметр permanent заставляет сервер выдавать код ответа 301.

Отдача картинок

Я ранее написал как вынести картинки NextGEN Gallery на отдельный домен, теперь пришло время это использовать.

server {
listen 80;
server_name g.tigors.net;
expires 30d;
root /путь-к-вордпрессу/wp-content/gallery/;
}

Основная настройка nginx

Ниже приведен один большой блок server, он пытается взять страницу из кеша, если ее нет, то запускает PHP. Кроме того рекомендую использовать модуль ngx_http_gzip_static, который отлично работает в паре с WP Super Cache.

server {
listen       80;
server_name  tigors.net;
root /путь-к-вордпрессу/;
 
location / {
 
#Если запрошен файл, то отдаем его. Для всех файлов (не страниц) у меня стоит время жизни 30 дней.
#В этом случае пользователи не будут повторно запрашивать статические файлы повторно.
if (-f $request_filename) {
expires 30d;
break;
}
 
#Создаем временную переменную, содержащую запрос.
#Если эта переменная обнуляется, то в конце запрос передается PHP-fcgi на исполнение.
set $supercache_file '';
set $supercache_uri $request_uri;
#Если используется метод POST, то переменная обнуляется.
if ($request_method = POST) {
set $supercache_uri '';
}
#Если запрос содержит параметры, то переменная обнуляется.
if ($args) {
set $supercache_uri '';
}
#Если у пользователя есть кука wordpress_logged_in_, то временная переменная обнуляется
if ($http_cookie ~* "wordpress_logged_in_" ) {
set $supercache_uri '';
}
# Если переменная не пустая, то она используется для построения пути к файлу кеш.
if ($supercache_uri ~ ^(.+)$) {
set $supercache_file /wp-content/cache/supercache/$http_host/$1index.html;
}
# Если такой файл есть, то его выдают пользователю.
if (-f /путь-к-вордпрессу$supercache_file) {
rewrite ^(.*)$ $supercache_file break;
}
# Все остальные запросы ходят к  index.php
if (!-e $request_filename) {
rewrite . /index.php last;
}
index index.php index.html;
}
# Запросы к файлам .php перенаправляются на php-fastcgi
location ~ \.php$ {
include fastcgi_params;
fastcgi_param  SCRIPT_FILENAME    /путь-к-вордпрессу/$fastcgi_script_name;
fastcgi_pass  127.0.0.1:9000;
}
}

Результаты

Если страница сгенирирована и сохранена в кеше, то php не вызывается. Я для эксперимента даже выключал php-fastcgi, nginx выдавал страницу без проблем.

Минус в том, что вызовов PHP настолько мало, что рушится вся работа WP-Cron. Даже пришлось написать отдельно запуск WP-Cron по Cron.

После таких нехитрых действий скорость загрузки некоторых страниц в Google Analytics существенно упала.

 

Неправильная раскладка: yfcnhjqrf тпштч lkz hf,jns c цщквзкуыы

Понравилась статья? Посоветуйте друзьям!

nginx PHP WordPress WP Plugin WP Super Cache Скорость сайта


Понравилась статья? Подпишись на рассылку по E-Mail или в RSS.
  • \"скорость загрузки некоторых страниц в Google Analytics существенно упала.\" может все-таки увеличилась?
  • Борис
    Tigor, а может подскажете что нужно сделать чтобы нормально сохранялись записи в Wordpress? Дело в том, что у меня в записях много php-кода, стоит плагин exec-php. Переехал на новый хостинг, а тут nginx фронтендом к апачу. Сайт перенес легко, но ни новую статью создать, ни отредактировать старую - не могу. Nginx выбрасывает ошибку. Статьи, в которых нет кода - нормально сохраняются. И если не найду решение, надо отключать nginx для сайта. Кстати, как? Это можно сделать, например, в .htaccess?
  • Нужно смотреть какая именно ошибка. На хостинге может стоять защита от инъекций кода. Не факт что проблема в nginx. Тут нужно у поддержки спрашивать. nginx с .htacess никак не связан. Он настраивается через свои конфиги.
  • Борис
    Как-то странно всё... Часть кода проходит, часть нет... Всё, я понял, не в коде дело... в размере... Есть три части кода, три строки, по сути... любая из них сохраняется без проблем... две маленьких - без проблем, любая маленькая с большой - уже никак... это точно какое-то ограничение на размер... подскажете где копать? Поддержка я и есть :( - мой сервер...
  • Похоже на ограничение max POST size.