Nginx SSL/TLS Otomatik Kurulum

Nginx web sunucusuna Let's Encrypt ile ücretsiz SSL/TLS sertifikası kuran ve otomatik yenileme yapılandıran script.

Yayınlanma: 15.02.2024 Güncellenme: 05.12.2024

Detaylı Bilgi

Bu script, Nginx web sunucunuza Let's Encrypt ile ücretsiz SSL/TLS sertifikası kurar ve otomatik yenileme yapılandırır. HTTPS, modern web siteleri için zorunludur ve SEO, güvenlik ve kullanıcı güveni açısından kritik öneme sahiptir.

Script Ne İşe Yarar?

Bu script, SSL/TLS sertifikası kurulum sürecini tamamen otomatikleştirir:

  • Certbot aracını kurar (yoksa)
  • Nginx yapılandırması oluşturur
  • Let's Encrypt'ten ücretsiz SSL sertifikası alır
  • HTTPS yönlendirmesi yapılandırır
  • Otomatik sertifika yenileme ayarlar

Neden Kullanmalısınız?

HTTPS, modern web için zorunludur çünkü:

  • Güvenlik: Veri şifreleme sağlar
  • SEO: Google HTTPS'i tercih eder
  • Güven: Kullanıcılar güvenli bağlantı görür
  • Performans: HTTP/2 desteği
  • Zorunluluk: Modern tarayıcılar HTTP'yi uyarır

Let's Encrypt Avantajları

  • Tamamen ücretsiz
  • Otomatik yenileme
  • Güvenilir ve yaygın kullanılan
  • 90 günlük sertifika süresi (otomatik yenilenir)

Nasıl Kullanılır?

Adım Adım Kullanım Kılavuzu

1. Ön Gereksinimler

Scripti çalıştırmadan önce:

  • Domain adınızın sunucunun IP adresine işaret ettiğinden emin olun
  • 80 ve 443 portlarının açık olduğundan emin olun
  • Nginx kurulu olmalı

2. DNS Kontrolü

# Domain'in IP'ye işaret ettiğini kontrol et
nslookup yourdomain.com
dig yourdomain.com

# A kaydı doğru olmalı
# A     yourdomain.com    192.168.1.100

3. Scripti Çalıştırın

sudo ./nginx_ssl_setup.sh

Script sizden domain adı ve e-posta adresi isteyecektir.

4. Doğrulama

Script çalıştıktan sonra:

# SSL sertifikasını kontrol et
certbot certificates

# Nginx yapılandırmasını test et
nginx -t

# Sertifika yenilemeyi test et
certbot renew --dry-run

Otomatik Yenileme

Let's Encrypt sertifikaları 90 günde bir otomatik olarak yenilenir. Sistemde bir cron job veya systemd timer kurulu olmalı:

# Cron job kontrolü
systemctl status certbot.timer

# Manuel yenileme
sudo certbot renew

Gereksinimler

Gereksinimler

  • Root Yetkisi: Script root olarak çalıştırılmalı
  • Nginx: Web sunucusu kurulu olmalı
  • Domain Adı: Geçerli bir domain adı ve DNS kaydı
  • Açık Portlar: 80 (HTTP) ve 443 (HTTPS) portları açık olmalı
  • Python 3: Certbot için gerekli
  • İnternet Bağlantısı: Let's Encrypt'e erişim

DNS Yapılandırması

Domain adınızın sunucunuzun IP adresine işaret etmesi gerekir:

# DNS kaydı örneği
A     yourdomain.com    192.168.1.100
A     www.yourdomain.com    192.168.1.100

Port Kontrolü

# Portların açık olduğunu kontrol et
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Veya firewall kurallarını kontrol et
sudo iptables -L -n | grep -E "80|443"

Kullanım Senaryoları

Kullanım Senaryoları

1. Yeni Web Sitesi Kurulumu

Yeni bir web sitesi kurduğunuzda, SSL sertifikasını hızlıca kurmak için bu scripti kullanabilirsiniz.

2. HTTP'den HTTPS'e Geçiş

Mevcut HTTP sitelerinizi HTTPS'e geçirmek için kullanabilirsiniz. Script otomatik yönlendirme yapılandırır.

3. Çoklu Domain Yönetimi

Birden fazla domain için SSL sertifikası kurmanız gerekiyorsa, scripti her domain için çalıştırabilirsiniz.

