Я думаю все прекрасно знают, что такое кэширование и как оно работает. Этой информации в интернете слава богу много и не в дефиците она, так что воду лить не буду скажу по существу.
Стояла у меня задача настроить кэширование сайта на wordpress работающего под управлением http-сервера Nginx. Для тех кто не знает Nginx намного быстрее и стабильнее работает под большими нагрузками, чем Apache используемый почти всеми хостинговыми компаниями. Да Apache более прост в настройке, но когда нагрузка на сайт возрастает, никакое кэширование не спасёт, что случилось однажды и со мной. Сайт периодически выдавал 502 ошибку загрузка была максимальной.
Был приобретён VPS, поставлен на нём ispmanager 5 lite панель хорошая без тех бубнов что были в 4 версии и работает как надо всё из коробки. Режим работы php для сайта был выбран FastCGI (Nginx + PHP-FPM).
При переходе с Apache на Nginx есть несколько нюансов. Во первых файл .htaccess на сервере Nginx работать не будет, он просто там не поддерживается, а следовательно большинство плагинов хеширования будут работать кое как, так как на прямую зачастую используют именного его, также могут возникнуть проблемы с ЧПУ и плагинами Защиты вашего WordPress.
Но вопрос решается. У Nginx имеется своё кэширование, которое работает лучше любого плагина.
Для того чтобы грамотно настроить кэширование нужно полазить по серверу и немного подредактировать конфиги самого Nginx. И так поехали. Допустим наш сайт называется example.com, пользователь под которым существует наш сайт user.
Для начала давайте включим сжатие всех статичных файлов, которые отдаются пользователю, скрипты, каскадные таблицы стилей и тд. Для этого открываем конфиг Nginx по адресу etc/nging/nginx.conf и в секцию
http {
...
}
добавляем следующее -
gzip on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_types
text/plain
text/css
text/js
text/xml
text/javascript
application/javascript
application/x-javascript
application/json
application/xml
application/xml+rss;
Увеличим максимальный размер загружаемого файла, например, пусть будет 128 Мб. Добавляем туда же в секцию http.
client_max_body_size 128m;
Скроем версию Nginx от других пользователей с точки зрения безопасности. Добавляем туда же в секцию http.
server_tokens off;
Теперь займёмся кэшированием для начала давайте создадим каталог на сервере, где будет хранится весь кэш, например var/tmp/nginx/user/example
Приступаем к редактированию конфига nginx к сайту example.com
Конфиг находится по адресую etc/nginx/vhosts/user/example.com.conf по умолчанию конфиг генерируется следующего вида
#user 'user' virtual host 'example.com' configuration file
server {
server_name example.com www.example.com;
charset UTF-8;
disable_symlinks if_not_owner from=$root_path;
index index.php;
root $root_path;
set $root_path /var/www/user/data/www/example.com;
ssi on;
access_log /var/www/httpd-logs/example.com.access.log ;
error_log /var/www/httpd-logs/example.com.error.log notice;
listen 123.234.345.456:80;
include /etc/nginx/vhosts-includes/*.conf;
location / {
location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exists @php;
}
}
location @php {
fastcgi_index index.php;
fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@example.com";
fastcgi_pass unix:/var/www/php-fpm/user.sock;
fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
try_files $uri =404;
include fastcgi_params;
}
}
теперь мы его немного дополним, давайте пропишем путь к каталогу, в котором буде хранится наш кэш. Перед секцией server {...} добавим следующую строку
fastcgi_cache_path /var/tmp/nginx/user/example levels=2 keys_zone=example:16m max_size=512m inactive=1d;
Теперь в секцию server {...} добавим следующий код (внимательно просмотрите код не забудьте поменять домен example.com на свой)
# объявляем о необходимости кешировать только тех, у кого НЕТ куки комментатора (боты и большинство других посетителей)
if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}
fastcgi_cache_bypass $do_not_cache;
fastcgi_no_cache $do_not_cache;
fastcgi_pass_header Cookie;
fastcgi_cache example; #не забудьте поменять
fastcgi_cache_key $request_method|$host|$request_uri;
fastcgi_cache_valid 301 8h;
fastcgi_cache_valid 404 1h;
# важно: это время жизни кеша страницы - больше значение, реже обновляется, но и меньше нагрузки
fastcgi_cache_valid 200 12h;
if ($http_user_agent !~* FeedBurner|FeedValidator) {
rewrite ^/feed.rss$ http://feeds.feedburner.com/example?format=xml; #не забудьте поменять
}
error_page 404 = @wordpress;
log_not_found off;
location ^~ /files/ {
rewrite /files/(.+) /wp-includes/ms-files.php?file=$1 last;
}
#Включаем кэширование браузера пользователей вашего сайта
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|js|zip|rar)$ {
root /var/www/user/data/www/example.com/; #не забудьте поменять
expires 99d; #Количество дней сколько буде хранится кэш
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files $uri @wordpress;
fastcgi_pass unix:/var/www/php-fpm/user.sock; #не забудьте поменять
if ($do_not_cache != "1") {
add_header Vary Cookie;
}
}
location @wordpress {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_index index.php;
fastcgi_pass unix:/var/www/php-fpm/user.sock; #не забудьте поменять
if ($do_not_cache != "1") {
add_header Vary Cookie;
}
}
# не кешируем админку и некоторые другие страницы
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 unix:/var/www/php-fpm/user.sock; #не забудьте поменять
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ^~ /blogs.dir/ {
internal;
root /var/www/user/data/www/example.com/wp-content/; #не забудьте поменять
}
Теперь приведём в порядок ЧПУ для их корректной работы следует дописать в location / {...}
try_files $uri $uri/ /index.php?$args;
В итоге весь конфиг должен принять следующий вид.
#user 'user' virtual host 'example.com' configuration file
fastcgi_cache_path /var/tmp/nginx/user/example levels=2 keys_zone=example:16m max_size=512m inactive=1d;
server {
server_name example.com www.example.com;
charset UTF-8;
disable_symlinks if_not_owner from=$root_path;
index index.php;
root $root_path;
set $root_path /var/www/user/data/www/example.com;
ssi on;
access_log /var/www/httpd-logs/example.com.access.log ;
error_log /var/www/httpd-logs/example.com.error.log notice;
listen 123.234.345.456:80; #не забудьте поменять на свой ip сервера
include /etc/nginx/vhosts-includes/*.conf;
# объявляем о необходимости кешировать только тех, у кого НЕТ куки комментатора (боты и большинство других посетителей)
if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}
fastcgi_cache_bypass $do_not_cache;
fastcgi_no_cache $do_not_cache;
fastcgi_pass_header Cookie;
fastcgi_cache example; #не забудьте поменять
fastcgi_cache_key $request_method|$host|$request_uri;
fastcgi_cache_valid 301 8h;
fastcgi_cache_valid 404 1h;
# важно: это время жизни кеша страницы - больше значение, реже обновляется, но и меньше нагрузки
fastcgi_cache_valid 200 12h;
if ($http_user_agent !~* FeedBurner|FeedValidator) {
rewrite ^/feed.rss$ http://feeds.feedburner.com/example?format=xml; #не забудьте поменять
}
error_page 404 = @wordpress;
log_not_found off;
location ^~ /files/ {
rewrite /files/(.+) /wp-includes/ms-files.php?file=$1 last;
}
#Включаем кэширование браузера пользователей вашего сайта
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|js|zip|rar)$ {
root /var/www/user/data/www/example.com/; #не забудьте поменять
expires 99d; #Количество дней сколько буде хранится кэш
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files $uri @wordpress;
fastcgi_pass unix:/var/www/php-fpm/user.sock; #не забудьте поменять
if ($do_not_cache != "1") {
add_header Vary Cookie;
}
}
location @wordpress {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_index index.php;
fastcgi_pass unix:/var/www/php-fpm/user.sock; #не забудьте поменять
if ($do_not_cache != "1") {
add_header Vary Cookie;
}
}
# не кешируем админку и некоторые другие страницы
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 unix:/var/www/php-fpm/user.sock; #не забудьте поменять
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ^~ /blogs.dir/ {
internal;
root /var/www/user/data/www/example.com/wp-content/; #не забудьте поменять
}
location / {
try_files $uri $uri/ /index.php?$args;
location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exists @php;
}
}
location @php {
fastcgi_index index.php;
fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@example.com";
fastcgi_pass unix:/var/www/php-fpm/user.sock; #не забудьте поменять
fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
try_files $uri =404;
include fastcgi_params;
}
}
Настоятельно рекомендую перед изменением конфигов делать их резервные копии. Надеюсь данная статья будет кому-то полезна. Спасибо за внимание.
Полезная статья, спасибо
огромное спасибо за статью, 2 дня разбирался с такой же ситуацией, теперь всё заработало (выделенный сервер на 16 убунте, исп менеджер, 4 сайта в режиме FastCGI (Nginx + PHP-FPM), очень всё быстро работает и ресурсы почти не потребляет)