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 ответа:
Единственный способ, которым мне удалось это сделать, был такой:
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