nginx истекает заголовок и обратный прокси не работает


Я пытаюсь настроить заголовок Expires для статических файлов на nginx (0.7.67). Статические файлы подаются с обратного прокси Golang:

location /rev/ {
  proxy_pass http://localhost:8910/;
  proxy_redirect off;
  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  https;

  # I am putting this here, because nginx only uses one location. Is this OK?
  location ~* .(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
    expires 30d;
  }
}

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

Я уже пробовал следующее созвездие, но оно не работает:

server {
  ...
  location /rev/ {
    proxy_pass http://localhost:8910/;
    proxy_redirect off;
    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  https;
  }

  location ~* .(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
      expires 30d;
  }
}

Вопрос : Как я могу применить заголовок expires для статических файлов, которые находятся в приложении за реверсом доверенность?

3 2

3 ответа:

Единственный способ, которым мне удалось это сделать, был такой:

location / {
    proxy_pass  http://tomcat;
}

# CACHING WITH NO LOGGING
location ~* ^.+\.(atom|bmp|bz2|doc|docx|eot|exe|gif|gz|ico|jpeg|jpg|mid|midi|mp4|ogg|ogv|otf|pdf|png|ppt|pptx|rar|rss|rtf|svg|svgz|swf|tar|tgz|ttf|txt|wav|woff|xls|zip)$ {
    access_log  off;
    log_not_found   off;
    expires     max;
    proxy_pass  http://tomcat;
}

# CACHING WITH 404 LOGGING
location ~* ^.+\.(css|js|xml)$ {
    access_log  off;
    log_not_found   on;
    expires     max;
    proxy_pass  http://tomcat;
}

Надеюсь, это поможет!

Из чтения документов в http://wiki.nginx.org/HttpProxyModule я нахожу упоминания об использовании директив proxy_cache_* для достижения аналогичной функциональности, хотя и не совсем то, что вы ищете. Документы утверждают, что:

Upstream cache-related directives have priority over proxy_cache_valid value,
in particular the order is:

X-Accel-Expires
Expires/Cache-Control
proxy_cache_valid

Таким образом, кажется, что установка заголовка Expires на уровне прокси не поддерживается или не рекомендуется.

У меня такое чувство, что вы должны установить Заголовок Expires вверх по потоку. Это можно сделать в Go (немного по-хамски, я уверен, что есть более приятный способ чтобы исправить часовой пояс в строке), установив заголовок на http.ResponseWriter в функции обработчика http:

w.Header().Set("Expires", strings.Replace(time.Now().AddDate(0, 0, 30).Format(time.RFC1123), "UTC", "GMT", 1))

Как было указано ранее, это заменяет UTC на GMT в выходной строке. Я не уверен, что это необходимо, но я заметил, что это, кажется, обычная форма в любых HTTP-заголовках, которые я проверил. Я не смотрел спецификацию, чтобы увидеть, будут ли UTC одинаково приняты браузерами, но я не вижу, почему бы и нет.

Жаль, что это не совсем ответ Nginx, надеюсь это помогает!

Я думаю, что Директива expires или add_header - это то, что вы возвращаете в браузер.

Если вы слепо хотите кэшировать то, что приходит из бэкенда, вы можете попробовать:

proxy_cache_valid any 1m;

Http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid