У меня проблемы с изменением размера и кэшированием изображений. Вот моя неэффективная установка без кэширования:
- Клиент делает запрос на веб-сайт.com/static/image.jpeg
- Маршруты NGINX к API
- API аутентифицирует пользователя, генерирует предварительно подписанный URL-адрес S3, возвращает 302
- NGINX обрабатывает перенаправление, изменяет размер изображения, возвращает изображение пользователю, не зная предварительно подписанного URL-адреса.
Я могу выполнить оба изменения размера кэширования, но кеш запрашивается перед аутентификацией. Таким образом, если пользователь 1 аутентифицируется, а неаутентифицированный пользователь 2 запрашивает один и тот же актив с одинаковыми размерами, они получают его. Вот как это выглядит (см. Конфигурацию 2 ниже):
- Клиент запрашивает изображение
- Кэши сервера 1, proxy_passes на сервер 2
- Сервер 2 proxy_passes к API
- API аутентифицируется, генерирует предварительно подписанный URL, возвращает 302
- Сервер 2 обрабатывает перенаправление, изменение размера и возврат пользователю
Вот что я хочу сделать, но мне кажется, что я борюсь с синтаксисом
- Клиент запрашивает изображение
- Сервер 1 proxy_passes к API
- API аутентифицируется, генерирует предварительно подписанный URL, возвращает 302
- Сервер 1 обрабатывает перенаправление, будет кэшировать ответ после изменения размера (используя запрос клиента в качестве ключа кэша), перенаправляет/прокси_проходит на сервер 2
- Сервер 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;
}
}