Performance & Scalability serimizin bir parçası
Tam kılavuzu okuyunNginx Üretim Yapılandırması: SSL, Önbelleğe Alma ve Güvenlik
Nginx, neredeyse tüm yüksek trafikli web dağıtımlarını yöneten üretim web sunucusudur. İyi yapılandırıldığında, tek bir istek Node.js uygulamanıza ulaşmadan önce SSL sonlandırma, verimli statik dosya sunumu, WebSocket proxy oluşturma, hız sınırlama ve güvenlik başlıkları sağlar. Kötü yapılandırıldığında bir darboğaz, güvenlik yükümlülüğü veya gizemli Cloudflare yönlendirme döngülerinin nedeni haline gelir.
Bu kılavuz, çoklu uygulamalı Node.js dağıtımı için üretim düzeyinde Nginx yapılandırmasını kapsar: Next.js ön ucu, NestJS API ve Docusaurus belgeleri — tümü Cloudflare'in arkasındaki aynı sunucuda çalışır.
Önemli Çıkarımlar
- www ve www olmayanları hiçbir zaman Cloudflare'in arkasında ayrı sunucu bloklarına bölmeyin — yönlendirme döngülerine neden olur
/etc/nginx/conf.d/içinde tek bir Nginx yapılandırma dosyası kullanın — ayrıcasites-enabled/içinde sembolik bağlantı kullanmayınX-XSS-Protectionkullanımdan kaldırıldı — bunun yerine CSP'yi kullanın;X-Frame-Options: DENYhâlâ geçerliproxy_passyol öneki kullanılırken sonunda eğik çizgi bulunmalıdır- Metin/* MIME türleri için Gzip sıkıştırması her zaman etkinleştirilmeye değerdir
- Hız sınırlaması,
server{}düzeyinde değil,http{}düzeyinde tanımlanmışlimit_req_zonegerektirir- Sertifikaları Certbot ile otomatik olarak yenileyelim; yenileme sonrasında Nginx'i yeniden yüklemek için bir cron işi ekleyin
- WebSocket proxy'si belirli başlıklar gerektirir:
UpgradeveConnection
Dizin Yapısı
Nginx yapılandırmasını düzenli tutun:
/etc/nginx/
nginx.conf — Main config (rarely touch this)
conf.d/
ecosire-production.conf — All your server blocks in ONE file
snippets/
ssl-params.snippet — SSL hardening (included by server blocks)
proxy-params.snippet — Common proxy headers
security-headers.snippet — Security headers
Kritik: Tüm yapılandırmanızı conf.d/ecosire-production.conf içine yerleştirin. Bunu sites-enabled/'ye de EKLEMEYİN; bu, Nginx'in yapılandırmayı iki kez işlemesine neden olarak yinelenen limit_req_zone hatalarına ve beklenmeyen davranışlara yol açar.
Hız Sınırlama Bölgeleri
Yapılandırmanızda http{} düzeyinde hız sınırlama bölgelerini tanımlayın. server{} blokları içinde tanımlanamazlar:
# /etc/nginx/conf.d/ecosire-production.conf
# Must be at http{} level — these are in the main conf or conf.d root
limit_req_zone $binary_remote_addr zone=api_general:10m rate=60r/m;
limit_req_zone $binary_remote_addr zone=api_auth:10m rate=10r/m;
limit_req_zone $binary_remote_addr zone=api_public:10m rate=30r/m;
limit_req_zone $binary_remote_addr zone=static_files:10m rate=200r/m;
Ana Uygulama Sunucusu Bloğu
# Main web application — Next.js on port 3000
server {
listen 80;
listen [::]:80;
server_name ecosire.com www.ecosire.com;
# Cloudflare handles SSL termination — Nginx only sees HTTP
# (If direct SSL, add listen 443 ssl and certificate paths)
# Security headers
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
# CSP — adjust based on your needs
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://js.stripe.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; frame-src https://js.stripe.com; connect-src 'self' https://api.ecosire.com;" always;
# Remove server version from responses
server_tokens off;
# Gzip compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
image/svg+xml
font/woff2;
gzip_min_length 1024;
# ─── Static Files: Next.js build output ─────────────────────────
location /_next/static/ {
proxy_pass http://127.0.0.1:3000;
add_header Cache-Control "public, max-age=31536000, immutable";
# Files include content hash in filename — safe to cache forever
}
# ─── Public static assets ────────────────────────────────────────
location /assets/ {
proxy_pass http://127.0.0.1:3000;
add_header Cache-Control "public, max-age=86400"; # 1 day
}
# ─── Well-known files (no locale prefix) ─────────────────────────
location /.well-known/ {
proxy_pass http://127.0.0.1:3000;
add_header Cache-Control "public, max-age=86400";
}
# ─── App routes (rate limited) ───────────────────────────────────
location / {
limit_req zone=api_general burst=20 nodelay;
limit_req_status 429;
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_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_cache_bypass $http_upgrade;
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
API Sunucu Bloğu
# NestJS API — port 3001
server {
listen 80;
listen [::]:80;
server_name api.ecosire.com;
server_tokens off;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# CORS — handled by NestJS, but Nginx can add preflight response
# for performance (avoids reaching Node.js for OPTIONS)
location / {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin "https://ecosire.com";
add_header Access-Control-Allow-Methods "GET, POST, PUT, PATCH, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type, Authorization";
add_header Access-Control-Allow-Credentials "true";
add_header Access-Control-Max-Age 1728000;
add_header Content-Length 0;
return 204;
}
limit_req zone=api_general burst=30 nodelay;
proxy_pass http://127.0.0.1:3001;
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_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# Stricter rate limits for auth endpoints
location ~ ^/api/auth/(login|exchange|callback) {
limit_req zone=api_auth burst=5 nodelay;
limit_req_status 429;
proxy_pass http://127.0.0.1:3001;
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;
}
# Health check — no rate limiting
location /api/health {
proxy_pass http://127.0.0.1:3001;
proxy_set_header Host $host;
access_log off; # Don't log health check spam
}
# Stripe webhook — needs raw body
location /api/billing/webhook {
proxy_pass http://127.0.0.1:3001;
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;
# No rate limiting on webhooks — Stripe IPs are trusted
# NestJS validates the Stripe signature
}
}
WebSocket Proxy'si
Uygulamanız WebSockets (Socket.IO, NestJS WebSocket ağ geçidi) kullanıyorsa proxy yapılandırmasının belirli başlıklara ihtiyacı vardır:
# WebSocket upgrade handling
location /ws/ {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade"; # Capital U required
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# WebSocket connections can be long-lived
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
Upgrade ve Connection üstbilgileri olmadan, tarayıcının WebSocket anlaşması 426 Upgrade Required veya 101 Switching Protocols hatasıyla başarısız olur.
Doğrudan SSL (Cloudflare Olmadan)
Cloudflare kullanmıyorsanız SSL sonlandırmayı doğrudan Nginx'te gerçekleştirin:
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name ecosire.com;
ssl_certificate /etc/letsencrypt/live/ecosire.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ecosire.com/privkey.pem;
# SSL hardening
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# ... rest of server block
}
# HTTP to HTTPS redirect
server {
listen 80;
listen [::]:80;
server_name ecosire.com www.ecosire.com;
return 301 https://ecosire.com$request_uri;
}
Cloudflare'e Özel Yapılandırma
Cloudflare'in arkasında Nginx yalnızca Cloudflare'in IP'lerini görür. Gerçek istemci IP'lerini korumak için:
# Real IP from Cloudflare — add this in http{} or at top of server{}
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
Ayrıca: Cloudflare kullanırken asla www.ecosire.com ve ecosire.com'yi ayrı Nginx sunucu bloklarına bölmeyin. Cloudflare, www yönlendirmesini uç noktasında yönetir. Www olmayanlara yönlendiren bir www sunucu bloğu eklerseniz ve Cloudflare de www'yi yönlendiriyorsa, bir yönlendirme döngüsü (ERR_TOO_MANY_REDIRECTS) elde edersiniz.
Günlük Yapılandırması
# Custom log format with useful fields
log_format json_combined escape=json
'{'
'"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"cf_ip":"$http_cf_connecting_ip",'
'"method":"$request_method",'
'"uri":"$request_uri",'
'"status":$status,'
'"body_bytes":$body_bytes_sent,'
'"response_time":$request_time,'
'"referrer":"$http_referer",'
'"user_agent":"$http_user_agent"'
'}';
access_log /var/log/nginx/ecosire-access.log json_combined;
error_log /var/log/nginx/ecosire-error.log warn;
Yapılandırmanızı Test Etme
# Test syntax before applying
nginx -t
# Reload without downtime
nginx -s reload
# Check which config file is active
nginx -T | grep "configuration file"
# Test a specific server block
curl -I https://ecosire.com
curl -I https://api.ecosire.com/api/health
# Check security headers
curl -I https://ecosire.com | grep -E "X-Frame|X-Content|Referrer|Content-Security"
Sıkça Sorulan Sorular
Yeni bir proje için Nginx mi yoksa Caddy mi kullanmalıyım?
Caddy'nin yapılandırılması çok daha basittir; Let's Encrypt SSL'yi otomatik olarak yönetir ve kutudan çıktığı anda mantıklı varsayılanlara sahiptir. Nginx daha güçlüdür ve daha geniş bir modül ve belge ekosistemine sahiptir. Çoğu yeni proje için Caddy daha iyi bir başlangıç noktasıdır; SSL, karmaşık yukarı akış yönlendirme veya Nginx'e özgü modüller üzerinde ayrıntılı kontrole ihtiyacınız varsa Nginx'e geçin. Nginx'in zaten kurulu olduğu mevcut Linux sunucuları için Nginx'e sadık kalın.
Yinelenen limit_req_zone hatasını nasıl önleyebilirim?
limit_req_zone yönergesi server{} bloklarının içinde değil, http{} bağlam düzeyinde görünmelidir. Birden fazla yapılandırma dosyası eklediğiniz bir Turborepo monorepo dağıtımında, yönergenin dahil edilen tüm dosyalarda yalnızca bir kez göründüğünden emin olun. Hatayı görüyorsanız, aynı dosyayı işaret eden hem conf.d/app.conf hem de sites-enabled/ sembolik bağlantısının olup olmadığını kontrol edin.
Next.js ISR (Artımlı Statik Yenileme) için Nginx'i nasıl yapılandırabilirim?
Next.js, ISR'yi dahili olarak yönetir; Nginx'in, yanıtları önbelleğe almadan tüm istekleri Next.js'ye proxy olarak göndermesi yeterlidir. Next.js'nin ISR önbellek başlıklarını engelleyen Cache-Control başlıklarını eklemeyin. /_next/static/ içindeki statik varlıklar için, bu dosyalar içerik karma adlarına sahip olduğundan immutable önbellek başlıklarını ekleyin. Diğer tüm rotalar için Next.js'nin önbellek başlıklarını ayarlamasına izin verin.
Cloudflare etkinleştirildiğinde SSL puanım neden düşüyor?
Cloudflare proxy modundayken, SSL Labs sizinkini değil Cloudflare'in SSL'sini test eder. Cloudflare'in kaynak sertifikanızı doğruladığından emin olmak için Cloudflare'in SSL modunu "Tam (Katı)" olarak ayarlayın. Sunucunuza Cloudflare Origin Sertifikası yükleyin; ücretsizdir ve 15 yıl geçerlidir. SSL Labs puanınız Cloudflare'in puanı (genellikle A+) olur ve bu aslında kendi kendine yapılandırılmış tipik bir Nginx SSL kurulumuna göre bir gelişmedir.
Aynı sunucuda birden fazla Node.js uygulamasını nasıl yönetirim?
Her uygulamayı farklı bir bağlantı noktasında çalıştırın (3000'de Next.js, 3001'de NestJS, 3002'de Docusaurus vb.) ve Nginx yapılandırmanızdaki her alt alan adı için bir sunucu bloğu ekleyin. Tüm Node.js işlemlerini yönetmek için PM2'yi kullanın. Nginx, alt etki alanına (veya yol önekine) göre doğru bağlantı noktasına yönlendirir. Her sunucu bloğunun kendi hız sınırlaması, önbelleğe alma ve güvenlik başlığı yapılandırması olabilir.
Sonraki Adımlar
Üretim Nginx yapılandırması yaşayan bir belgedir; uygulamanızın gereksinimleri değiştikçe, trafik kalıplarınız değiştikçe ve yeni güvenlik en iyi uygulamaları ortaya çıktıkça gelişir. ECOSIRE, Nginx'i üretimde birden fazla uygulamaya hizmet ederek çalıştırır, SSL sonlandırmayı, hız sınırlamayı ve tüm etki alanlarında Cloudflare entegrasyonunu yönetir.
İster DevOps danışmanlığına, üretim altyapısı kurulumuna veya eksiksiz bir dağıtım mimarisi tasarımına ihtiyacınız olsun, nasıl yardımcı olabileceğimizi görmek için hizmetlerimizi keşfedin.
Yazan
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
ECOSIRE
ECOSIRE ile İşinizi Büyütün
ERP, e-Ticaret, yapay zeka, analitik ve otomasyon genelinde kurumsal çözümler.
İlgili Makaleler
E-ticaret için Yapay Zeka Dolandırıcılık Tespiti: Satışları Engellemeden Geliri Koruyun
Sahte pozitif oranları %2'nin altında tutarken, sahtekarlık işlemlerinin %95'ten fazlasını yakalayan yapay zeka sahtekarlık tespitini uygulayın. Makine öğrenimi puanlaması, davranış analizi ve yatırım getirisi kılavuzu.
API Hız Sınırlaması: Kalıplar ve En İyi Uygulamalar
Belirteç kümesi, kayan pencere ve sabit sayaç modelleri ile ana API hızı sınırlaması. NestJS kısıtlayıcı, Redis ve gerçek dünyadan yapılandırma örnekleriyle arka ucunuzu koruyun.
Siber Güvenlik Trendleri 2026-2027: Sıfır Güven, Yapay Zeka Tehditleri ve Savunma
2026-2027 siber güvenlik trendlerine ilişkin eksiksiz kılavuz: Yapay zeka destekli saldırılar, sıfır güven uygulaması, tedarik zinciri güvenliği ve dayanıklı güvenlik programları oluşturma.
Performance & Scalability serisinden daha fazlası
Web Kancası Hata Ayıklama ve İzleme: Eksiksiz Sorun Giderme Kılavuzu
Arıza modellerini, hata ayıklama araçlarını, yeniden deneme stratejilerini, izleme kontrol panellerini ve en iyi güvenlik uygulamalarını kapsayan bu eksiksiz kılavuzla webhook hata ayıklama konusunda uzmanlaşın.
k6 Yük Testi: Lansmandan Önce API'lerinize Stres Testi Yapın
Node.js API'leri için k6 yük testinde uzmanlaşın. Sanal kullanıcı artışlarını, eşikleri, senaryoları, HTTP/2, WebSocket testini, Grafana kontrol panellerini ve CI entegrasyon modellerini kapsar.
Odoo Performans Ayarlama: PostgreSQL ve Sunucu Optimizasyonu
Odoo 19 performans ayarlaması için uzman kılavuzu. Kurumsal dağıtımlar için PostgreSQL yapılandırmasını, indekslemeyi, sorgu optimizasyonunu, Nginx önbelleğe almayı ve sunucu boyutlandırmayı kapsar.
Odoo ve Acumatica: Büyüyen İşletmeler için Bulut ERP
Odoo ve Acumatica'nın 2026 karşılaştırması: benzersiz fiyatlandırma modelleri, ölçeklenebilirlik, üretim derinliği ve hangi bulut ERP'nin büyüme yörüngenize uyduğu.
Üretimde Yapay Zeka Aracılarını Test Etme ve İzleme
Üretim ortamlarında yapay zeka aracılarını test etmeye ve izlemeye yönelik eksiksiz bir kılavuz. OpenClaw dağıtımları için değerlendirme çerçevelerini, gözlemlenebilirliği, sapma tespitini ve olay müdahalesini kapsar.
OpenClaw ile Uyumluluk İzleme Temsilcileri
Sürekli uyumluluk izleme için OpenClaw AI aracılarını dağıtın. Mevzuat kontrollerini, politika uygulamasını, denetim takibi oluşturmayı ve uyumluluk raporlamasını otomatikleştirin.