Kurulum Rehberleri

Nginx Kurulumu ve Sunucu Bloğu Ayarı

Ubuntu'da Nginx'i kurup alan adınız için sunucu bloğu açmayı, Node.js uygulaması için ters vekil (reverse proxy) ayarını ve sık hataların çözümünü anlatıyoruz.

Aurora YazılımEditör ekibi 6 dk okuma
Nginx Kurulumu ve Sunucu Bloğu Ayarı
Ubuntu'da Nginx kurulumu nasıl yapılır?

Nginx kurulumu için sudo apt update ve sudo apt install nginx komutlarını çalıştırır, güvenlik duvarında Nginx Full profiline izin verirsiniz. Ardından /etc/nginx/sites-available altında alan adınıza ait bir sunucu bloğu oluşturup sites-enabled klasörüne bağlar, sudo nginx -t ile test edip sudo systemctl reload nginx ile ayarı devreye alırsınız.

Nginx Nedir, Ne İşe Yarar?

Nginx, yüksek eşzamanlı bağlantıyı az bellekle karşılayabilen açık kaynaklı bir web sunucusu ve ters vekildir. Statik dosyaları çok hızlı sunar; Node.js, Python ya da PHP uygulamalarının önünde durup istekleri onlara iletir, SSL'i sonlandırır ve önbellek katmanı görevi görür.

Apache'den temel farkı yapılandırma biçimidir: Nginx'te dizin bazlı .htaccess dosyası yoktur, tüm kurallar merkezi yapılandırmada tutulur. Bu, performansı artırır ama Apache'den geçenlerin kurallarını yeniden yazmasını gerektirir. Apache tarafındaki karşılıkları merak ediyorsanız htaccess yönlendirme yazımızı inceleyebilirsiniz.

Bu rehber Ubuntu ve Debian üzerinden ilerliyor; macOS ve Windows için geliştirme ortamı kurulumunu ayrı başlıkta bulacaksınız.

Önkoşullar

Sunucuda Apache de kuruluysa iki servis aynı 80 portunu dinlemeye çalışır ve Nginx başlamaz. Apache'yi durdurup devre dışı bırakın ya da farklı bir portta dinlemesini sağlayın.

  • Ubuntu ya da Debian çalışan bir sunucu ve sudo yetkili kullanıcı
  • Alan adınızın A kaydının sunucu IP'sini göstermesi
  • 80 ve 443 portlarını kullanan başka bir servis (ör. Apache) olmaması
  • Ters vekil kuracaksanız sunucuda çalışan bir uygulama (ör. 3000 portunda Node.js)

Ubuntu'da Nginx Kurulum Adımları

Ubuntu'nun kendi deposundaki Nginx paketi güvenlik güncellemelerini düzenli alır ve çoğu proje için yeterlidir. Daha yeni bir ana hat sürümüne ihtiyacınız varsa nginx.org üzerindeki resmî paket deposunu ekleyebilirsiniz.

bash
sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx
sudo systemctl status nginx

# Güvenlik duvarı (UFW kullanıyorsanız)
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

# Doğrulama
nginx -v
curl -I http://localhost

Önemli dosya ve klasörler

  • /etc/nginx/nginx.conf: ana yapılandırma dosyası
  • /etc/nginx/sites-available/: tanımlı sunucu blokları
  • /etc/nginx/sites-enabled/: etkin bloklara verilen bağlantılar
  • /var/www/: site dosyaları için yaygın kök klasör
  • /var/log/nginx/access.log ve error.log: istek ve hata kayıtları

Sunucu Bloğu Nasıl Oluşturulur?

Sunucu bloğu (server block), Apache'deki sanal konağın karşılığıdır ve tek sunucuda birden fazla alan adını barındırmanızı sağlar. Her site için ayrı bir dosya açmak yönetimi kolaylaştırır.

Önce site klasörünü oluşturup sahipliğini ayarlayın, ardından yapılandırma dosyasını yazın. server_name satırına hem çıplak alan adını hem www sürümünü ekleyin; Certbot gibi araçlar bu satırı okuyarak sertifika alır.

