Архивы: wordpress

WordPress + nginx + cache (Настройка nginx + кэширование + WP)

У nginx с версии 0.7(чёта-там) появилась функция кэширования ответов от бэкэнда.
штука крайне полезная, в условиях высоких нагрузок, но настроить на корректную работу для WP оказалось не так просто.

Но попробуем
Создаём каталог где будет храниться кэш, назначаем права работы с ним (у меня nginx работает под www-data)

mkdir /var/cache/nginx
chown www-data:www-data /var/cache/nginx/

в файле nginx.conf
пишем

## Создаем кеш зону pagecache (память под ключи в 16Мб) с настройками:
# inactive: xранить кеш 1 день (если к нему не было обращений)
# max_size: максимальный размер кеш данные 256Мб
proxy_cache_path /var/cache/nginx levels=2 keys_zone=pagecache:16m inactive=1d max_size=256m;

теперь для нужного нам Виртуал хоста в диррективе SERVER прописываем, привожу полный конфиг своего vhost

server {
listen 80;
server_name www.krasfun.ru krasfun.ru krasfan.ru www.krasfan.ru;

#access_log /var/log/nginx/krasfun/access2.log;
access_log off;
error_log  /var/log/nginx/krasfun/error3.log  error;


#client_max_body_size 300m
# Сетевое ускорение
tcp_nopush on;
tcp_nodelay on;

#30 одновременных коннектов
#limit_conn one 30;

index index.php;

if ($http_cookie ~* «comment_author_|wordpress_(?!test_cookie)|wp-postpass_» ) {
set $do_not_cache 1;
}

root  /var/www/krasfun;

fastcgi_cache_bypass $do_not_cache;
fastcgi_no_cache $do_not_cache;
fastcgi_pass_header Cookie;
fastcgi_cache pagecache;
fastcgi_cache_key $request_method|$host|$request_uri;
fastcgi_cache_valid 301 8h;
fastcgi_cache_valid 404 1h;
fastcgi_cache_valid 200 15m;

set $Mybackend unix:/tmp/php5-fpm.sock;

location / {
try_files $uri $uri/ @wordpress;
}
# Это чтоб Админка, логинизация, и регистрация не кэшировались
location ~ ^/(wp-admin/.*\.php|wp-login\.php|wp-register\.php|(feed|comment/feed)(/.*)?)$ {
try_files $uri @wordpress;
set $do_not_cache 1;
fastcgi_cache_bypass 1;
fastcgi_no_cache 1;
fastcgi_pass $Mybackend;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}

location ~ \.php$ {
try_files $uri @wordpress;
include /etc/nginx/fastcgi_params;
fastcgi_pass $Mybackend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
if ($do_not_cache != «1) {
add_header Vary Cookie;
}
}

location @wordpress {
fastcgi_pass $Mybackend;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include /etc/nginx/fastcgi_params;
fastcgi_cache pagecache;
fastcgi_param SCRIPT_NAME /index.php;
if ($do_not_cache != "1") {
add_header Vary Cookie;
}
}

#Static files location
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|html|flv|mp3)$ {
root /var/www/krasfun; }

}

проверяем nginx -t и перезапускам nginx

тыкаем по сайту и потом смотри что у нас появилось в /var/cache/nginx

Прирост производительности? да конечно же есть.

тест номер1

# ab -n 1000 -c 5 http://www.krasfun.ru/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.krasfun.ru (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/0.8.53
Server Hostname:        www.krasfun.ru
Server Port:            80

Document Path:          /
Document Length:        37725 bytes