4. Test Ortamları

Test ortamlarında da SSL sertifikası kurmak için kullanabilirsiniz. Let's Encrypt test ortamları için de çalışır.

5. Wildcard Sertifikalar

Scripti düzenleyerek wildcard sertifikalar (*.domain.com) için de kullanabilirsiniz.

Örnekler

Kullanım Örnekleri

Örnek 1: Temel Kullanım

# Scripti çalıştır
sudo ./nginx_ssl_setup.sh

# Domain ve e-posta girin
Enter your domain name: example.com
Enter your email: [email protected]

# Script otomatik olarak:
# - Certbot kurar
# - Nginx yapılandırması oluşturur
# - SSL sertifikası alır
# - HTTPS yönlendirmesi yapar

Örnek 2: Wildcard Sertifika

# Scripti düzenleyerek wildcard sertifika alın
certbot certonly --dns-cloudflare \
    -d "*.example.com" \
    -d "example.com"

Örnek 3: Çoklu Domain

# Birden fazla domain için sertifika
certbot --nginx \
    -d example.com \
    -d www.example.com \
    -d api.example.com \
    -d admin.example.com

Kod

#!/bin/bash

# Nginx SSL/TLS Auto Setup with Let's Encrypt

if [ "$EUID" -ne 0 ]; then 
    echo "Please run as root"
    exit 1
fi

read -p "Enter your domain name: " DOMAIN
read -p "Enter your email: " EMAIL

echo ""
echo "Setting up SSL for $DOMAIN"
echo ""

if ! command -v certbot &> /dev/null; then
    echo "Installing certbot..."
    apt-get update
    apt-get install -y certbot python3-certbot-nginx
fi

if ! systemctl is-active --quiet nginx; then
    echo "Starting nginx..."
    systemctl start nginx
fi

NGINX_CONF="/etc/nginx/sites-available/$DOMAIN"

cat > "$NGINX_CONF" <<EOF
server {
    listen 80;
    listen [::]:80;
    server_name $DOMAIN www.$DOMAIN;
    
    location / {
        proxy_pass http://localhost: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;
    }
}
EOF

ln -sf "$NGINX_CONF" /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

echo "✓ Nginx configuration created"
echo ""

echo "Obtaining SSL certificate..."
certbot --nginx -d "$DOMAIN" -d "www.$DOMAIN" --non-interactive --agree-tos --email "$EMAIL" --redirect

if [ $? -eq 0 ]; then
    echo "✓ SSL certificate installed successfully"
    echo ""
    
    echo "Testing automatic renewal..."
    certbot renew --dry-run
    
    if [ $? -eq 0 ]; then
        echo "✓ Automatic renewal is configured"
    else
        echo "⚠️  Warning: Automatic renewal test failed"
    fi
else
    echo "✗ Failed to obtain SSL certificate"
    exit 1
fi

echo ""
echo "======================================"
echo "SSL Setup Complete!"
echo "======================================"
echo "Your site is now available at:"
echo "https://$DOMAIN"
echo ""
echo "Certificate will auto-renew before expiration"
echo "You can manually renew with: certbot renew"

Kullanım

# Root olarak çalıştır
sudo chmod +x nginx_ssl_setup.sh
sudo ./nginx_ssl_setup.sh

# Domain adınızı ve e-postanızı girin
# Script otomatik olarak SSL kuracak

Sorun Giderme

Sorun Giderme

Problem: "Failed to obtain certificate"

Çözüm: DNS kayıtlarını kontrol edin. Domain sunucunun IP'sine işaret etmeli:

# DNS kontrolü
nslookup yourdomain.com
dig yourdomain.com +short

Problem: "Port 80 is already in use"

Çözüm: 80 portunu kullanan servisi bulun ve durdurun:

sudo netstat -tulpn | grep :80
sudo systemctl stop apache2  # Apache kullanıyorsanız

Problem: "Nginx configuration test failed"

Çözüm: Nginx yapılandırmasını kontrol edin:

nginx -t
# Hataları düzeltin ve tekrar deneyin

Problem: Sertifika Yenilenmiyor

Çözüm: Certbot timer'ı kontrol edin:

systemctl status certbot.timer
systemctl enable certbot.timer
systemctl start certbot.timer

Etiketler

nginx ssl https lets encrypt certbot