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

Опубликовано admin в Чт, 17/11/2011 - 15:20

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

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

 

Действия с WordPress

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

nginx Compatibility

Некоторые функции WordPress тесно связаны с Apache, например для работы ЧПУ проверяется наличие mod_rewrite, которого в nginx отродясь не было. Для борьбы с этой и другими проблемами нужно поставить плагин nginx Compatibility (http://blog.sjinks.pro/wordpress-plugins/nginx-compatibility/). Если у вас стоит PHP5, то не нужно активировать плагин сразу, а перейти к списку плагинов и активировать версию для PHP5. Настраивать ничего не нужно.

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.tigor.org.ua ;
rewrite ^/(.*)$ http://tigor.org.ua/$1 permanent;
}

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

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

Как вынести картинки NextGEN Gallery на отдельный домен.

server {
listen 80;
server_name g.tigor.org.ua;
root /путь-к-вордпрессу/wp-content/gallery/;
}

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

Ниже приведен один большой блок server, он пытается взять страницу из кеша, если ее нет, то запускает PHP.

server {
listen 80;
server_name tigor.org.ua;
root /путь-к-вордпрессу/;
 
location / {
 
#Если запрошен файл, то отдаем его
if (-f $request_filename) {
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 выдавал страницу без проблем.

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

( categories: )