Am probleme cu redimensionarea și stocarea în cache a imaginilor. Iată configurarea mea neperformantă fără cache:
- Clientul face o cerere pentru website.com/static/image.jpeg
- Rute NGINX către API
- API-ul autentifică utilizatorul, generează adresa URL presemnată S3, returnează 302
- NGINX se ocupă de redirecționare, redimensionează imaginea, returnează imaginea utilizatorului, ignorând adresa URL presemnată
Sunt capabil să fac ambele redimensionări ale memoriei cache, dar memoria cache este interogată înainte de autentificare. Deci, dacă utilizatorul 1 se autentifică și utilizatorul neautentificat 2 solicită același material cu aceleași dimensiuni, îl primește. Iată cum arată (vezi Configurația 2, mai jos):
- Clientul solicită imaginea
- Serverul 1 memorează cache, proxy_passes la Server 2
- Serverul 2 proxy_passes la API
- API se autentifică, generează adresa URL presemnată, returnează 302
- Serverul 2 se ocupă de redirecționare, redimensionează și revine la utilizator
Iată ce vreau să fac, dar simt că mă lupt cu sintaxa
- Clientul solicită imaginea
- Serverul 1 proxy_passes la API
- API se autentifică, generează adresa URL presemnată, returnează 302
- Serverul 1 gestionează redirecționarea, va stoca în cache răspunsul după redimensionare (folosind cererea clientului ca cheie de cache), redirecționează/proxy_passes la serverul 2
- Serverul 2 se redimensionează
Cum pot să îmi protejez corect activele și să redimensionez/memorez în cache activele?
Iată configurația 2:
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=nginx_cache:100M max_size=1G inactiv=40d;
Server
{
asculta 80;
nume_server api.example.com;
server_tokens dezactivat;
locație /.well-cunoscut/acme-challenge/
{
root /var/www/certbot;
}
Locație /
{
returnează 301 https://$host$request_uri;
}
}
Server
{
asculta 443 ssl;
nume_server api.example.com;
server_tokens dezactivat;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
includ /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
locație /api
{
proxy_pass http://example-api:8080;
proxy_set_header Gazdă $http_host;
proxy_set_header X-Real-IP $adresă_la distanță;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
locatie /static/
{
proxy_pass http://127.0.0.1:10177/;
proxy_cache nginx_cache;
proxy_cache_key â$proxy_host$uri$is_args$argsâ;
proxy_cache_valid 1d;
expiră 1d;
}
}
Server
{
asculta 10177;
nume_server s3;
Locație /
{
proxy_connect_timeout 5m;
proxy_send_timeout 5m;
proxy_read_timeout 5m;
client_max_body_size 20M;
proxy_set_header Gazdă $http_host;
proxy_set_header X-Real-IP $adresă_la distanță;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_max_temp_file_size 0;
proxy_redirect dezactivat;
proxy_pass http://example-api:8080/int/static/;
proxy_ssl_server_name activat;
recursive_error_pages on;
proxy_intercept_errors activat;
error_page 301 302 307 = @handle_redirect;
}
## Serverul API a acordat utilizatorului acces la media
## Redirecționați către o adresă URL AWS S3 presemnată către media
locație @handle_redirect
{
rezolutor 8.8.8.8; # Avem nevoie de NGINX pentru a putea rezolva adresa URL AWS
setați $saved_redirect_location '$upstream_http_location'; # Salvați locația URL la care redirecționează API-ul
setați $saved_request_id '$upstream_http_x_request_id'; # Salvați ID-ul de solicitare returnat de la serverul API
## Suprascrieți expirarea conexiunii
proxy_connect_timeout 5m;
proxy_send_timeout 5m;
proxy_read_timeout 5m;
## Înlocuiți anteturile cererii către AWS la ceea ce se așteaptă S3
proxy_http_versiunea 1.1;
proxy_set_header Conexiune „”;
## Asigurați-vă că trimitem informațiile corecte despre client către serverul API și nu
## serverul NGINX
proxy_set_header X-Real-IP $adresă_la distanță;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
## Ignorați orice informație de autentificare, astfel încât AWS să se poată autentifica de la adresa URL semnată
proxy_set_header Autorizare '';
## Ascundeți toate anteturile pe care le returnează AWS pentru a nu reveni la client
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-meta-...;
proxy_hide_header x-amz-server-side-encryption;
## Nu dorim ca AWS să seteze informații despre cookie-uri
proxy_hide_header Set-Cookie;
proxy_ignore_headers Set-Cookie;
## Asigurați-vă că anulați/ascundeți orice solicitare de autorizare de la AWS, astfel încât clientul să nu primească un pop-up enervant
proxy_hide_header Autorizare WWW;
proxy_hide_header Autorizare;
## Faceți cererea către AWS utilizând adresa URL presemnată
proxy_pass $saved_redirect_location;
## Interceptați orice erori pe care le returnează AWS
proxy_intercept_errors activat;
error_page 301 302 307 = @handle_redirect; # Gestionați o redirecționare de la AWS (adică numele domeniului bucket)
setați $width 1024;
dacă ($arg_w ~ /(\d+)/)
{
setați $lățime $1;
}
image_filter redimensionează $width -;
imagine_filter_jpeg_quality 75;
imagine_filter_buffer 8M;
}
}