Я думаю все прекрасно знают, что такое кэширование и как оно работает. Этой информации в интернете слава богу много и не в дефиците она, так что воду лить не буду скажу по существу.
Стояла у меня задача настроить кэширование сайта на 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), очень всё быстро работает и ресурсы почти не потребляет)