Concurrency Level:      5
Time taken for tests:   3.577 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      37972000 bytes
HTML transferred:       37725000 bytes
Requests per second:    279.54 [#/sec] (mean)
Time per request:       17.887 [ms] (mean)
Time per request:       3.577 [ms] (mean, across all concurrent requests)
Transfer rate:          10365.83 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   1.0      2       6
Processing:     7   16  46.0     14    1038
Waiting:        1    3   2.1      2      26
Total:          9   18  45.9     17    1039

Percentage of the requests served within a certain time (ms)
  50%     17
  66%     17
  75%     18
  80%     18
  90%     19
  95%     21
  98%     28
  99%     31
 100%   1039 (longest request)

Без кэширования этот тест провалился куда-то

Убрать поле email в комментариях WordPress (remove email from comments)

А вот с этим полем сложнее.

для начала делаем так, чтоб поле емейл было не обязательно это в Настройка- Обсуждение снимаем нужную галочку
потом идём в код в каталог и файл wp-includes/comment-template.php

там находим

'email'  => '<p class="comment-form-email">' .
                '<label for="email">' . __( 'Your Email' ) . '</label> ' .
                ( $req ? '<span class="required">*</span>' : '' ) .
                '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' />' .
        '</p><!-- #form-section-email .form-section -->',

я на том месте сделал

'email'  => '',

Убрать поле url в комментариях WordPress (remove url from comments)

Поле урл убирается довольно просто, для этого в файл functions.php надо добавить

function remove_url_from_comments($fields) {
    unset($fields['url']);
    return $fields;
}
add_filter('comment_form_default_fields', 'remove_url_from_comments');

Переезжаем на php5+fpm

И так, раз выдались выходные, можно поработать для себя и для души, проблема с высокой нагрузкой на мой сервер висит давно надо мною.

Сегодня решил один из своих сайтов перевести со связки nginx — Apache2+mod_php5 на nginx+php5-fpm в надежде, что появятся свободные ресурсы, которые сервер сможет тратить на mysql.

Введя в гугл запрос «ubuntu nginx php-fpm» я начал понимать, что предложенные варианты мне не подходят, т.к. я хотел перевести всего один из пару десятков сайтов, а все остальные продолжали работать на apache2.

Второе условие, что сайт у меня на wordpress и он должен заработать с прежним функционалом.

Я уже ранее писал, что я перешёл на PHP5.3 и вот ещё боялся ставить php-fpm версий меньше чем 5.3 т.к. не знал, а всё ли заработает, но сильно не задумываясь я решил проверить есть ли php-fpm в репозиториях? ну и разумеет оказался, как раз в тех, откуда я ставил PHP 5.3

и так поехали

apt-get install php-fpm

Он успешно устанавливается, связка nginx+apache2 у меня была настроена по вот этим статьям
Раз — компилируем сам nginx и два связываем всё во едино (пропуская установку из пакета)

Теперь я хочу один из virtualhost’ов заменить.
Делаю резервную копию старого конфига и начинаю собирать новый.
Времени я потратил много.
Основная беда была в том, что повсеместно используется mod_rewrite для Apache, и теперь надо заставить работать правила но уже на nginx. Снова гугл и снова по крупицам воссоздал конфиг, который работает для wordpress
и так привожу конфиг
/etc/nginx/sites-available/mysite

server {
listen 80;
server_name www.mysite.ru mysite.ru;

access_log /var/log/nginx/mysite/access1.log;
error_log  /var/log/nginx/mysite/error1.log  error;

index index.php;
root  /var/www/mysite;
location / {
try_files $uri $uri/ @wordpress;
}

location @wordpress {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root/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 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

}

Сохраняем, проверяем nginx на ошибки синтаксиса.

nginx -t

Если скажет, что ошибок нет, идём дальше — запускаем php5-fpm

 /etc/init.d/php5-fpm start

Теперь можно перезапустить nginx и пробовать зайти на свой сайт.
я столкнулся с ошибками, пол шаблона wordpress была свёрстана с вот такими тегами
Когда должно быть
Поправил нужные места, потом пошёл отредактировал новый php.ini который находится вот тут

/etc/php5/fpm

Собственно вся история, легче или сложнее жить я пока не заметил надо наблюдать, смотреть на графики и т.п.
итог wordpress заработал на php-fpm ^)

Ах чуть не забыл есть ещё плагин для wordpress, который дружит его с nginx
_http://wordpress.org/extend/plugins/nginx-compatibility/
я им воспользовался, но не знаю нужен он был или нет