Кэширование обратного прокси Nginx с перезаписью URL
Я обслуживаю большие статические файлы с внутреннего сервера хранения с медленно вращающимися дисками. Этот сервер скрыт за быстрым обратным прокси-сервером nginx с локальным кешем на SSD. Работает отлично и быстро.
Теперь я хочу изменить серверную часть хранилища, и в результате я не могу сохранить то же расположение хранимых файлов на серверной части. Вместо корневого сервера они должны обслуживаться из подкаталога. Как я могу изменить конфигурацию обратного прокси-сервера nginx так, чтобы он передавал все не кэшированные запросы на бэкэнд в подкаталог, и клиенты не знали, что что-то изменилось?
Я не могу ничего сделать на сервере хранения, чтобы поддерживать старую схему URL, поэтому я должен сделать это на внешнем интерфейсе. Нет заголовков 301/302, как предполагается, должны быть переданы в любом месте.
Итак, в настоящее время у меня есть:
- Клиент видит: https://frontend.com/file.txt
- Nginx извлекает некэшированные файлы с: https://backend.com/file.txt
Чего я хочу добиться:
- Клиент видит: https://frontend.com/file.txt (нет видимых изменений в клиенте)
- Nginx извлекает некэшированные файлы из: https://backend.com/directory/file.txt
Я перепробовал множество десятков конфигураций, но не повезло. Когда я пробую эту конфигурацию - вместо того, чтобы молча извлекать данные с другого URL, это заканчивается бесконечным циклом добавления теста через регулярное выражение.
location / {
rewrite /(.*) /test/$1 break;
proxy_pass http://f002.backblazeb2.com;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_cache_revalidate on;
proxy_read_timeout 2;
proxy_connect_timeout 3;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_cache_valid 200 302 60s;
proxy_cache_valid 404 1m;
limit_conn perip 23;
limit_req zone=dynamic burst=60;
expires 24h;
}
1 ответ
Сработало следующее:
server {
listen 80;
listen [::]:80;
server_name blablabla.com;
proxy_cache one;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate ....;
ssl_certificate_key ....;
location / {
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
proxy_pass https://f002.backblazeb2.com/file/some-directory/;##$request_uri appended automatically
[...]
}
Следующее должно работать:
location / {
proxy_pass http://f002.backblazeb2.com/test$request_uri;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_cache_revalidate on;
proxy_read_timeout 2;
proxy_connect_timeout 3;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_cache_valid 200 302 60s;
proxy_cache_valid 404 1m;
limit_conn perip 23;
limit_req zone=dynamic burst=60;
expires 24h;
}