Публикация в группе: Полезное для WordPress

Категории группы: Настройка

Я думаю все прекрасно знают, что такое кэширование и как оно работает. Этой информации в интернете слава богу много и не в дефиците она, так что воду лить не буду скажу по существу.

Стояла у меня задача настроить кэширование сайта на 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;
	}
}

Настоятельно рекомендую перед изменением конфигов делать их резервные копии. Надеюсь данная статья будет кому-то полезна. Спасибо за внимание.

 

20

Автор публикации

не в сети 7 месяцев

ILya Khodiy

38
Комментарии: 12Публикации: 2Регистрация: 14-10-2013Продаж/Покупок: 0/0