Nginx

Statik saytga xizmat ko'rsatish

Nginx'ning eng asosiy va eng ko'p ishlatiladigan vazifasi โ€” statik saytga xizmat ko'rsatish. Ya'ni disk'da yotgan HTML, CSS, JavaScript fayllar va rasmlarni brauzerga uzatish. Ushbu darsda oddiy statik saytni to'liq sozlashni, try_files, 404 sahifasi, gzip siqish va keshlashni batafsil o'rganamiz.

Oddiy statik sayt uchun config

Faraz qilaylik, saytimiz fayllari /var/www/mysite papkasida (ichida index.html, style.css va h.k.). Eng sodda config quyidagicha:

server {
    listen 80;
    server_name mysite.com www.mysite.com;

    root /var/www/mysite;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Bu config'ni /etc/nginx/sites-available/mysite fayliga saqlab, keyin uni faollashtiramiz:

sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
sudo nginx -t
sudo nginx -s reload

root va index'ni tushunish

root โ€” bu saytning "ildiz" papkasi. Brauzerdan kelgan yo'l shu papkaga qo'shiladi:

index esa papka so'ralganda (fayl nomi ko'rsatilmaganda) qaysi faylni ochishni bildiradi. index index.html; bo'lsa, / so'ralganda /var/www/mysite/index.html qaytariladi.

root va index ni server darajasida bir marta yozsangiz, ular ichdagi barcha location bloklariga ta'sir qiladi. Bu takrorlashning oldini oladi.

try_files direktivasi

try_files โ€” statik sayt uchun eng muhim direktivalardan biri. U Nginx'ga bir nechta variantni navbat bilan sinab ko'rishni buyuradi. Birinchi topilgan faylni qaytaradi:

try_files $uri $uri/ =404;

Bu qatordagi har bir bo'lak alohida ma'noga ega:

$uri โ€” bu Nginx'ning ichki o'zgaruvchisi: u joriy so'rov yo'lini bildiradi. Nginx'da bunday o'zgaruvchilar $ belgisi bilan boshlanadi (masalan, $host, $remote_addr).

Agar bu bir sahifali ilova (SPA โ€” React/Vue) bo'lsa, marshrutlashni ilovaning o'zi boshqaradi. Bunda try_files $uri $uri/ /index.html; yoziladi โ€” topilmagan har qanday yo'l uchun index.html qaytariladi, ilova esa sahifani o'zi ko'rsatadi.

location bilan yo'llarni boshqarish

Turli fayl turlariga turli qoidalar berish uchun location ishlatamiz. Masalan, rasm va statik resurslarni alohida ajratish:

server {
    listen 80;
    server_name mysite.com;
    root /var/www/mysite;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    # rasm, css, js kabi statik fayllar uchun alohida qoida
    location ~* \.(jpg|jpeg|png|gif|css|js|ico|svg)$ {
        expires 30d;
        access_log off;
    }
}

Bu yerda ~* โ€” registrga sezgir bo'lmagan regulyar ifoda mosligi. Ya'ni .jpg ham, .JPG ham mos keladi.

Maxsus 404 sahifasi

Foydalanuvchi mavjud bo'lmagan sahifani so'raganda standart, quruq 404 o'rniga o'zingizning chiroyli sahifangizni ko'rsatishingiz mumkin. Buning uchun error_page direktivasidan foydalanamiz:

server {
    listen 80;
    server_name mysite.com;
    root /var/www/mysite;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    # 404 xatoligida maxsus sahifani ko'rsatish
    error_page 404 /404.html;

    location = /404.html {
        internal;
    }
}

Bu yerda error_page 404 /404.html; โ€” 404 xatolik yuz berganda /404.html faylini ko'rsatishni buyuradi. location = /404.html { internal; } esa bu sahifaga faqat Nginx ichidan (foydalanuvchi to'g'ridan-to'g'ri emas) kirilishini ta'minlaydi.

Xuddi shu tarzda server xatoliklari (500, 502, 503, 504) uchun ham maxsus sahifa berish mumkin: error_page 500 502 503 504 /50x.html;

gzip siqishni yoqish

gzip โ€” matnli fayllarni (HTML, CSS, JS, JSON) brauzerga uzatishdan oldin siqib, hajmini kichraytiradigan mexanizm. Bu sahifa yuklanishini sezilarli tezlashtiradi, chunki tarmoq orqali kamroq ma'lumot yuboriladi. Odatda http kontekstida yoqiladi:

http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
    gzip_min_length 1000;
    gzip_comp_level 5;
}
gzip'ni yoqish saytning tezligiga eng sodda va samarali ta'sir qiluvchi optimizatsiyalardan biri. Odatda HTML/CSS/JS fayllar hajmini 60-80% ga kamaytiradi.

Kesh sarlavhalari

Rasm, CSS va JS kabi kamdan-kam o'zgaradigan fayllarni brauzer o'z xotirasida (keshda) saqlab, keyingi tashriflarda serverdan qayta so'ramasligi mumkin. Buni expires direktivasi orqali sozlaymiz:

location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}
Uzoq muddatli keshlashning bir muammosi bor: agar CSS/JS faylni yangilasangiz, brauzer eski nusxani ko'rsatishda davom etishi mumkin. Buning yechimi โ€” fayl nomiga versiya qo'shish (masalan, style.v2.css yoki style.css?v=2). Zamonaviy qurish vositalari (build tools) buni avtomatik bajaradi.

To'liq namuna

Yuqoridagi barcha elementlarni birlashtirgan to'liq, ishlatishga tayyor server bloki:

server {
    listen 80;
    server_name mysite.com www.mysite.com;

    root /var/www/mysite;
    index index.html;

    # asosiy marshrutlash
    location / {
        try_files $uri $uri/ =404;
    }

    # statik resurslarni uzoq muddat keshlash
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
        access_log off;
    }

    # maxsus xato sahifalari
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    # gzip (agar http blokida yoqilmagan bo'lsa)
    gzip on;
    gzip_types text/css application/javascript application/json;
}

Xulosa