Nginx кэширование статики на стороне сервера


Nginx часто применяется в веб-проектах не в малой степени потому, что позволяет временно сохранять  контент сайтов. В Nginx кэширование настраивается очень просто (по сравнению с другими хранилищами) и является хорошим средством оптимизации работы веб-сервера.



Используется при больших нагрузках. Кэширование позволяет быстрее отдавать контент при втором и последующих обращениях к сайту. В блоге Nginx про кэширование.



Также кэширующие сервера легко кластеризуются


Чтобы кэширование nginx работало корректно в конфигурационном файле nginx.conf определяется путь к каталогу, в который будут складываться закэшированные на стороне сервера данные и задается его размер.



Рассматривается серверное кэширование и использование Nginx как хранилища. Браузерное кэширование задается одним блоком в настройках.



Запускается веб-сервер в двух экземплярах на разных портах, обычно на разных машинах.


Кэширующий веб-сервер дает снижение нагрузки. Страница, один раз сгенерированная, сохраняется в кэш и отдается клиентам из него пока не истечет установленный TTL (time to live). Когда он истечет страница вновь будет сгенерирована и загружена в кэш — это требуется для того, чтобы посетитель сайта получал актуальную информацию.



Nginx кэширование: настройка


В примере закэшированные данные будут складываться на сервере 123.123.123.123 в каталог /var/cache/nginx. Максимальный размер файлов в кэше — 128 Мб, если этого буфера будет не хватать самые редко запрашиваемые данные будут вытесняться


nginx кэширование


На кэширующем Nginx сервере с адресом 123.123.123.123:

mcedit /etc/nginx/nginx.conf

http {
proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=all:128m;
}



Каталог /var/nginx/cache нужно создать

mkdir -p /var/nginx/cache



Настройка виртуального хоста


Все, что здесь требуется — принимать запросы на выбранном для кэширующего Nginx, затем проксировать их на основной сервер.


mcedit /etc/nginx/sites-availible/example.com

server {
listen *:80;

server_name example.com;
access_log /var/log/nginx/access.log;

location / {

proxy_pass http://124.124.124.124:80/;
proxy_set_header Host $host;
proxy_buffering on;
proxy_cache all;
proxy_cache_valid any 30m;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

}



В конфигурационном файле указано, что кэшировать нужно все содержимое, TTL установлен в 30 минут.



Виртуальный хост активируется

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled



Затем требуется перечитать конфигурацию

nginx -s reload



На основном Nginx сервере с адресом 124.124.124.124:

Никаких изменений здесь вносить не требуется — можно при необходимости запустить веб-сервер на альтернативном порту.


mcedit /etc/nginx/sites-availible/example.com

server {
listen *:80;
server_name example.com;
proxy_read_timeout 200s;
access_log off;

root /var/www/sites/example.com/;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

}

}



Виртуальный хост также нужно активировать. Затем перечитать конфигурацию выполнив nginx -s reload


ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled

nginx -s reload



Конфигурация может быть любой: Nginx + PHP-FPM или Nginx + Apache2 как в примере.



Добавляем файл index.php для того чтобы проверить кэширование

mcedit /var/www/sites/example.com/index.php

<?php

echo 'Works!';

?>



Теперь можно обратиться к сайту через браузер, 'Works!' будет говорить о том, что запросы успешно перенаправляются.



На кэширующем Nginx сервере с адресом 123.123.123.123:

Теперь можно проверить появилось ли что-либо в каталоге, выделенном под хранилище данных

ls -la /var/nginx/cache/

total 20
drwxr-xr-x 5 www-data root 4096 июл 22 15:34 .
drwxr-xr-x 3 root root 4096 июл 22 14:58 ..
drwx—— 4 www-data www-data 4096 июл 22 15:41 2
drwx—— 3 www-data www-data 4096 июл 22 15:07 8
drwx—— 3 www-data www-data 4096 июл 22 15:34 c



Файлы присутствуют, что говорит об успешной настройке. Кэширующее хранилище начало работу и сохраняет данные при обращениях к сайту.



С Nginx кэширование можно настроить на нескольких машинах создав кэширующий кластер, они могут определяться через upstream. Обычно используется до 10 серверов.

Сказать спасибо