
Next.js Hosting: VDS'te Yayına Alma (PM2 ve Nginx)
Next.js projelerinizi sanal sunucuda PM2 ve Nginx kullanarak nasıl yayınlayacağınızı, ortam değişkenlerini ve sunucu gereksinimlerini öğrenin.
Next.js projelerini bağımsız bir sanal sunucuda barındırmak, uygulamanın işlem gücünü doğrudan denetlemenizi ve sunucu paketine ayrılan işlemci, RAM ile disk kapasitesi sınırlarında bağımsız kaynaklarla çalışmasını sağlar. Doğru yapılandırılmış bir Next.js hosting altyapısı sayesinde sunucu taraflı işleme süreçlerini hızlandırabilir, bellek sınırlarını özgürce belirleyebilir ve arka plan servislerini tek merkezden yönetebilirsiniz. Kurulumu tamamlamak için Node.js çalışma ortamını, PM2 süreç yöneticisini ve Nginx ters vekil servisini doğru yapılandırmak yeterlidir.
Kısa cevap:
- Next.js uygulamaları sunucu taraflı işleme (SSR) süreçleri için sürekli çalışan bir Node.js motoruna ihtiyaç duyar.
- PM2, uygulama süreçlerini arka planda canlı tutarak beklenmedik durumlarda otomatik yeniden başlatma sağlar.
- Nginx, genel ağdan gelen web isteklerini karşılayıp yerel Next.js portuna yönlendiren ters vekil olarak çalışır.
- Yeterli RAM ve ayrılmış takas alanı (swap), derleme aşamasında sistem belleği üzerindeki baskıyı azaltmaya yardımcı olur.
Next.js için paylaşımlı hosting yeter mi?
Next.js mimarisi temelde iki farklı çıktı modeli üzerinden dağıtılabilir: statik dışa aktarma (Static Export) ve sunucu taraflı çalışma (Node.js Server Runtime). Uygulamanız yalnızca istemci tarafında çalışan bileşenlerden ve statik sayfalardan oluşuyorsa, saf HTML, CSS ve JavaScript çıktısı alarak temel barındırma alanlarında yayınlayabilirsiniz. Ancak dinamik rota yönetimi, sunucu taraflı işleme (Server-Side Rendering - SSR), sunucu eylemleri (Server Actions) ve yerleşik görsel optimizasyonu gibi modern Next.js yetenekleri için Node.js için VDS kullanımı süreç üzerinde tam yetki ve kaynak bağımsızlığı sağlar. Uygun Node.js desteği sunan paylaşımlı hosting veya yönetilen platformlar da kullanılabilir; fakat ayrılmış sunucu kaynakları ölçekleme kolaylığı sunar.
Paylaşımlı hosting ortamları birden fazla kullanıcının tek bir işletim sistemi çekirdeğini ve donanım havuzunu bölüştüğü yapılardır. Bu sistemlerde kullanıcılara kök erişim (root) izni verilmez. Sistem düzeyinde paket kuramaz, özel ağ portlarını dinleyemez ve işletim sistemi servislerini (systemd) yönetemezsiniz. cPanel veya benzeri paneller üzerinden sağlanan Node.js eklentileri temel gereksinimleri karşılasa da modern çatıların ihtiyaç duyduğu geniş yapılandırma esnekliğini sunmakta yetersiz kalabilir. Karar aşamasında ayrıntılı bir değerlendirme yapmak için Node.js hosting seçim kriterleri rehberini inceleyebilirsiniz.
Gelişmiş Next.js projelerinin paylaşımlı ortamlarda karşılaştığı temel engellerden biri derleme (build) aşamasındaki donanım tüketimidir. Webpack veya Turbopack derleyicileri projeyi derlerken TypeScript denetimleri, sayfa ön işleme adımları ve kod bölme (code splitting) işlemleri nedeniyle anlık olarak yüksek işlemci ve bellek tüketir. Paylaşımlı sunuculardaki katı işlem limitleri, derleme sürecinin işletim sistemi tarafından yarıda kesilmesine sebep olabilir.
Sanal sunucu tercih ettiğinizde işletim sistemi üzerinde tam denetim sahibi olursunuz. Node.js sürümünü dilediğiniz zaman güncelleyebilir, Nginx üzerinde gelişmiş önbellekleme kuralları tanımlayabilir ve PM2 kümeleme moduyla sunucudaki tüm işlemci çekirdeklerinden faydalanabilirsiniz. Bu mimari, trafik dalgalanmalarında yanıt sürelerinin dengelenmesine yardımcı olur; ancak elde edilecek performans sunucuya ayrılan kapasiteye, altyapıya ve uygulamanın anlık yüküne bağlıdır.
VDS'te Node.js ve gerekli araçların kurulumu
Next.js uygulamasını kurmak için kararlı bir Linux dağıtımına ihtiyaç vardır. Uzun vadeli destek (LTS) sunan Ubuntu 24.04 veya Ubuntu 22.04 LTS sürümleri geniş paket ekosistemi sayesinde bu süreçte dengeli bir çalışma ortamı oluşturur. Sunucunuzu kurduktan sonra terminal üzerinden tüm adımları sırayla uygulayabilirsiniz.
Sunucunuza SSH protokolü üzerinden root yetkisine sahip kullanıcı ile bağlandıktan sonra mevcut paketleri güncelleyin ve temel derleme araçlarını sisteme dahil edin:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git build-essential software-properties-common ufw
Uygulamanın çalışacağı Node.js sürümü kullanılan Next.js sürümünün asgari şartlarına uygun olmalıdır. Örneğin Next.js 14 sürümleri Node.js 18.17 gerektirirken, Next.js 15 için en az Node.js 18.18, Next.js 16 için ise Node.js 20.9 veya üzeri gerekir. Kararlılık ve uzun süreli güvenlik yamaları için kurumsal projelerde Node.js 20 LTS sürümünün kurulması önerilir. NodeSource deposunu sisteme ekleyerek Node.js paketini yükleyebilirsiniz:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
Kurulumun tamamlandığını ve paket yöneticisinin doğru bağlandığını komut satırından kontrol edin:
node -v
npm -v
Modern JavaScript projelerinde disk alanı tasarrufu ve hızlı paket kurulumu sağlamak için pnpm veya yarn tercih edilebilir. Bu araçları npm üzerinden küresel olarak yükleyebilirsiniz:
sudo npm install -g pnpm yarn
Güvenlik amacıyla sunucu güvenlik duvarını (UFW) yapılandırın. OpenSSH kuralı varsayılan SSH portunu açtığından, farklı bir SSH portu kullanıyorsanız bağlantıyı kaybetmemek için önce kullanılan gerçek SSH portuna izin verip erişimi doğrulayın; ardından web portlarını ekleyin:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
Uygulamanın kaynak dosyalarını barındırmak üzere /var/www hiyerarşisi altında özel bir dizin oluşturun ve izinleri kendi kullanıcınıza devredin:
sudo mkdir -p /var/www/next-app
sudo chown -R $USER:$USER /var/www/next-app
sudo chmod -R 755 /var/www/next-app
Bu adımların ardından sunucunuz kaynak kodları kabul etmeye, bağımlılıkları yüklemeye ve derleme işlemlerini gerçekleştirmeye hazır hale gelir.
Projeyi derleme ve PM2 ile çalıştırma
Kodlarınızı sunucuya aktarmak için Git sürüm kontrol sistemini kullanabilirsiniz. Oluşturduğunuz proje dizinine geçiş yaparak uzak deponuzu sunucuya klonlayın:
cd /var/www/next-app
git clone https://github.com/kullanici-adi/next-projeniz.git .
Kodlar sunucuya indirildikten sonra, derleme öncesinde ortam değişkenleri dosyasının hazırlanması gerekir. Next.js derleme sürecinde NEXT_PUBLIC_ önekli değişkenleri istemci paketlerine gömer; ayrıca statik sayfa ön üretiminde veri tabanı bağlantı bilgileri gibi sunucu değişkenlerine ihtiyaç duyulabilir. Bu nedenle .env.production dosyasını derleme komutundan önce oluşturmalısınız:
nano /var/www/next-app/.env.production
Gerekli değişkenleri dosyaya ekleyip kaydedin:
NODE_ENV=production
PORT=3000
DATABASE_URL="postgresql://kullanici:parola@localhost:5432/veritabani"
NEXT_PUBLIC_SITE_URL="https://ornek.com"
Uygulamanız PostgreSQL veya MySQL gibi bir veri tabanına bağlanıyorsa ve Prisma ORM kullanıyorsanız, istemci kütüphanesini derleme aşamasından önce senkronize etmelisiniz. Ayrıntılı adımlar için Prisma migration adımları rehberini inceleyebilirsiniz.
Bağımlılıkları kurduktan sonra projeyi derleyin:
npm install
npm run build
Derleme bittiğinde Next.js, optimize edilmiş üretim dosyalarını .next dizinine yazar. Süreç yönetimini kalıcı hale getirmek için PM2 (Process Manager 2) kullanılır. PM2, Discord botlarında PM2 kullanımı rehberinde açıklandığı gibi, çöken süreçleri otomatik yeniden başlatır ve kaynak kullanımını izler.
PM2 paketini küresel olarak yükleyin:
sudo npm install -g pm2
Süreci yönetmek üzere projenin kök dizininde ecosystem.config.js dosyası oluşturun:
module.exports = {
apps: [
{
name: 'next-site',
script: 'node_modules/next/dist/bin/next',
args: 'start -p 3000',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
max_memory_restart: '1G'
}
]
};
Uygulamayı PM2 ile başlatın:
pm2 start ecosystem.config.js
pm2 status
Sunucu yeniden başladığında PM2'nin uygulamayı kendiliğinden açması için başlangıç betiğini oluşturun. pm2 startup komutunu çalıştırdığınızda terminal size sudo env PATH=... ile başlayan bir komut satırı verir:
pm2 startup
Terminal ekranında yazdırılan o özel yetkili komutu kopyalayıp çalıştırın. Ardından mevcut süreç listesini kaydedin:
pm2 save
Bu işlemle birlikte Next.js arka planda 3000 portunu dinleyen çoklu çekirdekli bir küme yapısıyla sürekli çalışır duruma gelir.
Nginx ters vekil ve SSL
Next.js dahili sunucusu yerel ağda http://localhost:3000 portunda çalışır. Bu portu dış dünyaya doğrudan açmak güvenlik, SSL yönetimi ve statik varlık önbelleklemesi açısından tercih edilmez. Nginx, ön cephede 80 (HTTP) ve 443 (HTTPS) portlarını karşılayarak istekleri yerel 3000 portuna ileten ters vekil (reverse proxy) olarak konumlandırılır.
Nginx paketini sunucuya kurun ve servisi başlatın:
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
Siteniz için özel bir sanal konak (virtual host) yapılandırma dosyası oluşturun:
sudo nano /etc/nginx/sites-available/next-site.conf
Aşağıdaki yapılandırmayı dosyaya ekleyin. ornek.com ve www.ornek.com alanlarını kendi alan adınızla güncelleyin:
server {
listen 80;
server_name ornek.com www.ornek.com;
location /_next/static/ {
alias /var/www/next-app/.next/static/;
expires 365d;
access_log off;
}
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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_read_timeout 60s;
proxy_connect_timeout 60s;
}
}
Yapılandırmayı etkinleştirmek için sembolik bağ oluşturun ve varsayılan karşılama sayfasını kaldırın:
sudo ln -s /etc/nginx/sites-available/next-site.conf /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
Yapılandırma sözdizimini kontrol edip Nginx servisini yenileyin:
sudo nginx -t
sudo systemctl reload nginx
Daha kapsamlı web sunucusu parametreleri ve optimizasyon seçenekleri için Nginx yapılandırma rehberi içeriğini inceleyebilirsiniz.
Sitenizin bağlantı güvenliğini sağlamak için, tanımlanan her iki alan adının DNS kayıtlarının sunucu IP adresine yönlendiğinden ve HTTP doğrulamasının erişilebilir olduğundan emin olduktan sonra Certbot aracıyla Let's Encrypt SSL sertifikası tanımlayın:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d ornek.com -d www.ornek.com
Certbot, Nginx yapılandırma dosyanıza SSL yollarını ekler ve HTTP isteklerini otomatik olarak HTTPS protokolüne yönlendirir.
Ortam değişkenleri ve güncelleme akışı
Next.js uygulamalarında ortam değişkenlerinin yönetimi derleme ve çalışma zamanı ayrımına göre planlanmalıdır. NEXT_PUBLIC_ önekli değişkenler derleme anında doğrudan istemci JavaScript kodlarına gömülür. Sunucu tarafında okunan değişkenler ise uygulamanın çalışma biçimine göre farklılık gösterir. Statik sayfa üretimi veya generateStaticParams gibi derleme anında veri çeken fonksiyonlarda kullanılan sunucu değişkenleri derleme çıktısını doğrudan etkiler. Bu nedenle derleme aşamasını etkileyen her ortam değişkeni değişikliğinde projenin baştan derlenmesi gerekir. Yalnızca çalışma anında (örneğin her istekte çalışan Server Actions veya dinamik SSR rotalarında) okunan değişkenler ise PM2 sürecinin yeniden yüklenmesiyle aktifleşir.
Çalışan bir uygulamanın aktif dizininde doğrudan npm install ve npm run build komutlarını çalıştırmak risk taşır. Derleme sırasında eski dosyaların silinmesi veya yeni paketlerin eksik yüklenmesi, son kullanıcıların isteklerinin hata ile sonuçlanmasına neden olabilir. Bu durumu önlemek için sürümlü dağıtım mantığı benimsenmelidir. Kodlar ayrı bir sürüm dizininde derlenmeli, işlem başarıyla tamamlandığında sembolik bağ güncellenerek PM2 süreçleri yenilenmelidir.
Sürüm tabanlı dağıtıma geçmeden önce paylaşılan ortam dosyasını barındıracak shared dizinini oluşturun ve önceki adımda hazırladığınız dosyayı buraya kopyalayın:
mkdir -p /var/www/next-app/shared
cp /var/www/next-app/.env.production /var/www/next-app/shared/.env.production
Ardından /var/www/next-app dizininde bir dağıtım betiği hazırlayabilirsiniz:
nano /var/www/next-app/deploy.sh
Aşağıdaki betik mantığını dosyaya ekleyin:
#!/bin/bash
set -e
TIMESTAMP=$(date +%Y%m%d%H%M%S)
RELEASE_DIR="/var/www/next-app/releases/$TIMESTAMP"
SHARED_ENV="/var/www/next-app/shared/.env.production"
CURRENT_DIR="/var/www/next-app/current"
echo "Yeni surum hazirlaniyor: $RELEASE_DIR"
mkdir -p "$RELEASE_DIR"
git clone --depth 1 https://github.com/kullanici-adi/next-projeniz.git "$RELEASE_DIR"
echo "Ortam degiskenleri baglaniyor..."
cp "$SHARED_ENV" "$RELEASE_DIR/.env.production"
cd "$RELEASE_DIR"
echo "Bagimliliklar kuruluyor ve proje derleniyor..."
npm install --production=false
npm run build
echo "Onceki statik dosyalar korunuyor ve sembolik bag guncelleniyor..."
[ -d "$CURRENT_DIR/.next/static" ] && cp -rn "$CURRENT_DIR/.next/static/." "$RELEASE_DIR/.next/static/" 2>/dev/null || true
ln -sfn "$RELEASE_DIR" "$CURRENT_DIR"
echo "PM2 surecleri yenileniyor..."
pm2 reload next-site --update-env
echo "Dagitim tamamlandi."
Betiğe çalıştırma yetkisi verin:
chmod +x /var/www/next-app/deploy.sh
Mevcut süreci doğrudan yeniden başlatmak kayıtlı çalıştırma yolunu yeni sürüm dizinine taşımaz ve ilk kurulumdaki uygulama yolunu korur. Bu nedenle ilk geçişte süreç planlı olarak silinip current altını gösteren cwd ve script ile yeniden oluşturulmalı, ardından pm2 save çalıştırılmalıdır; sonraki dağıtımlarda ise pm2 reload ile süreçler yenilenebilir. Sürümlü dağıtımda Nginx'in eski derlemenin statik dosyalarını sunup yeni dosyalarda 404 hatası vermemesi için statik alias yolunun /var/www/next-app/current/.next/static/ olarak güncellendiğinden ve Nginx'in yeniden yüklendiğinden emin olunmalıdır.
Kaynak ihtiyacı: hangi VDS paketi?
Next.js uygulamalarında kaynak planlaması yaparken çalışma zamanındaki yük kadar derleme (build) aşamasındaki tepe kaynak gereksinimi de hesaba katılmalıdır. Çalışma anında bellek tüketimi gelen eşzamanlı istek sayısına, önbellek kullanımına ve SSR mantığına göre şekillenir. Ancak derleme işlemi; TypeScript denetimleri, sayfa şablonlarının ön üretimi ve kod optimizasyonu sebebiyle işlemci ve belleği en üst sınırda kullanır.
Projenizin gerçek bellek gereksinimi, kod tabanınızın büyüklüğüne ve derleme sırasındaki tepe tüketim miktarına bağlı olarak ölçülmelidir. Terminalde top veya htop komutlarıyla derleme anındaki RAM kullanımını izleyerek projenizin gerçek tüketimini saptayabilirsiniz. Yetersiz bellek durumunda Linux çekirdeğinin OOM (Out Of Memory) mekanizması Node.js sürecini sonlandırır.
Next.js mimarilerinde donanım tercihi, sabit paket kalıpları yerine projenin derleme testleri, anlık eşzamanlı istek hacmi ve medya depolama ihtiyaçlarına göre belirlenmelidir:
| Proje Tipi | Mimari Yapı | Kaynak Planlama Kriterleri |
|---|---|---|
| Giriş Seviyesi | Statik ağırlıklı, sınırlı dinamik rota | Derleme anındaki tepe bellek kullanımı ve temel sistem servisleri |
| Gelişmiş SSR | Yoğun veri tabanı sorguları, API rotaları | Eşzamanlı istek yükü, veri işleme hacmi ve Node.js çalışma zamanı belleği |
| Kurumsal / Çoklu İstek | Kümeleme modu, dinamik görsel optimizasyonu | PM2 küme modundaki her ayrı Node.js sürecinin bellek tüketimi, çekirdek gereksinimi ve statik önbellek alanı |
Büyükweb sanal sunucu altyapısı VMware sanallaştırma teknolojisi ve Intel Xeon E5 işlemciler üzerinde çalışır. NVMe diskler, Next.js derleme sürecinde oluşturulan binlerce geçici dosyanın hızlıca işlenmesini sağlar. Sunucu tercihinizi planlarken VDS satın alma kriterleri rehberinde belirtilen kıstasları göz önünde bulundurabilirsiniz.
Bellek yetersizliği kaynaklı derleme kesintilerini önlemek adına sisteme takas alanı (swap space) tanımlanması tavsiye edilir. İşleme başlamadan önce swapon --show komutuyla etkin takas alanlarını, /swapfile dosyasının varlığını ve /etc/fstab kaydını kontrol edin; sistemde tanımlı bir alan yoksa aşağıdaki adımlarla 2 GB takas alanı ekleyebilirsiniz:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Projenizin büyüklüğüne ve derleme sırasındaki tepe kaynak gereksinimine uygun donanımı belirledikten sonra Büyükweb VDS sunucu paketleri arasından uygun kapasiteyi seçerek kurulum adımlarını uygulayabilirsiniz.
Sık Sorulan Sorular
Next.js projesi için en az ne kadar RAM gerekir?
Next.js uygulamalarında kesin bir bellek alt sınırı projenin kod yapısına göre değişir. Çalışma zamanında tüketim düşük olsa bile derleme sırasındaki tepe bellek ihtiyacı gerçek projede ölçülmelidir. Takas alanı (swap) tanımlanmamış düşük bellekli sistemlerde derleme aşaması yetersiz kaynak nedeniyle yarıda kalabilir.
Vercel yerine neden VDS tercih edilmeli?
Vercel pratik dağıtım imkanları sunsa da sunucusuz fonksiyon yürütme sınırları, bant genişliği kotaları ve özel ağ gereksinimlerinde ek maliyetler oluşturabilir. VDS kullandığınızda sunucu kaynaklarını, portları ve arka plan servislerini bağımsızca denetleyebilir, veri tabanınızı aynı yerel ağda düşük gecikmeyle çalıştırabilirsiniz.
PM2 yerine Docker kullanmak gerekir mi?
Docker, uygulamayı sistem kütüphaneleriyle birlikte izole bir konteyner haline getirmek için kullanışlıdır. Ancak tek bir sunucuda ek sanallaştırma katmanı olmadan doğrudan Node.js çalıştırmak isteyenler için PM2 daha az ek yük oluşturur. İhtiyacınıza göre doğrudan PM2 kümelemesi veya Docker mimarisi tercih edilebilir.
SSL sertifikasının süresi dolduğunda ne yapılır?
Let's Encrypt sertifikaları 90 gün boyunca geçerliliğini korur. Certbot paketi kurulum sırasında sisteme bir zamanlayıcı ekleyerek süresi dolmaya yaklaşan sertifikaları arka planda kendiliğinden yeniler. Yenileme sürecinin düzgün çalıştığını doğrulamak için sudo certbot renew --dry-run komutunu çalıştırmanız yeterlidir.
Sunucu Yönetimi İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:



