Avem un serviciu web în spatele unui server HAProxy care rulează stocarea în cache proxy invers configurație. Serverele backend trimit Cache-Control
antetele corect pentru toate răspunsurile, astfel încât HAProxy să poată stoca în cache toate răspunsurile conform specificațiilor HTTP.
Cu toate acestea, atunci când utilizatorul final apasă butonul Shift+Reîncărcare de ex. Google Chrome, clientul (Chrome) trimite Pragma: fără cache
și Cache-Control: fără cache
ceea ce obligă HAProxy să preia întotdeauna cererea de la serverul backend. Evident, atacurile DDoS pot folosi același truc pentru a provoca cu ușurință mai multă încărcare pe serverele backend.
Deoarece știm că anteturile cache-ului sunt corecte, cum putem configura HAProxy să ignore clientul trimis Pragma: fără cache
și evitați apelarea backend-ului atunci când solicitarea ar putea fi îndeplinită direct din memoria cache HAProxy?
Știu că ignorarea acestui antet nu ar fi în regulă pentru o utilizare proxy generică, dar în acest caz controlăm atât proxy-ul invers, cât și backend-ul, așa că știm că este bine.
Iată un exemplu de răspuns de la serverul backend care va fi reluat de la backend atunci când clientul trimite cache-control: fără cache
și pragma: fără cache
:
cache-control: public, max-age=31536000, s-maxage=31536000
lungimea conținutului: 463
tip de conținut: imagine/svg+xml
data: joi, 24 iunie 2021 14:14:19 GMT
etag: "338"
expiră: vineri, 24 iunie 2022 14:14:19 GMT
server: Apache
x-content-type-options: nosniff
Este evident intru totul inutil să preluăm din nou acest lucru de la serverele backend, deoarece este valabil timp de un an pentru orice utilizator care folosește adresa URL dată. De asemenea, merită remarcat faptul că NGINX nu onorează antetul Pragma [client] în mod implicit.