Nginx nedir?
Nginx, bazen yapılandırma anlamında zorlayıcı olan ancak Apache’ye göre daha hızlı ve hafif olan bir açık kaynak kodlu web sunucusu yazılımıdır.
Bu öğretici için ön koşullar
- Çalışan bir Nginx web sunucusu yazılımı kurulu sunucu
- SSH üzerinden erişilebilen tam yetkili bir kullanıcı
Worker Processes ve Worker Connection
Ayarlamamız gereken ilk iki değişken Worker Processes ve Worker Connection.
Devam etmeden önce, bu direktiflerin her birinin neyi kontrol ettiğini anlamamız gerekir.
worker_processes yönergesi Nginx için worker (işçi) sağlar. Bu yönerge, sanal sunucumuza, uygun IP ve bağlantı noktalarına bağlandıktan sonra kaç worker ortaya çıkacağını bildirmekten sorumludur. Çekirdek başına 1 worker ile işlem yürütmek yaygın kullanılan bir seçenektir. Bunun üzerindeki herhangi bir değer sisteminize zarar vermez ancak boşta kalan süreçler genelde bir işe yaramamaktadır.
worker_processes değerini neye ayarlamanız gerektiğini bulmak için, kurulumunuzdaki işlemci çekirdek miktarına bir göz atmanız gerekir. Örneğin tek çekirdekli bir sunucuya sahipsiniz. Daha büyük bir sunucuya yeniden boyutlandırırsanız, işlemci çekirdeklerinizi tekrar kontrol etmeniz ve bu değeri tekrar ayarlamanız gerekir. Bunu ise cpuinfo
ile yapabiliriz.
grep processor /proc/cpuinfo | wc -l
Diyelim ki bu komut 1
değerini döndürdü. O zaman sunucumuzdaki işlemci çekirdek miktarı bu!
worker_connections
Alt işlemlerin Nginx tarafından ne şekilde sunulabileceğini bize anlatır. Varsayılan değer genelde 768’dir; ancak, her tarayıcının genellikle en az 2 bağlantı açtığı düşünüldüğünde, bu sayı yarıya inebilir. Bu yüzden worker bağlantılarımızı tam potansiyeline göre ayarlamamız gerekir. Bir ulimit
komutu vererek işlemci çekirdeğimizin sınırlamalarını kontrol edebiliriz:
ulimit -n
Daha küçük tek işlemcili bir sunucuda bu sayı muhtemelen 1024
değeri olacaktır, bu da iyi bir başlangıç değeridir.
Yapılandırmamızı güncellemek istersek;
sudo nano /etc/nginx/nginx.conf
worker_processes 1;
worker_connections 1024;
Tamponlama (Buffer)
Yapabileceğimiz bir başka inanılmaz önemli değişiklik de buffers boyutudur. Arabellek boyutları çok düşükse, Nginx istekleri geçici bir dosyaya yazmak zorunda kalacak ve diskin sürekli olarak okunmasına, yazılmasına neden olacaktır. Burada devam ederken herhangi bir karar vermeden önce anlamamız gereken birkaç direktif daha var.
client_body_buffer_size
: İstemci arabellek boyutunu işler yani Nginx’e gönderilen POST eylemlerini. POST eylemleri genellikle form gönderimleridir.
client_header_buffer_size
: Önceki yönergeye benzer şekilde, yalnızca istemci üst bilgisi boyutunu işler. Tüm niyet ve amaçlarda, 1K genellikle bu yönerge için uygun bir boyuttur.
client_max_body_size
: Bir istemci isteğinde izin verilen maksimum boyuttur. Maksimum boyut aşılırsa, Nginx 413 hatası verir.
large_client_header_buffers
: Büyük istemci başlıkları için maksimum arabellek sayısı ve boyutudur.
Örnek yapılandırma;
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;
Zaman aşımları (Timeout)
Zaman aşımları da performansı önemli ölçüde artırabilir.
client_body_timeout
ve client_header_timeout
direktifleri bir istemci gövdesinde veya istemci başlığında bekler, bunlardan bir sunucu isteğinden sonra gönderilmek üzere timeouts sorumludur. Bir gövde veya başlık gönderilmezse, sunucu 408 hatası verir veya zaman aşımı isteğinde bulunur .
keepalive_timeout
istemci ile bağlantıları canlı tutmak için zaman aşımı atar. Basitçe söylemek gerekirse, Nginx bu süreden sonra istemci ile olan bağlantıları kapatacaktır.
Son olarak, send_timeout
, tüm yanıtların aktarımı üzerine değil, sadece iki okuma işlemi arasında kurulur; bu süreden sonra istemci hiçbir şey talep etmezse, Nginx bağlantıyı kapatacaktır.
Örnek yapılandırma;
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
Gzip Sıkıştırma
Gzip, Nginx’in ele aldığı ağ aktarımı trafik miktarını azaltmaya yardımcı olabilir. Ancak, gzip_comp_level
sunucu işlemci döngülerini boşa harcayacağından çok yüksek değer seviyelerine çıkmamaya dikkat edin.
Örnek yapılandırma;
gzip on;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/x-javascript text/xml text/css application/xml;
Statik Dosyaları Önbellekleme
Değişmeyen ve düzenli olarak sunulan dosyalar için süre sonu başlıklarını ayarlamak mümkündür. Bu yönerge Nginx sunucu bloğuna eklenebilir.
Örnek yapılandırma (365 gün için);
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
Nginx sunucularınızın kendi dosya türlerinizle eşleşmesi için yukarıdaki dizideki dosya türlerinden herhangi birini ekleyebilir ya da herhangi birini kaldırabilirsiniz.
Kayıt tutma
Nginx, sunucudaki her isteği bir günlük dosyasına kaydeder. Bunları takip etmek için analitik yazılımı kullanıyorsanız, bu işlevi kapatmak isteyebilirsiniz. Bunun için access_log
direktifini düzenlemeniz yeterlidir:
access_log off;
Dosyayı kaydedip kapatın, ardından şu komutu Nginx’i yeniden yüklemek için çalıştırın:
sudo service nginx restart
Sonuç
Neye, kime ve hangi işe göre uygun bir sunucu? Nginx mi Apache mi? Uygun şekilde yapılandırılmış bir sunucu demek aslında her zaman takip edilen ve duruma göre geliştirilen, ayarlanan sunucudur.
Yukarıdaki değişkenlerin hiçbiri her koşulda sabit değildir ve her biri benzersiz durumlara göre ayarlanmalıdır. Takip eden süreçlerde, yük dengeleme (load balancing) ve yatay ölçeklendirme (horizontal scaling) araştırmalarıyla sunucu performansınızı daha da ileriye götürmek isteyebilirsiniz. Bunlar, iyi bir sistem yöneticisinin bir sunucuya yapabileceği pek çok geliştirmeden sadece birkaçıdır.