Nginx'te gzip sıkıştırma, tarayıcı önbelleği ve istek sınırlama

Nginx ve Web Sunucusu 65 görüntülenme Markdown

Nginx'in varsayılan ayarı çalışır ama sitenizi hızlandıracak ve koruyacak birkaç küçük ekleme yapılabilir. Aşağıdakilerin hepsi Nginx 1.24'te sözdizimi denetiminden geçirilmiştir (nginx -t); yine de her değişiklikten önce kendi sunucunuzda sınayın.

1. gzip sıkıştırma

Metin tabanlı dosyalar (HTML, CSS, JavaScript, JSON) sıkıştırıldığında çoğunlukla 3 ila 5 kat küçülür. http bloğuna ekleyin (Ubuntu'da /etc/nginx/nginx.conf; zaten kısmen açık gelebilir):

gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types text/css application/javascript application/json image/svg+xml text/plain application/xml;

Görseller (JPEG, PNG, WebP) zaten sıkışık olduğu için bu listede yer almaz; onları tekrar sıkıştırmak CPU harcar ve kazanç sağlamaz. Doğrulama: curl -sI -H "Accept-Encoding: gzip" https://ornek.com/ | grep -i content-encoding komutu gzip göstermeli.

2. Statik dosyalar için tarayıcı önbelleği

Değişmeyen dosyaların (görsel, CSS, yazı tipi) ziyaretçinin tarayıcısında bir süre saklanmasını söyleyin; bu ikinci ziyareti hızlandırır:

location ~* \.(css|js|jpg|jpeg|png|gif|svg|webp|woff2)$ {
    expires 30d;
    add_header Cache-Control "public";
}

CSS ya da JS dosyasını güncellediğinizde ziyaretçinin eski sürümü görmesini önlemek için dosya adına sürüm ekleyin (stil.css?v=12) ya da expires süresini kısa tutun. PHP sayfalarını (dinamik içerik) bu şekilde saklamayın.

3. İstek sınırlama (limit_req)

Bir adresin belirli bir yolu çok sık çağırmasını yavaşlatır. Önce http bloğunda bir bölge tanımlayın:

limit_req_zone $binary_remote_addr zone=giris:10m rate=5r/m;

Sonra korumak istediğiniz yolda kullanın (giriş sayfası gibi):

location = /wp-login.php {
    limit_req zone=giris burst=3 nodelay;
    include /etc/nginx/snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

Bu, adres başına dakikada 5 isteğe (ve 3 ek istek toleransına) izin verir; fazlası 503 ile reddedilir. Oranı gerçek kullanımınıza göre ayarlayın; fazla düşük tutarsanız meşru kullanıcıları da yavaşlatırsınız. WordPress saldırılarıyla ilgili bütünsel çözüm: giriş saldırılarını engelleme.

4. Bir bölümü parolayla korumak

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd ayse

Ardından korumak istediğiniz yola ekleyin:

location /yonetim/ {
    auth_basic "Yonetim";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

Basic auth parolayı şifrelemeden gönderir; yalnızca https üzerinde kullanın.

5. Gizli dosyaları gizleyin

location ~ /\.(?!well-known) {
    deny all;
}

Bu kural .git, .env gibi nokta ile başlayan dosyalara erişimi engeller, ama Let's Encrypt doğrulamasının kullandığı .well-known klasörünü açık bırakır. Bir kuralın yanlışlıkla fazla şeyi engellediği durumlar için: 403 Forbidden.

Uygulama

Ayarları ekledikten sonra sudo nginx -t && sudo systemctl reload nginx. Etkisini ölçmek için siteyi önce ve sonra ölçün: yavaşlık ölçümü. Nginx günlüklerinde sonuçları izleyin: erişim günlüğü okuma.

Sık sorulanlar

gzip sitemi güvensiz yapar mı?

HTTPS üzerinde gizli ve değişken içerik (örneğin CSRF belirteci içeren sayfalar) sıkıştırıldığında BREACH adlı saldırı kuramsal olarak mümkündür. Normal bir web sitesi için gzip standart ve güvenli kabul edilir; hassas sayfalarda uygulama çerçevenizin önerilerine bakın.

expires 30d güncellemeleri geciktirmez mi?

Dosya adı aynı kalırsa ziyaretçi eski dosyayı 30 güne kadar görebilir. Sürümlü dosya adı kullanın ya da süreyi kısa tutun.

limit_req 503 yerine başka kod dönebilir mi?

Evet; limit_req_status 429; ile 429 (Too Many Requests) döndürebilirsiniz, bu botlara ve izleme araçlarına daha anlamlı bir mesaj verir.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.