Trafik patlamalarında 'worker_connections are not enough' ve '502 Bad Gateway' hatalarını engelleyin; vCPU çekirdeği, RAM ve reverse proxy çarpanına göre ideal Nginx ve Linux çekirdek sınırlarını hesaplayın.
Nginx worker_processes auto ile tüm çekirdeklere dağıtılır.
Reverse proxy modunda her istemci isteği için arka plana ikinci bir TCP soketi açılır (FD katsayısı: 2.5x).
Kilitlenmeden aynı anda servis verilebilecek aktif istemci
İşlemci başına eşzamanlı epoll soket tavanı
"Too many open files" hatasını önleyen dosya sınırı
Toplam RAM'in %5 kadarı (tcp buffer)
# Nginx Yüksek Eşzamanlılık (High Concurrency) Optimizasyonu
# /etc/nginx/nginx.conf ana yapılandırma dosyası
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
events {
worker_connections 16384;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Çekirdek Seviyesi Sıfır Kopyalama ve Hızlı Yanıt
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Bağlantı Zaman Aşımı ve Keep-Alive Yönetimi
keepalive_timeout 65;
keepalive_requests 10000;
reset_timedout_connection on;
client_body_timeout 15;
send_timeout 15;
# Buffer ve Hash Tablosu Ayarları
types_hash_max_size 2048;
server_names_hash_bucket_size 128;
client_max_body_size 64M;
}
Varsayılan bir Nginx kurulumunda worker_connections 512 veya 1024 olarak gelir. Ancak Nginx bir Reverse Proxy (PHP-FPM, Node.js, Python Gunicorn, Go upstream) olarak çalışıyorsa, gelen her bir ziyaretçi isteği için biri istemciye, diğeri arka uç servisine olmak üzere en az 2 ayrı TCP soketi tüketilir. Bu da 1024 bağlantı sınırının aslında yalnızca ~500 eşzamanlı kullanıcıda tükenmesi ve yeni gelenlerin kapıda reddedilmesi anlamına gelir.
Linux işletim sisteminde her TCP soketi bir dosya tanımlayıcısıdır (file descriptor). Nginx'in worker_connections değerini 16.384 yaptığınızda, eğer worker_rlimit_nofile ve /etc/security/limits.confiçerisindeki dosya sınırı yükseltilmezse Nginx loglarında derhal"24: Too many open files" hatası patlak verir. Altın kural: worker_rlimit_nofile >= worker_connections * 2 olmalıdır.
Bir reklam kampanyası veya flaş indirim (flash sale) anında aynı anda 5.000 yeni istek geldiğinde, Nginx bu istekleri kabul edene kadar bağlantılar Linux çekirdeğinin dinleme kuyruğunda (listen backlog) bekletilir. Linux'un varsayılan net.core.somaxconn = 128 veya 4096 değeri çok küçüktür. Kuyruk dolduğu anda yeni istekler sessizce çöpe atılır (TCP drop) ve kullanıcılar "Bağlantı Zaman Aşımına Uğradı" hatası görür. Çekirdek kuyruğunu 65535 seviyesine çekmek bu darboğazı tamamen ortadan kaldırır.
Yoğun API veya mikroservis trafiğinde istemciler bağlantıyı kapattığında soketler 60 saniye boyunca TIME_WAIT durumunda kalır. Linux varsayılan geçici port aralığı (~28.000 port) dakikalar içinde tükenerek yeni giden isteklere engel olabilir.net.ipv4.tcp_tw_reuse = 1 ve port aralığını 10240 65535olarak genişletmek, soketlerin güvenle yeniden kullanılmasını sağlar.