Gandrīz jebkurā tīmekļa lietojumprogrammā, kas izmanto attēlus, ir nepieciešams izveidot nelielas šo attēlu kopijas, un bieži vien ir vairāki papildu attēlu formāti.
Jaunu dimensiju pievienošana esošai lietojumprogrammai arī rada zināmas galvassāpes. Tāpēc uzdevums:
Uzdevums
Apzīmēsim prasību sarakstu:
ģenerējiet jebkura formāta papildu attēlus lidojumā, neieviešot lietojumprogrammā papildu funkcionalitāti jebkurā lietojumprogrammas pastāvēšanas laikā;
Papildu attēli nav jāģenerē pēc katra pieprasījuma;
Atspējojiet iespēju ģenerēt papildu attēlus nenoteiktā formātā.
Es paskaidrošu pēdējo punktu, jo tas ir nedaudz pretrunā ar pirmo punktu. Ja jebkuru attēlu ģenerēšanu padarām atvērtu, tad vietnei ir iespējams uzbrukums, ģenerējot lielu skaitu pieprasījumu mainīt attēla izmēru bezgalīgā formātu skaitā, tāpēc šī ievainojamība ir jāaizver.
nginx instalācijas konfigurācija
Lai atrisinātu iepriekš minētās prasības, mums ir nepieciešams šāds nginx moduļu komplekts:
Moduļi ngx_http_image_filter_module и ngx_http_secure_link_module nav instalēti pēc noklusējuma, tāpēc tie ir jānorāda instalēšanas konfigurācijas stadijā nginx:
Mēs pievienojam jaunu mūsu saimniekdatora konfigurācijai vieta un vispārīgie kešatmiņas parametri:
...
proxy_cache_path /www/myprojects/cache levels=1:2 keys_zone=image-preview:10m;
...
server {
...
location ~ ^/preview/([cir])/(.+) {
# Тип операции
set $oper $1;
# Параметры изображения и путь к файлу
set $remn $2;
# Проксируем на отдельный хост
proxy_pass http://myproject.ru:81/$oper/$remn;
proxy_intercept_errors on;
error_page 404 = /preview/404;
# Кеширование
proxy_cache image-preview;
proxy_cache_key "$host$document_uri";
# 200 ответы кешируем на 1 день
proxy_cache_valid 200 1d;
# остальные ответы кешируем на 1 минуту
proxy_cache_valid any 1m;
}
Lai gan es ieteiktu arī parēķināt izmērus priekšskatījums.
Grābeklis
Dzēšot sākotnējo attēlu, priekšskatījumi, protams, netiks dzēsti no kešatmiņas, kamēr kešatmiņa nav atzīta par nederīgu, un mūsu gadījumā priekšskatījumi var pastāvēt dienu pēc dzēšanas, taču tas ir maksimālais laiks.