Nginx, hafif, yüksek performanslı ve düşük kaynak tüketimli bir web sunucusudur. Yük dengeleme, ters proxy (reverse proxy) ve statik içerik sunumunda mükemmel performans sağlar. Ancak varsayılan ayarlar, yoğun trafikli üretim ortamları için her zaman yeterli olmayabilir. Bu rehberde, Nginx performansını artırmak için kritik yapılandırma ayarlarını, örnek konfigürasyonları ve açıklamaları bulacaksınız.
- Global performans ayarlarını (worker_processes, worker_connections) nginx.conf içinde yapılır.
- Domain veya proje bazlı özelleştirmeleri site conf dosyasında yap.
- Modüler performans ayarlarını conf.d altına ekleyip yönetmek düzen açısından daha iyidir.
1 Worker Process ve Worker Connections Ayarları
Nginx’in temel performans ayarlarından biri worker process ve worker connections değerleridir.
worker_processes auto;
worker_connections 4096;
• worker_processes auto: Sunucudaki CPU çekirdek sayısına göre otomatik olarak worker process sayısını ayarlar. • worker_connections: Her worker process’in aynı anda kaç bağlantı (TCP/HTTP) kabul edebileceğini belirler.
Örnek: 4 CPU çekirdeğinde ve worker_connections 4096 ayarında teorik maksimum bağlantı = 4 × 4096 = 16384 bağlantı.
2 Gzip Sıkıştırma
Gzip ile HTTP yanıtlarını sıkıştırmak, özellikle statik dosyaların boyutunu düşürerek sayfa yükleme hızını artırır.
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
• gzip_comp_level: Sıkıştırma seviyesi (1-9 arası, 5 genelde iyi dengedir). • gzip_types: Hangi MIME türlerinin sıkıştırılacağını belirtir.
3 Keepalive Bağlantıları
Keepalive, aynı istemciden gelen çoklu isteklerin tek bir TCP bağlantısı üzerinden yapılmasını sağlar.
keepalive_timeout 65;
keepalive_requests 100;
• keepalive_timeout: Bağlantının açık kalma süresi (saniye). • keepalive_requests: Tek bir keepalive bağlantısında kabul edilecek maksimum istek sayısı.
4. Sendfile, TCP Nagle Algoritması ve Buffer Ayarları
sendfile on;
tcp_nopush on;
tcp_nodelay on;
• sendfile on: Statik dosyaların kernel üzerinden doğrudan gönderilmesini sağlar. • tcp_nopush: Paketlerin tek parça halinde gönderilmesine yardımcı olur. • tcp_nodelay: Küçük paketlerin bekletilmeden iletilmesini sağlar.
5. FastCGI Cache ve Buffer Ayarları (PHP-FPM vb.)
Dinamik içeriklerde önbellekleme büyük hız kazandırır.
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=PHP_CACHE:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout updating;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 404 1m;
• keys_zone=PHP_CACHE:100m: 100 MB’lik paylaşımlı bellek alanı ayırır. • inactive=60m: 60 dakika kullanılmayan önbellek girişi silinir. • fastcgi_cache_valid: HTTP durum kodlarına göre geçerlilik süresini belirler.
6. Limit Connections ve Rate Limiting
Yoğun isteklerde kötü niyetli trafiği sınırlamak için kullanılır.
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 50;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
limit_req zone=req_limit_per_ip burst=10 nodelay;
• limit_conn addr 50: Aynı IP’den en fazla 50 eşzamanlı bağlantı. • rate=5r/s: Saniyede 5 isteğe izin verir.
7. Statik İçerik İçin Cache-Control Başlıkları
Tarayıcı tarafında önbellekleme ile yükü azaltabilirsiniz.
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
8. HTTP/2 ve TLS Optimizasyonu
HTTP/2 etkinleştirmek paralel veri aktarımını hızlandırır.
server {
listen 443 ssl http2;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
}
9. İzleme ve Hata Ayıklama
- error_log ve access_log dosyalarını izleyin.
- Canlı istatistikler için stub_status modülünü aktif edin:
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
Sonuç
Nginx, doğru yapılandırıldığında saniyede binlerce isteği düşük CPU ve bellek kullanımıyla karşılayabilir. Bu rehberdeki worker ayarları, önbellekleme, sıkıştırma ve bağlantı optimizasyonları, yüksek trafikli siteler için güçlü bir temel sunar.
Her değişiklikten sonra:
sudo nginx -t
sudo systemctl reload nginx
komutlarını çalıştırarak yapılandırmanızı test etmeyi unutmayın.