bash
sudo mkdir -p /var/www/ornek.com/html
sudo chown -R $USER:$USER /var/www/ornek.com/html
echo '<h1>ornek.com çalışıyor</h1>' > /var/www/ornek.com/html/index.html
sudo nano /etc/nginx/sites-available/ornek.com
nginx/etc/nginx/sites-available/ornek.com
server {
    listen 80;
    listen [::]:80;
    server_name ornek.com www.ornek.com;

    root /var/www/ornek.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/ornek.com.access.log;
    error_log  /var/log/nginx/ornek.com.error.log;
}
bashEtkinleştirme ve test
sudo ln -s /etc/nginx/sites-available/ornek.com /etc/nginx/sites-enabled/
# Varsayılan karşılama sayfasını kapatmak isterseniz
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

Nginx Reverse Proxy Ayarı

Node.js, Python ya da başka bir uygulama sunucusunu doğrudan internete açmak yerine önüne Nginx koymak yaygın ve güvenli bir düzendir. Nginx 80 ve 443 portlarını dinler, istekleri yerelde çalışan uygulamaya iletir; uygulamanın kendi portu dışarıya kapalı kalır.

Aşağıdaki örnekte uygulama 3000 portunda çalışıyor. Gerçek istemci IP'sini ve protokolü uygulamaya iletmek için proxy başlıkları eklenir; WebSocket kullanan uygulamalar için Upgrade başlıkları da gerekir.

Aynı sunucuda birden fazla uygulama çalıştırıyorsanız her birine ayrı bir alt alan adı ve ayrı bir sunucu bloğu vermek en düzenli yöntemdir. Örneğin yönetim paneli panel.ornek.com, API ise api.ornek.com üzerinden yayınlanabilir; her bloğun kendi log dosyası olduğunda sorunun hangi uygulamadan kaynaklandığını bulmak da kolaylaşır. Uygulama tarafında gerçek istemci IP'sini okuyabilmek için kullandığınız çatının güvenilir vekil (trust proxy) ayarını da açmayı unutmayın.

nginx
server {
    listen 80;
    server_name app.ornek.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    client_max_body_size 20m;
}

HTTPS, Sıkıştırma ve Önbellek

Sunucu bloğu çalıştıktan sonra sıradaki adım ücretsiz bir sertifikayla HTTPS'e geçmektir. Certbot'un Nginx eklentisi sertifikayı alıp 443 bloğunu ve yönlendirmeyi sizin yerinize ekler; adımları SSL sertifikası kurulumu rehberinde anlattık.

Hız tarafında gzip sıkıştırması ve statik dosyalar için uzun süreli önbellek başlıkları büyük fark yaratır. Alan adını Cloudflare gibi bir CDN arkasına almak da statik içeriği ziyaretçiye yakın noktalardan sunar; kurulumu Cloudflare kurulumu yazımızda bulabilirsiniz.

  • Dosya adlarında sürüm parmak izi (ör. app.3f9a.css) kullanıyorsanız önbellek süresini daha da uzatabilirsiniz.
  • HTML dosyalarını uzun süre önbelleğe almayın; aksi hâlde güncellemeler ziyaretçiye geç ulaşır.
nginxserver bloğu içine
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;

location ~* \.(css|js|webp|avif|png|jpg|svg|woff2)$ {
    expires 30d;
    add_header Cache-Control "public";
}

Temel Güvenlik Ayarları

Varsayılan kurulum çalışır ama canlıya çıkmadan önce birkaç basit ayar saldırı yüzeyini belirgin biçimde daraltır. Bunların hiçbiri ek yazılım gerektirmez; yalnızca yapılandırmaya birkaç satır eklemek yeterlidir.

İlk iş server_tokens değerini kapatmaktır; böylece hata sayfalarında ve başlıklarda Nginx sürüm numarası görünmez. Ardından tanımsız alan adlarıyla gelen istekleri karşılayan bir varsayılan blok ekleyin. Bu blok, sunucunuzun IP adresine doğrudan gelen botların ilk sitenizi görmesini engeller.

Gizli dosyalara erişimi kapatmak da önemlidir. Kök klasörde yanlışlıkla kalan .git klasörü ya da .env dosyası, kaynak kodunuzu veya veritabanı parolalarınızı herkese açabilir. Bu tür sızıntılar genellikle kötü niyetten değil, aceleyle yapılan bir yüklemeden kaynaklanır.

Son olarak sunucu paketlerini düzenli güncelleyin ve yalnızca gerçekten ihtiyaç duyduğunuz portları açık tutun. Bir web tasarımı projesini ya da e-ticaret altyapısını canlıya alırken bu kontrol listesini her seferinde baştan uygulamak, sonradan yaşanacak sürprizleri büyük ölçüde azaltır.

