Alter.Org.UA
 << Back Home EN en   Donate Donate

настройка кеширующей nginx-прокси (reverse)

Вводная

О правильный директивах кеширования на стороне web-сервера я уже писал. Как оказалось, применяие nginx в качестве акселератора (reverse proxy) для имеет свои особенности. По умолчанию nginx в режиме proxy просто игнорирует директивы управления кешированием ETag и Cache-Control, передаваемые между web-сервером (например, apache) и клиентом. В результате динамический контент перестает обновляться. Также, часть данных есть смысл отдать статически, тоже не забыв указать параметры кеша. Ниже приведен фрагмент конфига, учитывающий сразу все необходимое.

Settings

Apache

На переносим web-сервер на внутренний сетевой интерфейс и другой порт, он будет недоступен снаружи.

httpd.conf, apache.conf
#Listen *:80
Listen 127.0.0.1:8000

#Listen *:443
Listen 127.0.0.1:8443
Nginx

В основном когфиге декларируем виртутальные хосты и использемые порты и протоколы. Поддержка IPv6 включается отдельной директивой. Также есть смысл принудительно переводить клиентов на https (см. rewrite)

nginx.conf
    # cache settings
    proxy_cache_path /var/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g 
                 inactive=60m use_temp_path=off;

    # HTTP
    server {
        #ipv6 support
        listen [::]:80;
        listen       80;
        #server_name  my.site.net;
        # here we allow ALL server names for virtual hosts support
        server_name  ~^.*$;

        # force redirect to https
        #rewrite ^ https://$http_host$request_uri? permanent;

        #access_log  /dev/null;
        access_log  /var/log/my-nginx.log;
        include my-cached-site.conf;
    }

    # HTTPS
    server {
        #ipv6 support
        listen [::]:443 ssl;
        listen       443 ssl;
        #server_name  my.site.net;
        server_name  ~^.*$;

        include https.conf;

        #access_log  /dev/null;
        access_log  /var/log/my-nginx.log;
        include my-cached-site.conf;
    }

    ssl_certificate      /etc/ssl/apache/my_site.crt;
    ssl_certificate_key  /etc/ssl/apache/my_site.key;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

Обработка различных секций сайта. Эти настройки одинаковы для http и https, поэтому выносим их в отдельный include-файл. Здесь указан корневой каталог для статических файлов, фильтры, настройки проксирования и кеширования динамического контента для разных разделов сайта. Порядок следования секций location значения не имеет, выбирается наиболее соответствующая запросу. Для proxy-запросов нельзя использовать регулярные выражения в условии. Подробнее почитать о директиве location есть смысл на www.digitalocean.com и www.keycdn.com

my-cached-site.conf
	root /var/www/my_site/;
#	index index.php index.html;

        # deny what user should not see
        location ^~ /.ht {
            deny  all;
            return 404;
        }

        # forward dynamic content to cache/apache
        location / {
            proxy_pass http://127.0.0.1:80/;
            include cache-proxy_pass.conf;
        }
        location /images/img.php {
            proxy_pass http://127.0.0.1:80/;
            include cache-proxy_pass.conf;
        }

        # handle static content with proper cache settings
        location /css/ {
	  expires 1M;
	  access_log /dev/null;
	  add_header Cache-Control "public";
        }
        location /js/ {
	  access_log /dev/null;
	  add_header Cache-Control "public";
        }

        location /images/ {
	  expires 1y;
	  access_log /dev/null;
	  add_header Cache-Control "public";
        }

        location ~* \.(xml|m3u|ico)$ {
	  expires 1d;
	  access_log /dev/null;
	  add_header Cache-Control "public";
        }

Запрещаем gzip, т.к. он не совместим с директивами кеширования и передаем необходимые заголовки веб-серверу (apache). proxy_set_header - от клиента, proxy_pass_header - к клиенту.

my-cached-site.conf
    # gzip is not compatible with cache-control/etag
    gzip off;
    proxy_cache alfa_cache;
    proxy_buffering on;
    proxy_cache_revalidate on;
    proxy_cache_min_uses 3;
    proxy_cache_use_stale error timeout updating http_500 http_502
                               http_503 http_504;

    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;
    proxy_set_header If-None-Match $http_if_none_match;
    proxy_set_header If-Modified-Since $http_if_modified_since;

    proxy_pass_header Set-Cookie;
    proxy_pass_header ETag;
    proxy_pass_header Cache-Control;

2018.05.31

См. также:




FB or mail alterX@alter.org.ua (remove X)   Share
<< Back Автор: Alter (Александр А. Телятников) Сервер: Apache+PHP под FBSD © 2002-2024