İçeriğe geç

Web sunucusu

Nginx ile sanal host (server block) yapılandırma

Aynı sunucuda birden fazla siteyi Nginx server block'larıyla barındırmak.

2 dk okumaGüncelleme
İçindekiler 7

Nginx'te tek bir sunucu birden fazla alan adına hizmet verebilir. Her site için ayrı bir server block (diğer sunucularda "sanal host") tanımlanır; Nginx gelen isteğin Host başlığına bakarak hangi bloğun yanıt vereceğini seçer.

Kurulum

sudo apt update
sudo apt install nginx

Debian ve Ubuntu paketinde site yapılandırmaları /etc/nginx/sites-available/ altında tutulur ve etkinleştirilenler /etc/nginx/sites-enabled/ içine sembolik bağ olarak eklenir. Diğer dağıtımlarda dizin düzeni farklı olabilir (conf.d/ gibi).

Site dizini

sudo mkdir -p /var/www/ornek.com/html
echo "merhaba" | sudo tee /var/www/ornek.com/html/index.html

Dosya sahipliği ve izinleri, web sunucusunun dosyaları okuyabileceği şekilde ayarlanmalı; yazma izni gerekmeyen yerlerde vermeyin.

Server block

/etc/nginx/sites-available/ornek.com dosyası:

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;
}

Etkinleştirme, sınama ve yeniden yükleme:

sudo ln -s /etc/nginx/sites-available/ornek.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

nginx -t yapılandırma hatasını yeniden yüklemeden önce yakalar. Hata varsa mevcut çalışan yapılandırma etkilenmez, ancak hatayı düzeltmeden yeniden yükleme çalışmaz.

Varsayılan sunucu

Hiçbir server_name ile eşleşmeyen istekler, ilgili port için ilk tanımlanan ya da default_server işaretli bloğa gider. Bilinmeyen adlara bağlantıyı kapatmak için:

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

444, Nginx'e özgü bir koddur; yanıt göndermeden bağlantıyı kapatır.

Ters vekil (reverse proxy)

Bir uygulamayı (örneğin 3000. portta çalışan bir Node.js servisi) yayına almak için location bloğu:

location / {
    proxy_pass http://127.0.0.1:3000;
    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;
}

Uygulama yalnızca 127.0.0.1 üzerinde dinlerse dışarıdan doğrudan erişilemez; bu istenen bir durumdur.

HTTPS

Sertifika almak için Let's Encrypt ve Certbot makalesine bakın. 80 ve 443 portlarının güvenlik duvarında açık olması gerekir: UFW rehberi.

Sorun giderme

  • 403 Forbidden: Dizin izinleri ya da index dosyası eksik.
  • 404 Not Found: root yolu yanlış ya da dosya yok.
  • 502 Bad Gateway: Ters vekilin ilettiği uygulama çalışmıyor ya da yanlış portta.
  • Ayrıntı için hata günlüğüne bakın: sudo tail -n 50 /var/log/nginx/error.log.

Bu makale genel bilgi verir; sürümler ve dağıtımlar arasında komutlar değişebilir. Üretim sunucusunda uygulamadan önce kendi ortamınızda deneyin.

Bize yazın