
VDS'de Nginx Kurulumu ve Yapılandırması: Sıfırdan Production'a
VDS sunucusunda Nginx kurulumu, PHP-FPM entegrasyonu, TLS, HTTP/2, gzip/brotli, fastcgi_cache, reverse proxy ve güvenlik ayarları adım adım.
VDS'de Nginx Kurulumu ve Yapılandırması: Sıfırdan Production'a
VDS aldınız, karşınızda sıfır sunucu. PHP-FPM bağlanacak, TLS sertifikası alınacak, trafiğin altında ezilmeyeceksiniz. Nginx kurulumu iki komut gibi görünse de asıl iş yapılandırmada: worker_processes yanlış ayarlanmış, gzip açık değil, fastcgi_cache yok — ve bunu 50K istek/saniye altında öğreniyorsunuz. Bu rehber o sürprizleri öne alıyor.
Buyukweb perspektifi: Buyukweb E5-V4 ve E5-V2 VDS paketleri unmanaged teslim edilir; Nginx kurulumu ve yapılandırması tamamen sizde. AlmaLinux 9, Ubuntu 22.04, Debian 12 seçeneklerinin tamamında resmi paket depolarından Nginx yükleyebilirsiniz. cPanel hosting paketlerimizde ise durum farklıdır: bu paketlerde LiteSpeed 6.x zaten kurulu ve aktif gelir — Apache uyumlu .htaccess direktiflerini destekler, cPanel ile tam entegre çalışır. cPanel hosting üzerinde Nginx'i ayrıca kurmaya gerek yoktur ve önerilmez — LiteSpeed zaten ondan daha hızlı çalışır ve ek yapılandırma sorun çıkarır. Bu rehberdeki her adım yalnızca VDS senaryosu içindir.
Nginx mi Apache mi? Karar Matrisi
VDS'de web sunucusu seçmeden önce iş yükünüze bakın:
| Kriter | Nginx | Apache |
|---|---|---|
| Statik dosya sunumu | Çok hızlı (epoll, asenkron) | Orta |
| PHP entegrasyonu | PHP-FPM (unix socket/TCP) | mod_php veya PHP-FPM |
| .htaccess desteği | Yok (tüm config nginx.conf'ta) | Tam destek |
| Reverse proxy / Node.js önü | Doğal, hız optimizasyonlu | Mümkün ama ek modül |
| Bellek kullanımı (yüksek bağlantı) | Düşük (event-driven) | Daha yüksek (process/thread) |
| HTTP/2 + HTTP/3 (QUIC) | Tam destek (1.25+) | HTTP/2 tam, HTTP/3 kısıtlı |
| Gzip + Brotli | Her ikisi de native | Gzip tam, Brotli modül |
| Load balancing | Dahili (upstream bloğu) | mod_proxy_balancer |
| WordPress / PHP uygulamaları | PHP-FPM ile mükemmel | mod_php daha kolay başlangıç |
Nginx için: yüksek eş zamanlılık (1K+), statik + medya ağırlıklı site, Node.js/Python/Go önü (reverse proxy).
Apache için: .htaccess bağımlı uygulamalar veya mod_php ile hızlı başlangıç.
Kurulum: Ubuntu 22.04 / Debian 12
Ubuntu ve Debian'da Nginx paket deposu işletim sistemiyle gelir. Mainline (1.25+) sürümü için resmi Nginx deposunu ekleyebilirsiniz; LTS sürüm (1.22) için varsayılan repo yeterlidir:
# Paket listesini güncelle
apt update
# Nginx kur (Ubuntu 22.04 → 1.18 LTS; mainline için resmi repo gerekir)
apt install -y nginx
# Sistem başlangıcına ekle ve başlat
systemctl enable --now nginx
# Sürümü doğrula
nginx -v
# nginx version: nginx/1.18.0 (Ubuntu)
Nginx 1.24+ (mainline) için resmi Nginx GPG anahtarını indirip nginx.list deposunu ekleyin, ardından apt update && apt install -y nginx.
Kurulum: AlmaLinux 9 / RHEL 9
AlmaLinux 9 appstream deposunda Nginx 1.22 LTS gelir. Mainline için resmi Nginx deposu eklenebilir:
# AppStream'den Nginx 1.22 LTS
dnf install -y nginx
# Başlat
systemctl enable --now nginx
# Güvenlik duvarında HTTP/HTTPS aç
firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --reload
# Sürüm kontrolü
nginx -v
Mainline sürüm için /etc/yum.repos.d/nginx.repo dosyasına https://nginx.org/packages/mainline/rhel/9/ deposunu ekleyip dnf install -y nginx ile kurabilirsiniz.
nginx.conf Yapısı: Bloklar ve Hiyerarşi
Nginx yapılandırması üç ana blokta şekillenir. Birini yanlış yere koymak direktifin etkisiz kalmasına yol açar:
# /etc/nginx/nginx.conf
user www-data; # AlmaLinux'ta: nginx
worker_processes auto; # CPU sayısı kadar otomatik ayar
worker_rlimit_nofile 65535; # Açık dosya limiti (ulimit -n ile eşleşmeli)
events {
worker_connections 1024; # Worker başına eş zamanlı bağlantı
use epoll; # Linux kernel event notification (varsayılan)
multi_accept on; # Worker yeni bağlantıları toplu kabul eder
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on; # Kernel-level dosya transferi
tcp_nopush on; # sendfile ile birlikte kullanılır
tcp_nodelay on; # Canlı bağlantılarda gecikmeyi azaltır
keepalive_timeout 65;
server_tokens off; # Nginx sürümünü response header'dan gizle
# Site/uygulama yapılandırmaları
include /etc/nginx/conf.d/*.conf;
# Ubuntu/Debian ek yol:
include /etc/nginx/sites-enabled/*;
}
Dizin yapısı (Ubuntu/Debian):
/etc/nginx/
├── nginx.conf Ana yapılandırma (events + http bloğu)
├── conf.d/ Her site için ayrı .conf dosyaları (AlmaLinux yolu)
├── sites-available/ Tanımlı site blokları (Ubuntu/Debian)
├── sites-enabled/ Aktif site blokları (symlink)
└── snippets/ Tekrar kullanılan yapılandırma parçaları
Virtual Host (Server Block) Oluşturma
Her domain için ayrı server block açın. Ubuntu/Debian'da /etc/nginx/sites-available/ altına, AlmaLinux'ta /etc/nginx/conf.d/ altına yazılır:
# /etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html;
# Statik dosyalar için uzun cache süresi
location ~* .(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|otf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# PHP-FPM'e yönlendir
location ~ .php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# WordPress pretty permalink
location / {
try_files $uri $uri/ /index.php?$args;
}
# .htaccess ve gizli dosyaları engelle
location ~ /. {
deny all;
}
}
Etkinleştirme (Ubuntu/Debian):
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
nginx -t # Söz dizimi hatası var mı?
systemctl reload nginx
AlmaLinux'ta dosyayı /etc/nginx/conf.d/example.com.conf olarak kaydedin; symlink gerekmez.
PHP-FPM Entegrasyonu: Unix Socket vs TCP
PHP-FPM, Nginx'e iki yoldan bağlanır. Performans farkı anlamlıdır:
| Yöntem | Gecikme | Ne zaman |
|---|---|---|
| Unix socket | Düşük (kernel içi) | Nginx ve PHP-FPM aynı sunucuda |
| TCP (127.0.0.1:9000) | Biraz daha yüksek | Farklı sunucular / container |
PHP-FPM pool yapılandırması (/etc/php/8.2/fpm/pool.d/www.conf):
[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; TCP için: listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
php_admin_value[memory_limit] = 256M
php_admin_value[upload_max_filesize] = 64M
systemctl restart php8.2-fpm
nginx -t && systemctl reload nginx
TLS + Let's Encrypt + Certbot
HTTP trafiğini HTTPS'e zorlamak iki adım: sertifika al, server block'u güncelle.
# Ubuntu/Debian
apt install -y certbot python3-certbot-nginx
# AlmaLinux 9
dnf install -y epel-release
dnf install -y certbot python3-certbot-nginx
# Sertifika al ve nginx.conf'u otomatik güncelle
certbot --nginx -d example.com -d www.example.com
# Otomatik yenilemeyi test et
certbot renew --dry-run
Certbot nginx.conf'a TLS bloğu ekler. Sonucu kontrol edip bazı direktifleri manuel güçlendirin:
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on; # Nginx 1.25.1+ yeni söz dizimi
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# TLS sürümleri
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=15768000" always;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
root /var/www/example.com/public;
}
# HTTP → HTTPS yönlendirme
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Kritik TLS direktifleri: ssl_protocols TLSv1.2 TLSv1.3 (eski protokolları devre dışı bırakır), ssl_session_cache shared:SSL:10m (session yeniden kullanımı), ssl_session_timeout 1d, ssl_session_tickets off (forward secrecy), ssl_prefer_server_ciphers off (TLS 1.3 uyumu).
HTTP/2 ve HTTP/3 (QUIC) Açma
HTTP/2 ile tek TCP bağlantısında çoklu akış, head-of-line blocking azalır; sayfa yükleme süresi düşer.
Nginx 1.25.1 öncesi söz dizimi:
listen 443 ssl http2;
Nginx 1.25.1 ve sonrası (ayrı direktif):
listen 443 ssl;
http2 on;
HTTP/3 (QUIC) için Nginx 1.25+ ve --with-http_v3_module derlenmiş paket gerekir; resmi mainline bu modülle gelir:
listen 443 ssl;
listen 443 quic reuseport;
http2 on;
http3 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
UFW'de ufw allow 443/udp, firewalld'de firewall-cmd --permanent --add-port=443/udp && firewall-cmd --reload ile UDP 443'ü açın.
Gzip ve Brotli Sıkıştırma
| Özellik | Gzip | Brotli |
|---|---|---|
| Nginx desteği | Yerleşik modül | ngx_brotli (ayrı modül) |
| Sıkıştırma oranı | İyi | %15–25 daha iyi |
| CPU maliyeti | Orta | Biraz daha yüksek |
| Tarayıcı desteği | Evrensel | Tüm modern tarayıcılar |
Gzip yapılandırması (http bloğuna girin):
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6; # 1-9; 6 hız/oran dengesi
gzip_min_length 256; # Küçük dosyalarda sıkıştırma anlamsız
gzip_types
text/plain
text/css
text/xml
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
Brotli için ngx_brotli modülü gerekir. Ubuntu'da:
apt install -y libnginx-mod-brotli
Ardından:
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
Gzip ve Brotli birlikte çalışır; Nginx Accept-Encoding header'ına bakarak uygun sıkıştırmayı seçer.
Performans Tuning: Worker, Bağlantı, Keepalive
En sık yanlış yapılan ayarlar:
| Parametre | Varsayılan | Önerilen | Açıklama |
|---|---|---|---|
worker_processes |
1 | auto |
CPU çekirdeği sayısı kadar otomatik |
worker_connections |
1024 | 2048–8192 | Worker başına eş zamanlı bağlantı |
worker_rlimit_nofile |
Sistem limiti | 65535 | Açık dosya limiti |
keepalive_timeout |
75s | 15–65s | Bağlantıyı canlı tutma süresi |
keepalive_requests |
1000 | 5000 | Bağlantı başına max istek |
sendfile |
off | on | Kernel seviye dosya transferi |
tcp_nopush |
off | on | sendfile ile birlikte etkin |
CPU sayısına göre worker tuning:
| vCPU | worker_processes | worker_connections | Toplam kapasite |
|---|---|---|---|
| 1 vCPU | 1 | 2048 | ~2K eş zamanlı |
| 2 vCPU | 2 | 4096 | ~8K eş zamanlı |
| 4 vCPU | auto (4) | 4096 | ~16K eş zamanlı |
| 8 vCPU | auto (8) | 8192 | ~64K eş zamanlı |
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
keepalive_timeout 65;
keepalive_requests 5000;
reset_timedout_connection on;
upstream php_fpm {
server unix:/run/php/php8.2-fpm.sock;
keepalive 32;
}
}
Açık dosya limitini de artırın: nginx soft nofile 65535 ve nginx hard nofile 65535 satırlarını /etc/security/limits.conf'a ekleyin.
fastcgi_cache: PHP Yanıtlarını Önbelleğe Alma
Her istek için PHP-FPM çağırmak yerine yanıtı diskte önbellekle; aynı URL'ye ikinci istekten itibaren Nginx doğrudan döner.
# http bloğuna ekle (server bloğu dışında)
fastcgi_cache_path /var/cache/nginx/fpm
levels=1:2
keys_zone=fpm_cache:10m
max_size=1g
inactive=60m
use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# server bloğuna ekle
fastcgi_cache fpm_cache;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
fastcgi_cache_use_stale error timeout updating http_500 http_503;
fastcgi_cache_min_uses 2;
fastcgi_cache_bypass $cookie_session $cookie_wordpress_logged_in;
fastcgi_no_cache $cookie_session $cookie_wordpress_logged_in;
add_header X-FastCGI-Cache $upstream_cache_status;
mkdir -p /var/cache/nginx/fpm
chown nginx:nginx /var/cache/nginx/fpm # AlmaLinux; Ubuntu: www-data:www-data
Reverse Proxy ve Load Balancing
Node.js, Python veya Go uygulaması 3000 portunda çalışıyorsa Nginx önünde reverse proxy olarak durur:
upstream app_servers {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
keepalive 16;
}
server {
listen 443 ssl;
http2 on;
server_name app.example.com;
location / {
proxy_pass http://app_servers;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 60s;
}
}
Load balancing: varsayılan round-robin, weight=N (ağırlıklı), least_conn (en az bağlantı), ip_hash (session persistence) seçenekleri upstream bloğuna eklenir.
Güvenlik: Rate Limiting ve Security Header
Rate Limiting
Brute-force ve DDoS girişimlerine karşı limit_req ile istek sınırı koyun:
# http bloğuna ekle
limit_req_zone $binary_remote_addr zone=web:10m rate=20r/s;
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# server bloğu — genel web trafiği
limit_req zone=web burst=50 nodelay;
# location /api — API endpoint
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://app_servers;
}
# Login endpoint
location /wp-login.php {
limit_req zone=login burst=3;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Güvenlik Header'ları
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# HSTS: TLS bloğunda, server_tokens off: http bloğunda
Yapılandırma Test ve Yeniden Yükleme
nginx -t # Söz dizimi kontrolü (servis yeniden başlatmadan)
systemctl reload nginx # Aktif bağlantı kesmeden yeniden yükle
journalctl -u nginx -f # Canlı log izleme
tail -f /var/log/nginx/error.log
Buyukweb VDS notu: KVM altyapısı sayesinde konsol erişimi ağ durumundan bağımsızdır. Yanlış yapılandırma sonucu erişim kaybederseniz destek hattı (0850 302 60 70) üzerinden konsola bağlanabilirsiniz.
Sıkça Sorulan Sorular
Nginx ile Apache arasındaki temel fark nedir?
Nginx olay güdümlü (event-driven) asenkron mimarisini kullanır; her bağlantı için yeni process açmaz. Yüksek eş zamanlılıkta (1K+ bağlantı) bellek ayak izi belirgin şekilde daha düşük kalır. Statik dosya sunumunda hız avantajı sunar; Apache'nin .htaccess desteği ise .htaccess bağımlı uygulamalarda yapılandırmayı kolaylaştırır.
PHP-FPM unix socket mi, TCP mi kullanmalıyım?
Nginx ve PHP-FPM aynı sunucuda çalışıyorsa unix socket seçin: kernel içi iletişim TCP'den daha az gecikme üretir. Farklı sunucu ya da container senaryosunda TCP zorunludur. Unix socket için fastcgi_pass unix:/run/php/php8.2-fpm.sock;, TCP için fastcgi_pass 127.0.0.1:9000; yazılır.
HTTP/2 nasıl aktif edilir?
Nginx 1.25.1 öncesi: listen 443 ssl http2; ifadesinde http2 anahtar sözcüğü yeterlidir. Nginx 1.25.1 ve sonrasında http2 on; ayrı bir direktif olarak server bloğuna eklenir. HTTP/2 için TLS zorunludur; HTTP üzerinde HTTP/2 (h2c) Nginx tarafından desteklenmez.
Gzip ve Brotli birlikte açılabilir mi?
Evet. İkisi çakışmaz; Nginx gelen Accept-Encoding header'ına bakarak tarayıcının desteklediği sıkıştırmayı seçer. Brotli destekleyen tarayıcılar Brotli alır (%15–25 daha iyi oran), desteklemeyenler Gzip alır. gzip_vary on direktifi önbellek katmanlarının doğru içeriği sunmasını sağlar.
fastcgi_cache ile LSCache (LiteSpeed Cache) arasındaki fark ne?
LSCache, LiteSpeed'e entegre tam sayfa önbellek motorudur; WordPress eklentisi üzerinden cache tag'leri ve otomatik temizleme destekler. Buyukweb cPanel paketlerinde LiteSpeed + LSCache hazır gelir — eklentiden aktif edebilirsiniz. fastcgi_cache ise Nginx tarafında PHP-FPM yanıtlarını önbellekleyen daha basit bir mekanizmadır; tag tabanlı temizleme için nginx-helper gibi ek araç gerekir. cPanel hosting için LSCache tercih edin; VDS + Nginx senaryosunda fastcgi_cache iş görür.
worker_processes'i ne kadar ayarlamalıyım?
auto değeri çoğu senaryo için yeterlidir — Nginx CPU çekirdeği sayısını kendisi algılar. Daha fazla worker eklemek I/O bağımlı yük altında belirleyici değildir; worker_connections ve keepalive_timeout tuning daha kritiktir.
Yapılandırma hatası yaptım, siteye erişemiyorum. Ne yapmalıyım?
nginx -t ile söz dizimini kontrol edin; hata yoksa /var/log/nginx/error.log dosyasına bakın. SSH bağlantısı da kopuksa Buyukweb destek hattı (0850 302 60 70) üzerinden KVM konsol erişimi talep edin.
İlgili Büyükweb Hizmetleri
- VDS Sunucu (E5-V4) — KVM, AlmaLinux 9, Ubuntu 22.04, anında teslim, ₺250/ay'dan başlayan fiyatlar
- E5-V2 VDS Paketleri — Nginx ve tüm açık kaynak stack'ler desteklenir
- cPanel Web Hosting — LiteSpeed dahil, Nginx kurmanıza gerek yok
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
VDS & VPS Rehberi İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:


