Назад | Перейти на главную страницу

nginx - как получить наследование сервера / добавление заголовков кеширования на различные сайты с обратным проксированием

У меня около 5 сайтов, работающих на разных портах через обратный прокси-сервер и доступных в разных поддоменах. Некоторые из этих сайтов сами устанавливают срок действия (заголовок / cache-control max age) и не требуют управления этим, однако некоторые этого не делают.

Для тех, которых я не делаю, я хочу указать срок действия статического содержимого (согласно https://github.com/h5bp/server-configs/blob/master/nginx.conf), однако я не могу найти способ сделать это без дублирования этой логики на каждом сервере. Я знаю, что для одного сервера я могу сделать это так:

 server {
listen 80;

server_name sub.domain.com;

location \ {
    proxy_pass  http://localhost:1234/;
}

# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html|xml|json)$ {
  proxy_pass    http://localhost:1234/;
  expires -1;
  access_log logs/static.log;
}

# Feed
location ~* \.(?:rss|atom)$ {
  proxy_pass    http://localhost:1234/;
  expires 1h;
  add_header Cache-Control "public";
}

# Favicon
location ~* \.ico$ {
  proxy_pass    http://localhost:1234/;
  expires 1w;
  access_log off;
  add_header Cache-Control "public";
}

# Media: images, video, audio, HTC, WebFonts
location ~* \.(?:jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm)$ {
  proxy_pass    http://localhost:1234/;
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

# CSS and Javascript
location ~* \.(?:css|js)$ {
  proxy_pass    http://localhost:1234/;
  expires 1Y;
  access_log off;
  add_header Cache-Control "public";
}
}

Это отстой, потому что:

Если у меня есть 2 сайта, которые требуют этого, у меня, кажется, нет другого выбора, кроме как дублировать все это, меняя proxy_pass для каждого местоположения.

Есть ли способ добиться «напиши один раз, используй много» для логики истечения срока действия заголовка (и proxy_pass)?

nginx может выполнять включение, с include path-to-file; разметка.

Вы также можете использовать if вместо определения местоположения этого случая, поэтому я бы попробовал что-то вроде этого:

server {
    listen 80;
    server_name sub.domain.com;

    location / {
        if ( $uri ~* \.(?:manifest|appcache|html|xml|json)$ ) {
            expires -1;
            access_log logs/static.log;
        }

        if ( $uri ~* \.(?:rss|atom|ico|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm|css|js) ) {
            add_header Cache-Control "public";
        }

        if ( $uri ~* \.(?:ico|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm|css|js) ) {
            access_log off;
        }

        if ( $uri ~* \.(?:rss|atom) ) {
            expires 1h;
        }

        if ( $uri ~* \.(?:ico) ) {
            expires 1w;
        }

        if ( $uri ~* \.(?:jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|eot|mp4|ogg|ogv|webm) ) {
            expires 1M;
        }

        if ( $uri ~* \.(?:css|js) ) {
            expires 1Y;
        }

        try_files @proxy;
    }

    location @proxy {
        proxy_pass  http://localhost:1234/;
    }
}

Я не могу сейчас проверить это, но с небольшими изменениями это должно работать.