Buyukweb
VDS'de Nginx Kurulumu ve Yapılandırması: Sıfırdan Production'a

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.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü11 dakika okuma

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

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:

#nginx kurulum#nginx yapılandırma#vds nginx#virtual host#nginx ssl#nginx optimizasyon#web sunucu

Bu yazıyı paylaş