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

Nginx кэширует обратный прокси с перезаписью URL

Я обслуживаю большие статические файлы с внутреннего сервера хранения с медленно вращающимися дисками. Этот сервер скрыт за быстрым обратным прокси-сервером nginx с локальным кешем на SSD. Работает отлично и быстро.

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

Я не могу ничего делать на сервере хранения, чтобы поддерживать старую схему URL-адресов, поэтому мне приходится делать это во внешнем интерфейсе. Заголовки 301/302 не должны никуда передаваться.

Итак, в настоящее время у меня есть:

Чего я хочу добиться:

Я перепробовал множество десятков конфигураций, но безуспешно. Когда я пробую эту конфигурацию - вместо того, чтобы молча извлекать данные с другого 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;
    }

Сработало следующее:

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;
}