Рейтинг:0

Изменение размера и кеширование изображения в NGINX после аутентификации и перенаправления 302

флаг lr

У меня проблемы с изменением размера и кэшированием изображений. Вот моя неэффективная установка без кэширования:

  1. Клиент делает запрос на веб-сайт.com/static/image.jpeg
  2. Маршруты NGINX к API
  3. API аутентифицирует пользователя, генерирует предварительно подписанный URL-адрес S3, возвращает 302
  4. NGINX обрабатывает перенаправление, изменяет размер изображения, возвращает изображение пользователю, не зная предварительно подписанного URL-адреса.

Я могу выполнить оба изменения размера кэширования, но кеш запрашивается перед аутентификацией. Таким образом, если пользователь 1 аутентифицируется, а неаутентифицированный пользователь 2 запрашивает один и тот же актив с одинаковыми размерами, они получают его. Вот как это выглядит (см. Конфигурацию 2 ниже):

  1. Клиент запрашивает изображение
  2. Кэши сервера 1, proxy_passes на сервер 2
  3. Сервер 2 proxy_passes к API
  4. API аутентифицируется, генерирует предварительно подписанный URL, возвращает 302
  5. Сервер 2 обрабатывает перенаправление, изменение размера и возврат пользователю

Вот что я хочу сделать, но мне кажется, что я борюсь с синтаксисом

  1. Клиент запрашивает изображение
  2. Сервер 1 proxy_passes к API
  3. API аутентифицируется, генерирует предварительно подписанный URL, возвращает 302
  4. Сервер 1 обрабатывает перенаправление, будет кэшировать ответ после изменения размера (используя запрос клиента в качестве ключа кэша), перенаправляет/прокси_проходит на сервер 2
  5. Сервер 2 изменяет размеры

Как я могу правильно защитить свои активы и изменить размер/кешировать активы?

Вот Конфиг 2:

proxy_cache_path /tmp/nginx_cache level=1:2 keys_zone=nginx_cache:100M max_size=1G inactive=40d;

сервер
{
  слушать 80;
  имя_сервера api.example.com;
  server_tokens отключены;

  местоположение /.well-known/acme-challenge/
  {
    корень /var/www/certbot;
  }

  место расположения /
  {
    вернуть 301 https://$host$request_uri;
  }

}

сервер
{
  слушать 443 ssl;
  имя_сервера api.example.com;
  server_tokens отключены;

  ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

  включить /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

  расположение /API
  {
    proxy_pass http://example-api:8080;
    proxy_set_header Хост $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  местоположение /статическое/
  {
    прокси_пароль http://127.0.0.1:10177/;

    прокси_кэш nginx_cache;
    proxy_cache_key «$proxy_host$uri$is_args$args»;
    proxy_cache_valid 1 д;
    истекает через 1 день;
  }


}

сервер
{
  слушать 10177;
  имя_сервера s3;

  место расположения /
  {
    proxy_connect_timeout 5 м;
    proxy_send_timeout 5 м;
    proxy_read_timeout 5 м;

    client_max_body_size 20M;

    proxy_set_header Хост $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_max_temp_file_size 0;

    прокси_перенаправление выключено;
    proxy_pass http://example-api:8080/int/static/;

    proxy_ssl_server_name включено;

    recursive_error_pages включено;
    proxy_intercept_errors включен;

    error_page 301 302 307 = @handle_redirect;

  }

  ## API-сервер предоставил пользователю доступ к медиа
  ## Перенаправление на предварительно подписанный URL-адрес AWS S3 на носитель
  местоположение @handle_redirect
  {
    резольвер 8.8.8.8; # Нам нужно, чтобы NGINX мог разрешить URL-адрес AWS

    установить $saved_redirect_location '$upstream_http_location'; # Сохраняем URL-адрес, на который перенаправляет API
    установить $saved_request_id '$upstream_http_x_request_id'; # Сохраняем идентификатор запроса, возвращенный сервером API

    ## Переопределить время ожидания соединения
    proxy_connect_timeout 5 м;
    proxy_send_timeout 5 м;
    proxy_read_timeout 5 м;

    ## Переопределите заголовки запросов к AWS на то, что ожидает S3
    прокси_http_версия 1.1;
    proxy_set_header Соединение "";

    ## Убедитесь, что мы отправляем правильную информацию о клиенте на сервер API, а не
    ## сервер NGINX
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    ## Переопределите любую информацию об аутентификации, чтобы AWS мог аутентифицироваться с подписанного URL-адреса
    proxy_set_header Авторизация '';

    ## Скрыть любые заголовки, которые AWS возвращает, от возврата клиенту
    proxy_hide_header x-amz-id-2;
    proxy_hide_header x-amz-meta-...;
    proxy_hide_header x-amz-шифрование на стороне сервера;

    ## Мы не хотим, чтобы AWS устанавливал какую-либо информацию о файлах cookie
    proxy_hide_header Set-Cookie;
    proxy_ignore_headers Set-Cookie;

    ## Обязательно отключите/скройте любые запросы на авторизацию от AWS, чтобы клиент не получил раздражающее всплывающее окно.
    proxy_hide_header WWW-авторизация;
    proxy_hide_header Авторизация;

    ## Сделайте запрос к AWS, используя предварительно подписанный URL
    proxy_pass $saved_redirect_location;

    ## Перехватывать любые ошибки, которые возвращает AWS
    proxy_intercept_errors включен;
    error_page 301 302 307 = @handle_redirect; # Обработка перенаправления с AWS (т. е. доменного имени корзины)

    установить ширину $ 1024;
    если ($arg_w ~ /(\d+)/)
    {
      установить ширину $1;
    }
    image_filter изменить размер $width -;
    image_filter_jpeg_quality 75;
    image_filter_buffer 8M;

  }


}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.