nginx
# /etc/nginx/nginx.conf, http bloğu içine
server_tokens off;

# Tanımsız alan adlarını reddeden varsayılan blok
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

# Site bloğu içine: gizli dosyaları kapat
location ~ /\.(?!well-known) {
    deny all;
}

macOS ve Windows'ta Geliştirme Ortamı

Canlı sunucu çoğunlukla Linux olsa da yapılandırmayı yerelde denemek işinizi hızlandırır. macOS'ta Homebrew ile kurulan Nginx varsayılan olarak 8080 portunu dinler ve yapılandırma dosyası Homebrew önekinin altındaki etc/nginx klasöründedir.

Windows için nginx.org'da bir derleme bulunsa da resmî belgeler bu sürümün sınırlamaları olduğunu belirtir. Windows'ta en pratik yol Docker ya da WSL üzerinde Linux sürümünü çalıştırmaktır; böylece canlı sunucuyla aynı ortamda test edersiniz.

macOS (Homebrew)

bash
brew install nginx
brew services start nginx
nginx -t
# Yapılandırma klasörü
ls $(brew --prefix)/etc/nginx
curl -I http://localhost:8080

Windows (Docker)

powershell
docker run -d --name web -p 8080:80 nginx
curl.exe -I http://localhost:8080

Sık Hatalar ve Çözümleri

Hata ayıklamada ilk adım her zaman sudo nginx -t ile sözdizimini, ardından error.log dosyasını kontrol etmektir. Çoğu sorun buradaki tek satırlık mesajla çözülür.

BelirtiOlası neden ve çözüm
502 Bad GatewayArkadaki uygulama çalışmıyor ya da port yanlış; uygulamayı ve proxy_pass adresini kontrol edin.
403 ForbiddenKlasör izinleri yetersiz ya da index dosyası yok; sahipliği ve index satırını kontrol edin.
Address already in use80 portunu başka servis kullanıyor; ss -tlnp ile bulun ve durdurun.
conflicting server nameAynı server_name iki blokta tanımlı; tekrarı kaldırın.
413 Request Entity Too LargeYüklenen dosya sınırı aşıyor; client_max_body_size değerini artırın.
bash
sudo nginx -t
sudo tail -n 50 /var/log/nginx/error.log
sudo ss -tlnp | grep -E ':80|:443'

Sık Sorulan Sorular

01Nginx mi Apache mi daha iyi?

İkisi de olgun ve güvenilir sunuculardır. Nginx yüksek eşzamanlı trafikte ve ters vekil kullanımında öne çıkar, Apache ise .htaccess desteği sayesinde paylaşımlı barındırmada esneklik sunar. Pek çok altyapı ikisini birlikte de kullanır.

02restart ile reload arasındaki fark nedir?

reload, çalışan bağlantıları kesmeden yeni yapılandırmayı yükler; günlük değişikliklerde tercih edilmelidir. restart servisi tamamen durdurup başlatır ve kısa bir kesintiye yol açabilir.

03Bir sunucuda kaç site barındırabilirim?

Sınırı Nginx değil sunucunun kaynakları belirler. Her alan adı için ayrı bir sunucu bloğu açarak çok sayıda siteyi aynı makinede çalıştırabilirsiniz; trafik arttıkça bellek, işlemci ve disk kullanımını izlemek gerekir.

04Nginx ile yük dengeleme yapılabilir mi?

Evet. upstream bloğunda birden fazla uygulama sunucusu tanımlayıp proxy_pass ile bu gruba yönlendirdiğinizde Nginx istekleri sunucular arasında dağıtır. Varsayılan yöntem sırayla dağıtımdır; least_conn ya da ip_hash gibi yöntemlerle davranışı değiştirebilirsiniz.

Doğru kurulmuş bir Nginx; hızlı, güvenli ve birden fazla uygulamayı taşıyabilen bir temel sağlar. Sunucu ayarları, önbellek ve Core Web Vitals hedeflerini birlikte ele almak isterseniz hız ve performans yönetimi hizmetimizi inceleyin. Kendi sunucusunda çalışan özel bir sistem ya da otel yazılımı gibi hazır Aurora çözümleri için iletişim sayfasından bize ulaşabilirsiniz.