
Nginx kurulumu, bir Linux sunucuda web sitesi yayınlamanın en hızlı ve en hafif yollarından biridir. Ubuntu 22.04 ve 24.04 üzerinde Nginx'i birkaç komutla kurabilir, aynı sunucuda birden fazla siteyi server block'larla ayrı ayrı barındırabilirsiniz. Bu rehberde paketin kurulumundan güvenlik duvarı ayarına, ilk sitenin yayına alınmasından temel güvenlik düzenlemelerine kadar tüm adımları anlatıyoruz.
Nginx Nedir, Neden Tercih Edilir?
Nginx, olay güdümlü (event-driven) mimarisi sayesinde az bellek kullanarak çok sayıda eşzamanlı bağlantıyı yönetebilen bir web sunucusudur. Her bağlantı için ayrı bir süreç ya da iş parçacığı açmak yerine, az sayıda worker süreci binlerce bağlantıyı aynı anda işler. Bu yüzden statik dosya sunmada, ters vekil sunucu (reverse proxy) olarak ve yük dengelemede çok yaygın kullanılır.
Nginx kendi başına PHP çalıştırmaz; PHP için PHP-FPM ile birlikte çalışır. Node.js, Python veya Docker üzerinde çalışan uygulamaların önünde ise ters vekil görevi görür. PHP tabanlı bir yapı kuracaksanız bu yazıyı bitirdikten sonra LEMP stack kurulum rehberimize geçebilirsiniz.
Kurulum Öncesi Hazırlık
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
- Ubuntu 22.04 veya 24.04 çalışan bir sunucu ve sudo yetkili bir kullanıcı
- Sunucuya SSH ile erişim ve terminalde temel komut bilgisi
- Bir alan adı ve bu alan adının A kaydının sunucu IP adresine yönlendirilmiş olması
DNS kaydının doğru IP'yi gösterip göstermediğini DNS sorgulama aracımızla kontrol edebilirsiniz. Kayıt yeni girildiyse yayılması bir süre alabilir.
Ubuntu'da Nginx Kurulumu Adımları
Nginx, Ubuntu'nun resmi depolarında hazır bulunur. Önce paket listesini güncelleyin, ardından paketi kurun:
sudo apt update
sudo apt install nginx
Kurulum tamamlandığında Nginx servisi otomatik olarak başlar ve açılışta çalışacak şekilde etkinleştirilir. Durumu kontrol edin:
systemctl status nginx
nginx -v
Depodaki sürüm Ubuntu sürümüne göre değişir: Ubuntu 22.04 deposunda 1.18 serisi, Ubuntu 24.04 deposunda 1.24 serisi bulunur. Bu sürümler Ubuntu tarafından güvenlik yamalarıyla desteklenir. Daha yeni özelliklere ihtiyacınız varsa nginx.org'un resmi deposunu ekleyebilirsiniz; ancak bu depodaki paketlerin dizin yapısı farklıdır (sites-available yerine yalnızca conf.d kullanılır).
Güvenlik Duvarında HTTP ve HTTPS'e İzin Verme
Sunucunuzda UFW etkinse Nginx'e erişim için portları açmanız gerekir. Nginx paketi UFW'ye üç hazır uygulama profili ekler:
| Profil | Açtığı port | Ne zaman kullanılır |
|---|---|---|
| Nginx HTTP | 80/tcp | Yalnızca şifresiz HTTP |
| Nginx HTTPS | 443/tcp | Yalnızca HTTPS |
| Nginx Full | 80/tcp ve 443/tcp | SSL kurulacak siteler için önerilen |
sudo ufw app list
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw status
UFW'yi ilk kez etkinleştiriyorsanız OpenSSH kuralını mutlaka önce ekleyin; aksi halde SSH bağlantınız kesilir. UFW'nin ayrıntılı kullanımını UFW güvenlik duvarı rehberimizde anlattık. Ardından tarayıcıda http://sunucu-ip-adresi adresini açtığınızda Nginx'in varsayılan karşılama sayfasını görmelisiniz. Port erişimini dışarıdan test etmek için port kontrol aracını da kullanabilirsiniz.
Nginx Dizin Yapısını Tanıyalım
Ubuntu'daki Nginx paketi yapılandırmayı düzenli bir dizin yapısında tutar. Hangi dosyanın ne işe yaradığını bilmek, sorun çözerken çok zaman kazandırır:
- /etc/nginx/nginx.conf: Ana yapılandırma dosyası. Worker sayısı, gzip, log biçimi gibi genel ayarlar buradadır.
- /etc/nginx/sites-available/: Her site için server block dosyalarının tutulduğu yer. Buradaki dosyalar kendiliğinden aktif olmaz.
- /etc/nginx/sites-enabled/: Aktif sitelere ait sembolik bağlantılar. Nginx yalnızca buradaki dosyaları okur.
- /etc/nginx/conf.d/: Ek genel yapılandırmalar için kullanılır;
.confuzantılı dosyalar otomatik yüklenir. - /etc/nginx/snippets/: Tekrar kullanılabilir yapılandırma parçaları (örneğin
fastcgi-php.conf). - /var/www/html: Varsayılan sitenin kök dizini.
- /var/log/nginx/:
access.logveerror.logdosyaları.
İlk Siteyi Yayına Alma: Server Block Oluşturma
Apache'deki sanal sunucu (virtual host) kavramının Nginx'teki karşılığı server block'tur. Aşağıdaki adımlarda ornek.com alan adı için bir site oluşturuyoruz; kendi alan adınızla değiştirin.
- Site dizinini oluşturun ve sahipliğini ayarlayın:
sudo mkdir -p /var/www/ornek.com/html sudo chown -R $USER:$USER /var/www/ornek.com/html sudo chmod -R 755 /var/www/ornek.com - Test sayfası ekleyin:
echo '<h1>ornek.com yayında</h1>' > /var/www/ornek.com/html/index.html - Server block dosyasını oluşturun:
Dosyaya aşağıdaki içeriği ekleyin:sudo nano /etc/nginx/sites-available/ornek.comserver { listen 80; listen [::]:80; server_name ornek.com www.ornek.com; root /var/www/ornek.com/html; index index.html index.htm; access_log /var/log/nginx/ornek.com.access.log; error_log /var/log/nginx/ornek.com.error.log; location / { try_files $uri $uri/ =404; } } - Siteyi etkinleştirin:
sudo ln -s /etc/nginx/sites-available/ornek.com /etc/nginx/sites-enabled/ - Yapılandırmayı test edip yeniden yükleyin:
sudo nginx -t sudo systemctl reload nginx
nginx -t komutu sözdizimi hatası varsa hangi dosyanın hangi satırında olduğunu söyler. Bu komutu her değişiklikten sonra çalıştırmayı alışkanlık haline getirin; hatalı bir yapılandırmayla yeniden başlatma yapılırsa Nginx açılmaz ve sunucudaki tüm siteler erişilemez olur.
Çok sayıda veya uzun alan adı tanımladığınızda could not build server_names_hash hatası alabilirsiniz. Bu durumda /etc/nginx/nginx.conf içindeki http bloğunda yorum satırı olarak duran server_names_hash_bucket_size 64; satırının başındaki # işaretini kaldırın.
Varsayılan Siteyi Devre Dışı Bırakma
Varsayılan site, sunucuya IP adresiyle veya tanımsız bir alan adıyla gelen istekleri karşılar. Bu sayfayı göstermek istemiyorsanız bağlantısını kaldırabilirsiniz; asıl dosya sites-available içinde kalır:
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx
Nginx'i Ters Vekil (Reverse Proxy) Olarak Kullanmak
Node.js, Python veya Docker içinde çalışan bir uygulamayı yayınlıyorsanız Nginx'i önde konumlandırıp istekleri uygulamaya iletmek en sağlıklı yöntemdir. Böylece SSL, sıkıştırma ve statik dosyalar Nginx'te kalır; uygulamanız yalnızca yerel bir portu dinler. Örneğin 3000 portunda çalışan bir uygulama için server block şöyle olur:
server {
listen 80;
listen [::]:80;
server_name uygulama.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;
}
}
X-Forwarded-For ve X-Real-IP başlıkları sayesinde uygulamanız ziyaretçinin gerçek IP adresini görür; aksi halde tüm istekler 127.0.0.1'den geliyormuş gibi görünür. Uygulamanız WebSocket kullanıyorsa location bloğuna proxy_set_header Upgrade $http_upgrade; ve proxy_set_header Connection "upgrade"; satırlarını da eklemeniz gerekir. Uygulamanın portunu güvenlik duvarında dışarıya açmayın; erişim yalnızca Nginx üzerinden olmalıdır.
Temel Nginx Yönetim Komutları
| Komut | Ne yapar |
|---|---|
sudo nginx -t | Yapılandırmayı test eder, hiçbir şeyi değiştirmez |
sudo systemctl reload nginx | Bağlantıları koparmadan yeni yapılandırmayı yükler |
sudo systemctl restart nginx | Servisi tamamen durdurup başlatır |
sudo systemctl stop nginx | Servisi durdurur |
sudo systemctl enable nginx | Açılışta otomatik başlamayı etkinleştirir |
sudo tail -f /var/log/nginx/error.log | Hata günlüğünü canlı izler |
Günlük kullanımda reload tercih edilmelidir. restart yalnızca modül değişikliği gibi durumlarda gerekir.
Temel Güvenlik ve Performans Ayarları
Kurulumdan sonra birkaç küçük ayar hem güvenliği hem de performansı iyileştirir. /etc/nginx/nginx.conf dosyasında http bloğunu açın:
- Sürüm bilgisini gizleyin:
# server_tokens off;satırının yorumunu kaldırın. Böylece hata sayfalarında ve yanıt başlıklarında Nginx sürüm numarası görünmez. - Gzip türlerini genişletin: Ubuntu'da
gzip on;varsayılan olarak açıktır ancak yalnızca HTML sıkıştırılır. Yorum satırındakigzip_typessatırını etkinleştirerek CSS, JavaScript ve JSON dosyalarının da sıkıştırılmasını sağlayın. - Yükleme boyutunu belirleyin: Nginx varsayılan olarak 1 MB'tan büyük istek gövdelerini reddeder. Dosya yükleme yapılan sitelerde server block içine örneğin
client_max_body_size 64M;ekleyin.
Değişikliklerden sonra yine sudo nginx -t ve sudo systemctl reload nginx komutlarını çalıştırın.
Sık Karşılaşılan Hatalar ve Çözümleri
- 403 Forbidden: Genellikle kök dizinde index dosyası olmadığında veya Nginx kullanıcısı (
www-data) dosyaları okuyamadığında görülür. Ayrıntılı çözüm için 403 Forbidden hatası yazımıza bakın. - Port 80 kullanımda hatası: Sunucuda Apache gibi başka bir web sunucusu çalışıyor olabilir.
sudo ss -tlnp | grep ':80 'ile portu kimin kullandığını görün. - 502 Bad Gateway: Nginx'in yönlendirdiği arka uç (PHP-FPM, Node.js vb.) çalışmıyordur veya yanlış soket ya da porta yönlendirme yapılmıştır.
- 413 Request Entity Too Large: Yüklenen dosya, Nginx'in istek gövdesi sınırını aşıyordur. Server block'a uygun bir
client_max_body_sizedeğeri ekleyin. - Site yerine varsayılan sayfa açılıyor:
server_namesatırı yanlış yazılmış ya da site sites-enabled içine bağlanmamıştır.
AlmaLinux Kullananlar İçin Kısa Not
AlmaLinux 9'da kurulum sudo dnf install nginx ve sudo systemctl enable --now nginx komutlarıyla yapılır. Bu dağıtımda sites-available yapısı yoktur; site dosyaları /etc/nginx/conf.d/ornek.com.conf olarak oluşturulur. Güvenlik duvarı için firewalld, dosya erişimleri için ise SELinux kuralları devreye girer.
Sık Sorulan Sorular
Nginx kurulumu için ne kadar RAM gerekir?
Nginx'in kendisi çok az bellek kullanır; statik bir site için 1 GB RAM'li bir sunucu bile yeterlidir. Asıl bellek ihtiyacını PHP, veritabanı ve uygulamanız belirler.
Aynı sunucuda kaç site barındırabilirim?
Teknik bir sınır yoktur. Her site için ayrı bir server block dosyası oluşturursunuz. Pratikteki sınırı sunucunun CPU, RAM ve disk kaynakları belirler.
Apache ile Nginx aynı anda çalışabilir mi?
Evet, ancak aynı portu dinleyemezler. Yaygın kullanım, Nginx'i 80 ve 443 portunda ön tarafa koyup Apache'yi farklı bir porttan arka uç olarak çalıştırmaktır.
Nginx'e SSL sertifikası nasıl eklenir?
En pratik yol, Certbot ile ücretsiz Let's Encrypt sertifikası almaktır. Certbot server block'unuzu otomatik olarak HTTPS'e göre düzenler. Adımlar için Certbot ile SSL kurulumu yazımıza bakın.
Yaptığım değişiklikler neden uygulanmıyor?
En sık sebep, dosyayı sites-available içinde düzenleyip sites-enabled içine bağlamayı unutmak ya da değişiklikten sonra Nginx'i yeniden yüklememektir. Tarayıcı önbelleği de eski sayfanın görünmesine neden olabilir; testleri gizli pencerede veya curl -I ile yapın.
Nginx kurulumu tamamlandığında elinizde birden fazla siteyi düşük kaynakla taşıyabilen sağlam bir web sunucusu olur. Bir sonraki adım olarak sitenize SSL ekleyip uygulamanızı yayına alabilirsiniz. Kendi web sunucunuzu tam yetkiyle yönetmek istiyorsanız NVMe diskli ve DDoS korumalı VDS sunucu kiralama seçeneklerimizi, daha küçük projeler için ise uygun maliyetli VPS paketlerini inceleyebilirsiniz.
Hizmet Sözleşmemiz
Web Koruma
İade Politikamız
