Komutları üretim sunucusunda çalıştırmadan önce yedek alın ve mümkünse bir test ortamında deneyin. Yönetim erişiminizi (SSH, panel) kaybetmemek için ayar değişikliklerinde açık bir ikinci oturum bulundurun.
Bu rehberde ne yapacağız?
Bu rehberde Nginx web sunucusunu Linux sunucuya kuracak ve temel sertleştirme ayarlarını uygulayacaksınız: sürüm bilgisini gizleme, güvenlik başlıkları, TLS protokol ayarı, istek ve bağlantı sınırlama, gizli dosyalara erişimi engelleme. Hosting ve sunucu yöneticileri için hazırlanmıştır; yaklaşık 40 dakika sürer.
Nginx hafif ve hızlıdır, ancak varsayılan yapılandırması üretim güvenliği için yeterli değildir. Küçük ayarlar saldırı yüzeyini daraltır. Her değişiklikten önce yapılandırmayı test etmek ve yedek almak kesintiyi önler.
Gereksinimler
- Debian/Ubuntu veya AlmaLinux/Rocky Linux sunucu ve sudo yetkisi
- Alan adı ve (HTTPS için) geçerli bir TLS sertifikası; sertifika kurulumu bu rehberin kapsamı dışındadır
- 80 ve 443 portlarının güvenlik duvarında açık olması
- Mevcut yapılandırmanın yedeği:
sudo cp -r /etc/nginx /etc/nginx.yedek
Adım adım Nginx kurulumu ve sertleştirme
1. Nginx'i kurun
Debian/Ubuntu için:
sudo apt update
sudo apt install nginxAlmaLinux/Rocky için:
sudo dnf install nginx
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reloadsudo systemctl enable --now nginx2. Yapılandırma yapısını tanıyın
Ana dosya /etc/nginx/nginx.conf'tur. Debian/Ubuntu'da siteler /etc/nginx/sites-available/ içinde yazılır ve sites-enabled/ altına bağlanır; AlmaLinux/Rocky'de site dosyaları /etc/nginx/conf.d/*.conf olarak eklenir. Aşağıdaki genel ayarları nginx.conf dosyasındaki http { } bloğuna ekleyin.
3. Sürüm bilgisini gizleyin ve istek sınırlarını koyun
server_tokens off;
client_max_body_size 10m;
client_body_timeout 15s;
client_header_timeout 15s;
keepalive_timeout 15s;
send_timeout 15s;client_max_body_size değerini uygulamanızın gerçek yükleme ihtiyacına göre ayarlayın.
4. TLS protokollerini kısıtlayın
Eski ve zayıf protokolleri kapatın. Şifre takımları için Mozilla SSL Configuration Generator gibi güncel bir kaynağa başvurmanız önerilir; Nginx'in varsayılan şifre takımı da modern sürümlerde makuldür.
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;5. Güvenlik başlıklarını ekleyin
Bu başlıkları server { } bloğunuza ekleyin. always ifadesi hata yanıtlarında da başlığın gönderilmesini sağlar. Content-Security-Policy uygulamaya özgüdür; denemeden eklemeyin.
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
add_header Strict-Transport-Security 'max-age=31536000' always;Dikkat: Strict-Transport-Security başlığı tarayıcıya yalnızca HTTPS kullanmasını söyler. HTTPS'in tüm alt alan adlarında sorunsuz çalıştığından emin olmadan uzun süreyle etkinleştirmeyin; önce kısa bir süreyle test edin.
6. Gizli dosyalara ve gereksiz yönteme erişimi engelleyin
Nokta ile başlayan dosyalar (.git, .env, .htpasswd gibi) dışarıya açılmamalıdır. Let's Encrypt doğrulaması için .well-known yolu hariç tutulur.
location ~ /\.(?!well-known) {
deny all;
}7. İstek hızını sınırlayın
http { } bloğunda bir bölge tanımlayın, hassas konumlarda (örneğin giriş sayfası) kullanın.
limit_req_zone $binary_remote_addr zone=genel:10m rate=10r/s;
server {
location /giris {
limit_req zone=genel burst=20 nodelay;
}
}8. Varsayılan sunucuyu kapatın
Alan adı eşleşmeyen isteklere varsayılan siteyi sunmak yerine bağlantıyı kapatın. Debian/Ubuntu'daki sites-enabled/default dosyası zaten default_server tanımlar; aynı port için iki default_server olursa nginx -t hata verir. Önce bu bağlantıyı sudo rm /etc/nginx/sites-enabled/default ile kaldırın veya örneği o dosyaya uygulayın. HTTPS için eşdeğer blokta Nginx 1.19.4 ve sonrasında ssl_reject_handshake on; kullanılabilir.
server {
listen 80 default_server;
server_name _;
return 444;
}9. Test edin ve yeniden yükleyin
sudo nginx -t
sudo systemctl reload nginxDoğrulama
Sözdiziminin geçerli olduğunu ve başlıkların yanıtta görüldüğünü doğrulayın.
sudo nginx -t
curl -sI https://alanadiniz.examplenginx -t çıktısında syntax is ok ve test is successful görmelisiniz. Yanıt başlıklarında Server: nginx satırı sürüm numarası olmadan görünmeli, tanımladığınız güvenlik başlıkları listelenmelidir. Nokta ile başlayan bir yola (örneğin /.env) istek attığınızda 403 almalısınız. TLS ayarlarını SSL Labs gibi bir testle de değerlendirebilirsiniz.
Sık karşılaşılan sorunlar
- nginx -t hata veriyor: noktalı virgül eksikliği veya yanlış blok yerleşimi vardır. Hata mesajındaki satır numarasına bakın.
- 502 Bad Gateway: arka uç (PHP-FPM, uygulama) çalışmıyor ya da soket yolu yanlıştır.
- Başlıklar görünmüyor: add_header bir alt blokta tanımlanırsa üst bloktaki add_header'ları geçersiz kılar. Başlıkları ilgili blokta birlikte tanımlayın.
- AlmaLinux/Rocky'de bağlantı reddi: SELinux veya güvenlik duvarı engelliyor olabilir. Arka uca bağlanma için
httpd_can_network_connectmantıksal değerini ve firewalld servislerini kontrol edin. - Let's Encrypt yenilemesi başarısız: .well-known yolunu engellediniz.
Güvenlik ve bakım notları
- Nginx ve işletim sistemi paketlerini düzenli güncelleyin.
- Her yapılandırma değişikliğinden önce yedek alın, uygulamadan önce
nginx -tçalıştırın. - Gereksiz modülleri ve kullanılmayan site dosyalarını kaldırın.
- Erişim ve hata günlüklerini düzenli inceleyin, logrotate ile döndürün.
- Yönetim ve durum uç noktalarını (stub_status gibi) yalnızca yerel veya yönetim adreslerine açın.
- Bir uygulama güvenlik duvarı (WAF) katmanını ihtiyaca göre değerlendirin.
Sık sorulan sorular
server_tokens off gerçek koruma sağlar mı?
Tek başına koruma sağlamaz, yalnızca sürüm bilgisini gizleyerek otomatik taramaları zorlaştırır. Asıl koruma güncel yazılım ve doğru yapılandırmadır.
Nginx yapılandırmasını yeniden yüklemek bağlantıları keser mi?
Hayır, reload mevcut bağlantıları koruyarak yeni çalışanları başlatır. Önce nginx -t ile test ettiğinizden emin olun.
HSTS'i ne zaman açmalıyım?
HTTPS tüm site ve alt alan adlarında sorunsuz çalışıyorsa açın. Başlangıçta kısa bir max-age ile deneyip süreyi kademeli artırın; geri alması zor olabilir.
İlgili sözlük terimleri
Bu kategorideki diğer rehberler
- Postfix ile giden e-posta yönlendirme (smarthost) ve temel güvenlikPostfix ile giden e-postaları kimlik doğrulamalı SMTP röle (smarthost) üzerinden TLS ile gönderme, yalnızca yerel kullanım için güvenli yapılandırma ve açık röle kontrolü rehberi.
- logrotate yapılandırması: günlük döndürme, sıkıştırma ve saklamalogrotate ile günlük dosyalarını döndürme, sıkıştırma ve saklama süresini ayarlama; özel uygulama günlükleri için yapılandırma yazma, test etme ve sık hataları çözme rehberi.
- GoAccess ile Nginx/Apache web log analiziGoAccess ile Nginx ve Apache erişim günlüklerini terminalde ve HTML rapor olarak analiz etme, log formatı seçimi, gz arşivlerini okuma, zamanlanmış rapor ve erişim koruması rehberi.
- Memcached kurulumu ve güvenliğiMemcached önbellek sunucusunu Debian ve RHEL tabanlı sistemlere kurma, UDP kapatma, bind adresi ve güvenlik duvarıyla erişimi kısıtlama ve SASL notlarını içeren güvenli kurulum rehberi.