nginx web sunucu performansını optimize etmek için gzip sıkıştırma, proxy_buffer ayarları, worker ve keep-alive ayarları gibi temel ayarları ele aldık.
Özellikle, veri aktarım miktarını azaltmak ve sunucu yükünü en aza indirgemek için gzip sıkıştırma ve proxy_buffer tamponlama ile worker süreçleri ve keep-alive ayarları aracılığıyla bağlantı yönetiminin önemini vurguladık.
Sunucu ortamına uygun en iyi ayarları uygulamak ve istikrarlı sunucu çalışması için dikkat edilmesi gereken hususları sunmak amacıyla çeşitli testler gerçekleştirdik.
Nginx, açık kaynak kodlu bir web sunucusu veya web proxy sunucusu olarak sıkça kullanılır.
Doğru yapılandırıldığında statik içeriği verimli bir şekilde sunabilir.
Bu makalede, bazı önemli ayarlarını kaydetmek istiyorum.
Performansla İlgili Bazı Önemli Ayarlar
1. gzip Sıkıştırma
Bir web sitesini yüklediğinizde, web sunucusundan JavaScript, resim, HTML, CSS gibi birçok dosya indirirsiniz.
Bu içeriği ham halde göndermek yerine, gzip sıkıştırmasını kullanarak iletilen veri miktarını önemli ölçüde azaltabilirsiniz.
Yani, bunu uyguladığınızda;
- Veri miktarı azalır ve bant genişliğinden tasarruf edilir.
- Sunucu kaynaklarından tasarruf edilebilir.
- Kullanıcı açısından, gerçek yükleme hızı artar.
Öte yandan, sunucu içeriği yanıtlamadan önce gzip sıkıştırmasını gerçekleştirmelidir; bu nedenle sunucunun CPU yükü artabilir.
Hangi dosya türlerinin sıkıştırılacağı, sıkıştırma seviyesi ve ne kadar büyük dosyaların sıkıştırılacağı gibi hususlar, üretim ortamına uygulamaya geçmeden önce mutlaka test edilmelidir.
İşte gzip ile ilgili bazı ayarlar:
gzip on; # gzip sıkıştırmasını etkinleştirir.
gzip_vary on; # Başlığa Vary: Accept-Encoding ekler.
gzip_proxied any; # Nginx proxy sunucusu olarak kullanılıyorsa, arka uçtan gelen yanıtı sıkıştırır (proxylenmiş istekler için sıkıştırma).
gzip_min_length 256; # 256 bayttan büyük dosyaları sıkıştırır.
gzip_comp_level 5; # 1-9 arasında sıkıştırma seviyesi ayarlanır. Seviye yükseldikçe CPU kullanımı artar. 5 yaklaşık %50 sıkıştırma sağlar.
gzip_types text/plain text/css text/xml application/json application/javascript;
// Sıkıştırılacak içerik türleri ayarlanır.
* gzip_vary, istemcinin gzip'i destekleyip desteklemediğine bağlı olarak içeriği sıkıştırılmış ve sıkıştırılmamış versiyonlarda gönderebilmeyi sağlar. (İstemcinin istek başlığında (Accept-Encoding) bulunan bilgiye göre farklı versiyonlar sunulur.)
2. proxy_buffer Ayarı
Nginx, istemciye yanıt göndermeden önce yanıtı bir tampon belleğe (buffer) kaydeder.
Web sunucusu istemciye yanıt gönderdiğinde, istemcinin hızı yavaşsa sunucu veri göndermek için beklemek zorundadır (ağ darboğazı).
Bu sırada sunucu kaynağı kullanılmaya devam eder. Bunu çözmek için tampon bellek kullanılır ve istemci işlem hızından bağımsız olarak yanıt geçici olarak işlenir. Bu, aşağıdaki avantajları sağlar:
- Sunucu yükünün optimize edilmesi
- Ağ darboğazının azaltılması
location / {
proxy_pass sunucu_url;
# Proxy tampon ayarları
proxy_buffering on; # Tampon belleği etkinleştirir.proxy_buffer_size 4k; # Tampon belleğinin boyutunu ayarlar(genellikle başlıklar için kullanılır).proxy_buffers8 4k; # Her bağlantı için tampon sayısı ve boyutu(4kb'lık 8 tane) proxy_busy_buffers_size 8k; # İstemciye yanıt gönderilirken kullanılabilecek maksimum tampon boyutu
}
※ Tampon belleğinin boyutunu çok büyük ayarlarsanız, gerçek zamanlı veri aktarımı gibi metin akışı (text streaming) gecikebilir; bu nedenle mutlaka test edilmelidir. Özellikle son zamanlarda birçok yapay zeka tabanlı hizmet ortaya çıktığı için, metin akışı sorun yaşarsanız bu ayarı mutlaka kontrol edin.
3. worker ve http Ayarları
worker'lar, istemci isteklerini işleyen işlemlerdir ve sunucunun CPU çekirdekleri başına kaç tane olacağı ayarlanabilir.
http genellikle istek - bağlantı - yanıt - bağlantı kesme şeklinde çalışır. Birden fazla istek için bağlantı kaynaklarını azaltmak amacıyla istemci bağlantıları açık tutulabilir. Bu, keep alive ayarlarıdır.
worker_processes auto; # Kullanılabilir CPU çekirdek sayısına göre otomatik ayarlanır.
worker_connections 1024; # Her worker'ın aynı anda işleyebileceği bağlantı sayısı
# keep-alive ayarları
keepalive_timeout 65;
keepalive_requests 100;
server {
listen 80;
location / {
proxy_pass sunucu_url;
}
}
Bu iki ayarı birlikte ele alma sebebimiz şu:
Eğer sunucunuzda 4 çekirdek varsa, teorik olarak mümkün olan bağlantı sayısı 1.024 * 4 = 4.096 olur.
(Kaynak veya trafik durumuna göre bu sayı tam olmayabilir)
4.096 istemci aynı anda bağlanıp 65 saniye boyunca tüm keepalive'ları kullanıyorsa,
4.097. kullanıcı bağlanmaya çalıştığında bağlantı kuramaz ve bu da yanıt gecikmesine neden olabilir.
Bu nedenle, sunucu kaynaklarının otomatik ölçeklendirme (auto scaling) gibi yöntemlerle istikrarlı olduğunu varsayarsak, olay anında yanıt gecikmesi yaşanıyorsa yukarıdaki ayarlar dolaylı olarak etki edebilir.
4. Diğer - location bloğu
proxy buffer gibi bazı ayarlar, istek URL'sine göre uygulanabilir.
* keep-alive gibi bazı ayarlar HTTP/Sunucu seviyesinde uygulanır ve blok bazında ayarlanamaz.
server { listen 80; server_name example.com;
# Varsayılan yol işleme(/)location/{ proxy_pass sunucu_url; # Tamponlama ayarları
proxy_buffering on; proxy_buffers 8 16k; proxy_buffer_size 32k; proxy_busy_buffers_size 64k;}# /test yolu işleme
location/test { proxy_pass sunucu_url2; # Tamponlama devre dışı
proxy_buffering off; # Tamponlama devre dışı(yanıt hemen gönderilir)}}
Yukarıdaki ayarlar web performansını optimize etmenize yardımcı olur. Çeşitli test senaryolarını göz önünde bulundurarak yeterince test yaptıktan sonra sunucu performansını optimize edin!
* Değiştirilen nginx ayarlarını sunucu çalışma zamanı kesintisi olmadan uygulayabilirsiniz, bu nedenle çoğunlukla güvenilirdir.