Takip et

AWS EC2’de NGINX Otomatik Kurulumu: Bash Script ile Hızlandırma Rehberi

AWS EC2 sunucuları üzerinde NGINX kurulumu ve yapılandırması, manuel olarak yapıldığında zaman alıcı ve hataya açık bir süreç olabilir. Bu makale, Bash script kullanarak bu süreci nasıl otomatikleştireceğinizi, hem yeni başlayanlar hem de deneyimli kullanıcılar için adım adım pratik örneklerle açıklayarak, dağıtım hızınızı ve tutarlılığınızı önemli ölçüde artırmanızı sağlayacaktır.

Modern yazılım geliştirme ve operasyon dünyasında hız, tutarlılık ve ölçeklenebilirlik, başarı için kritik öneme sahiptir. Özellikle birden fazla sunucu üzerinde benzer yapılandırmaların tekrarlandığı senaryolarda manuel süreçler hem zaman kaybına yol açar hem de insan kaynaklı hataların olasılığını artırır. İşte tam da bu noktada otomasyon devreye giriyor ve NGINX gibi kritik web sunucularının AWS EC2 ortamında dağıtımını otomatikleştirmek, geliştiricilere ve sistem yöneticilerine paha biçilmez faydalar sunuyor.

Öncelikle, otomasyonun getirdiği en büyük avantajlardan biri hızdır. Manuel kurulumda dakikalar hatta saatler sürebilecek bir dizi komut ve yapılandırma adımı, bir Bash script ile saniyeler içinde tamamlanabilir. Yeni bir sunucuya NGINX kurmak, mevcut bir sunucuyu güncellemek veya bir felaket kurtarma senaryosunda hızla yeniden dağıtım yapmak gerektiğinde, otomatikleştirilmiş bir script, bu süreci gözle görülür şekilde hızlandırır. Bu, özellikle ani trafik artışlarına hazırlıklı olmak veya yeni projeleri hızla devreye almak isteyen şirketler için kritik bir yetenektir.

İkinci olarak, tutarlılık otomasyonun temel taşlarından biridir. Manuel süreçlerde, her kurulumda küçük farklılıklar ortaya çıkabilir; bir komut yanlış yazılabilir, bir yapılandırma dosyası eksik veya hatalı olabilir. Bu tür tutarsızlıklar, hata ayıklamayı zorlaştırabilir ve sistem genelinde öngörülemeyen davranışlara yol açabilir. Bash scriptleri ise aynı adımları her seferinde aynı şekilde uygulayarak, tüm sunucularınızda standart ve tutarlı bir NGINX yapılandırması sağlar. Bu sayede, “benim makinemde çalışıyordu” sendromunun önüne geçilmiş olur ve hata ayıklama süreçleri daha öngörülebilir hale gelir.

Üçüncü bir önemli avantaj ise hata azaltma potansiyelidir. İnsanlar hata yapmaya meyillidir, özellikle tekrar eden, monoton görevlerde. Bir Bash script, belirli bir mantık çerçevesinde tasarlanır ve bu mantık bir kez doğru bir şekilde yazıldığında, script her çalıştığında bu mantığı hatasız bir şekilde uygular. Bu, yanlış yazılan komutlardan, eksik bağımlılık yüklemelerinden veya hatalı yapılandırma ayarlarından kaynaklanabilecek sorunları ortadan kaldırır. Daha az hata, daha az kesinti süresi ve daha kararlı bir uygulama ortamı anlamına gelir.

Son olarak, otomasyon ölçeklenebilirlik için vazgeçilmezdir. Bir veya iki sunucuyu manuel olarak yönetmek mümkün olabilir, ancak on, yüz veya binlerce sunucudan oluşan bir altyapıda bu imkansızdır. Otomatikleştirilmiş NGINX dağıtımı, ihtiyaç duyduğunuz kadar EC2 örneğini aynı NGINX yapılandırmasıyla hızla başlatmanıza olanak tanır. Bu, özellikle bulut ortamlarının esnekliğinden tam olarak yararlanmak isteyen firmalar için büyük bir avantajdır. Anlık yoğunluklar veya büyüme dönemlerinde hızlıca yeni sunucular devreye alabilir, yük dengeleme ve yüksek erişilebilirlik çözümlerini daha verimli bir şekilde yönetebilirsiniz.

Tüm bu avantajlar göz önüne alındığında, NGINX dağıtımını Bash scriptleri ile otomatikleştirmek, modern altyapı yönetiminin temel bir parçası haline gelmiştir. Bu sadece zaman kazandırmakla kalmaz, aynı zamanda daha güvenilir, tutarlı ve ölçeklenebilir sistemler inşa etmenize de yardımcı olur.

Temel Taşlar: AWS EC2, NGINX ve Bash Scripting Nedir ve Neden Önemlidir?

Başarılı bir otomasyon süreci oluşturmak için, sistemin temel bileşenlerini iyi anlamak gerekir. Bu bölümde, projemizin yapı taşları olan AWS EC2, NGINX ve Bash Scripting’in ne olduğunu ve neden bu kombinasyonun güçlü bir çözüm sunduğunu ele alacağız.

AWS EC2 (Elastic Compute Cloud) Nedir?

AWS EC2, Amazon Web Services’ın sunduğu, bulutta ölçeklenebilir işlem kapasitesi sağlayan bir hizmettir. Temel olarak, size sanal sunucular (instance’lar) kiralama imkanı sunar. Bu sanal sunucular, ihtiyacınıza göre farklı işlem gücü, bellek ve depolama seçenekleriyle gelir. EC2’nin sunduğu başlıca avantajlar şunlardır:

  • Ölçeklenebilirlik: Trafik dalgalanmalarına göre sunucu sayınızı artırıp azaltabilirsiniz.
  • Esneklik: Farklı işletim sistemleri (Linux, Windows) ve uygulama yığınları için çeşitli instance tipleri mevcuttur.
  • Maliyet Etkinliği: Kullandığınız kadar ödersiniz, bu da sermaye harcamalarını azaltır.
  • Yüksek Erişilebilirlik: Birden fazla bölgede ve erişilebilirlik alanında instance’lar başlatarak uygulamanızın kesintisiz çalışmasını sağlayabilirsiniz.

EC2, uygulama sunucularından veritabanlarına, geliştirme ortamlarından CI/CD araçlarına kadar geniş bir kullanım alanına sahiptir. Bizim senaryomuzda, NGINX web sunucumuz için stabil ve esnek bir barındırma ortamı sağlayacaktır.

NGINX Nedir ve Neden Tercih Edilir?

NGINX (Engine-X), yüksek performanslı, ters proxy, yük dengeleyici, HTTP önbelleği ve web sunucusu olarak görev yapabilen açık kaynaklı bir yazılımdır. Özellikle yüksek eşzamanlı bağlantıları işleme yeteneği ile bilinir ve günümüzde internetin en yoğun sitelerinin çoğunda kullanılır. NGINX’in tercih edilme nedenleri:

  • Yüksek Performans: Düşük bellek kullanımıyla binlerce eşzamanlı bağlantıyı işleyebilir.
  • Güvenilirlik: Kararlı ve güvenilir bir web sunucusudur.
  • Esneklik: Çok çeşitli modüller ve yapılandırma seçenekleri sunar.
  • Ters Proxy ve Yük Dengeleme: Birden fazla uygulama sunucusu arasında trafiği dağıtarak uygulamanın performansını ve erişilebilirliğini artırır.
  • Güvenlik: DDoS saldırılarına karşı koruma, SSL/TLS sonlandırma gibi güvenlik özellikleri sunar.

NGINX, modern web uygulamaları için vazgeçilmez bir bileşendir ve AWS EC2 üzerinde dağıtımı, uygulamalarınıza güçlü bir altyapı kazandırır.

Bash Scripting Nedir ve Otomasyondaki Rolü?

Bash, “Bourne-Again SHell” kelimelerinin kısaltmasıdır ve Linux tabanlı sistemlerde en yaygın kullanılan komut satırı yorumlayıcısıdır. Bash scriptleri ise, bir veya daha fazla Bash komutunun bir dosyada sıralanarak otomatik olarak çalıştırılmasını sağlayan metin dosyalarıdır. Bash scripting’in otomasyondaki önemi büyüktür:

  • Basitlik ve Erişilebilirlik: Linux sistemlerinde varsayılan olarak bulunur ve öğrenmesi nispeten kolaydır.
  • Tekrarlayan Görevleri Otomatikleştirme: Sunucu kurulumu, yazılım yüklemesi, yapılandırma ve günlük görevleri otomatikleştirmek için idealdir.
  • Sistem Yönetimi: Dosya işlemleri, kullanıcı yönetimi, hizmet kontrolü gibi birçok sistem yönetim görevini gerçekleştirebilir.
  • Esneklik: Koşullu ifadeler (if), döngüler (for, while) ve fonksiyonlar gibi programlama yapılarını destekler.

Bizim senaryomuzda Bash scriptleri, bir AWS EC2 instance’ına bağlanmak, NGINX paketlerini indirmek, kurmak, yapılandırmak ve hizmeti başlatmak gibi adımları otomatikleştirmek için kullanılacak sihirli değnektir. Bu üç temel bileşenin birleşimi, güçlü, esnek ve otomatik bir NGINX dağıtım çözümünü mümkün kılmaktadır.

Hazırlık Aşaması: AWS EC2 Ortamı Nasıl Oluşturulur ve Yapılandırılır?

NGINX’i otomatik olarak dağıtmadan önce, ona uygun bir AWS EC2 ortamı hazırlamamız gerekiyor. Bu bölüm, AWS Management Console’u kullanarak veya komut satırı arayüzü (CLI) aracılığıyla bir EC2 instance’ı nasıl oluşturacağınızı, güvenliğini nasıl sağlayacağınızı ve NGINX’in sorunsuz çalışması için gerekli ön yapılandırmaları nasıl yapacağınızı adım adım açıklayacaktır.

1. EC2 Instance’ı Başlatma

İlk adım, bir EC2 instance’ı başlatmaktır. En yaygın ve kullanıcı dostu yöntem AWS Management Console’u kullanmaktır:

  1. AWS Console’a Giriş Yapın: AWS Console adresine giderek hesabınıza giriş yapın.
  2. EC2 Servisine Git: Hizmetler arama çubuğuna “EC2” yazın ve çıkan sonuca tıklayın.
  3. Instance Başlat: Sol menüden “Instances” seçeneğine tıklayın ve ardından “Launch instances” butonuna basın.
  4. AMI Seçimi: Bir “Amazon Machine Image” (AMI) seçmeniz gerekecek. NGINX için bir Linux dağıtımı tercih edeceğiz. Ubuntu Server 20.04 LTS veya Amazon Linux 2 AMI, yaygın ve iyi desteklenen seçeneklerdir. “Free tier eligible” etiketli olanları seçerek maliyetleri düşük tutabilirsiniz.
  5. Instance Tipi Seçimi: Uygulamanızın ihtiyaçlarına uygun bir instance tipi seçin. Test ve öğrenme amaçları için t2.micro veya t3.micro (Free Tier uyumlu) yeterli olacaktır.
  6. Anahtar Çifti (Key Pair) Oluşturma veya Seçme: EC2 instance’ınıza güvenli bir şekilde SSH ile bağlanmak için bir anahtar çifti gereklidir. Yeni bir anahtar çifti oluşturun ve .pem dosyasını bilgisayarınıza güvenli bir yere indirin. Mevcut bir anahtar çiftiniz varsa onu da seçebilirsiniz.
  7. Ağ Ayarları (Security Group): Bu, en kritik adımlardan biridir. Bir “Security Group” (Güvenlik Grubu) oluşturmanız veya var olanı kullanmanız gerekir. Güvenlik Grubu, instance’ınıza gelen ve giden ağ trafiğini kontrol eden sanal bir güvenlik duvarıdır. NGINX’in internetten erişilebilir olması için aşağıdaki kuralları eklemeniz şarttır:
    • SSH (Port 22): Instance’ınıza bağlanmak için gereklidir. Kaynak IP olarak kendi IP adresinizi veya 0.0.0.0/0 (tüm IP’ler, dikkatli olun!) seçeneğini belirleyebilirsiniz. En güvenlisi, sadece kendi IP adresinizin erişimine izin vermektir.
    • HTTP (Port 80): NGINX’in web trafiği için gereklidir. Kaynak IP olarak 0.0.0.0/0 seçeneğini belirleyin, böylece web siteniz herkese açık olur.
    • HTTPS (Port 443): Eğer SSL/TLS kullanacaksanız bu porta da izin vermeniz gerekecektir. Kaynak IP yine 0.0.0.0/0 olmalıdır.
    
      {
        "IpPermissions": [
          {
            "FromPort": 22,
            "IpProtocol": "tcp",
            "IpRanges": [ { "CidrIp": "YOUR_IP_ADDRESS/32" } ],
            "ToPort": 22
          },
          {
            "FromPort": 80,
            "IpProtocol": "tcp",
            "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ],
            "ToPort": 80
          },
          {
            "FromPort": 443,
            "IpProtocol": "tcp",
            "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ],
            "ToPort": 433
          }
        ]
      }
            


    Uzman İpucu: Güvenlik gruplarını minimum yetki prensibine göre yapılandırmak önemlidir. SSH için sadece kendi IP adresinize izin vermek, potansiyel güvenlik risklerini azaltır.

  8. Depolama Ayarları: Varsayılan depolama (8 GiB EBS) çoğu senaryo için yeterli olacaktır. İhtiyaçlarınıza göre artırabilirsiniz.
  9. Instance'ı Başlat: Tüm ayarları gözden geçirdikten sonra "Launch instance" butonuna tıklayın. Instance'ınızın başlatılması birkaç dakika sürebilir.

2. EC2 Instance'ına SSH ile Bağlanma

Instance'ınız "Running" durumuna geldiğinde, ona SSH ile bağlanabilirsiniz:

  1. Public IP Adresini Alın: EC2 Instances sayfasında, yeni başlattığınız instance'ı seçin ve alt kısımdaki detaylar sekmesinden "Public IPv4 address" bilgisini kopyalayın.
  2. Anahtar Dosyası İzinlerini Ayarlayın: İndirdiğiniz .pem dosyasının izinlerini uygun şekilde ayarlayın:
    
    chmod 400 /path/to/your-key-pair.pem
            

  3. SSH Bağlantısı Kurun: Terminalinizi açın ve aşağıdaki komutu kullanarak instance'ınıza bağlanın. (ec2-user veya ubuntu, kullandığınız AMI'ye göre değişir.)
    
    ssh -i /path/to/your-key-pair.pem ec2-user@YOUR_EC2_PUBLIC_IP
            

    Eğer Ubuntu AMI kullandıysanız, kullanıcı adı ubuntu olacaktır.

    
    ssh -i /path/to/your-key-pair.pem ubuntu@YOUR_EC2_PUBLIC_IP
            

Başarılı bir şekilde bağlandığınızda, sunucunuzun komut satırına erişmiş olacaksınız. Artık NGINX kurulumu için hazırsınız demektir.

Bu hazırlık adımları, otomatik dağıtım scriptinizin çalışacağı sağlam bir temel oluşturur. Doğru yapılandırılmış bir EC2 instance'ı ve güvenlik grubu, sorunsuz bir kurulum süreci için hayati öneme sahiptir.

Bash Script ile NGINX Kurulumu: Adım Adım Rehber

Şimdi en heyecan verici kısma geldik: NGINX'i bir Bash scripti kullanarak EC2 sunucusuna otomatik olarak kurmak. Bu rehberde, basit bir kurulum scripti oluşturacak, her adımını açıklayacak ve scriptinizi nasıl çalıştıracağınızı göstereceğiz.

Adım 1: Kurulum Scriptini Oluşturma

İlk olarak, sunucunuzda veya yerel makinenizde bir metin düzenleyici kullanarak install_nginx.sh adında bir dosya oluşturun. Bu dosyanın içeriği aşağıdaki gibi olacaktır:


#!/bin/bash

# Script'in hata durumunda durmasını sağla
set -e

# --- NGINX Kurulum Fonksiyonu ---
install_nginx() {
    echo "NGINX kurulumu başlatılıyor..."

    # Paket listesini güncelle
    echo "Paket listeleri güncelleniyor..."
    sudo apt update -y

    # NGINX'i yükle
    echo "NGINX paketi kuruluyor..."
    sudo apt install nginx -y

    # NGINX servisini başlat ve sistem başlangıcında otomatik başlamasını sağla
    echo "NGINX servisi başlatılıyor ve otomatik başlatma ayarlanıyor..."
    sudo systemctl start nginx
    sudo systemctl enable nginx

    echo "NGINX başarıyla kuruldu ve başlatıldı!"
    echo "Web sunucunuzun durumunu kontrol edebilirsiniz: sudo systemctl status nginx"
    echo "NGINX varsayılan ana sayfasını görmek için tarayıcınızdan sunucunuzun genel IP adresine gidin."
}

# --- NGINX Yapılandırma Fonksiyonu (Basit bir örnek) ---
configure_nginx() {
    echo "NGINX yapılandırması uygulanıyor..."

    # Varsayılan NGINX yapılandırma dosyasını yedekle
    if [ -f "/etc/nginx/sites-available/default" ]; then
        sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
        echo "Varsayılan NGINX yapılandırma dosyası yedeklendi."
    fi

    # Basit bir örnek site yapılandırması oluştur
    # Bu kısmı kendi projenize göre özelleştirebilirsiniz.
    echo '
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name _; # Sunucu IP adresi veya domain adınız

    location / {
        try_files $uri $uri/ =404;
    }

    # Hata sayfaları için örnek yapılandırma
    error_page 404 /404.html;
    location = /404.html {
        internal;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        internal;
    }
}
' | sudo tee /etc/nginx/sites-available/default > /dev/null

    echo "NGINX varsayılan site yapılandırması güncellendi."

    # NGINX yapılandırmasını kontrol et
    echo "NGINX yapılandırma sentaksı kontrol ediliyor..."
    sudo nginx -t

    # Hata yoksa NGINX servisini yeniden başlat
    if [ $? -eq 0 ]; then
        echo "NGINX yapılandırması geçerli. Servis yeniden başlatılıyor..."
        sudo systemctl reload nginx
        echo "NGINX servisi yeniden başlatıldı."
    else
        echo "HATA: NGINX yapılandırmasında sentaks hatası var. Lütfen kontrol edin."
        echo "NGINX servisi yeniden başlatılamadı."
        exit 1
    fi
}

# --- Ana Çalışma Akışı ---
main() {
    # NGINX'in zaten kurulu olup olmadığını kontrol et
    if command -v nginx &> /dev/null; then
        echo "NGINX zaten yüklü. Kurulum adımı atlanıyor."
    else
        install_nginx
    fi

    configure_nginx

    echo "NGINX dağıtım scripti tamamlandı!"
}

# Scripti çalıştır
main

Adım 2: Scriptin Açıklaması

Yukarıdaki Bash scripti, birkaç temel adımdan oluşmaktadır:

  • #!/bin/bash: Bu, scriptin Bash yorumlayıcısı ile çalıştırılması gerektiğini belirtir.
  • set -e: Bu komut, scriptin herhangi bir komut başarısız olduğunda (sıfır olmayan bir çıkış kodu döndürdüğünde) hemen durmasını sağlar. Bu, hataları erken yakalamak için önemlidir.
  • install_nginx() Fonksiyonu:
    • sudo apt update -y: Sunucunun paket listesini günceller. -y bayrağı, tüm sorulara otomatik olarak "evet" yanıtı vermesini sağlar.
    • sudo apt install nginx -y: NGINX paketini yükler.
    • sudo systemctl start nginx: NGINX servisini başlatır.
    • sudo systemctl enable nginx: NGINX servisinin sunucu yeniden başlatıldığında otomatik olarak başlamasını sağlar.
  • configure_nginx() Fonksiyonu:
    • Varsayılan NGINX yapılandırma dosyasını yedekler (/etc/nginx/sites-available/default).
    • Yeni, temel bir NGINX site yapılandırması oluşturur ve bunu varsayılan yapılandırma dosyasına yazar. sudo tee komutu, root yetkileriyle bir dosyaya yazmak için kullanılır.
    • sudo nginx -t: NGINX yapılandırma dosyalarının sentaksını kontrol eder. Herhangi bir hata varsa, script durur.
    • sudo systemctl reload nginx: NGINX servisini yapılandırma değişikliklerini uygulamak üzere yeniden yükler (yeniden başlatmadan daha hızlıdır).
  • main() Fonksiyonu:
    • if command -v nginx &> /dev/null; then ... fi: NGINX'in zaten yüklü olup olmadığını kontrol eder. Bu, scripti birden fazla kez çalıştırmak istediğinizde gereksiz kurulumları önler.
    • install_nginx ve configure_nginx fonksiyonlarını çağırır.

Uzman İpucu: Ubuntu/Debian tabanlı sistemler için apt kullanılırken, Amazon Linux/CentOS/RedHat tabanlı sistemler için yum veya dnf komutları kullanılmalıdır. AMI seçiminize göre scripti uyarlamayı unutmayın.

Adım 3: Scripti EC2 Sunucusuna Yükleme ve Çalıştırma

  1. Scripti EC2'ye Kopyalama: Yerel makinenizden SSH anahtarınızı kullanarak install_nginx.sh dosyasını EC2 sunucunuza kopyalayın:
    
    scp -i /path/to/your-key-pair.pem install_nginx.sh ec2-user@YOUR_EC2_PUBLIC_IP:/home/ec2-user/
            

    Yine, kullanıcı adı Ubuntu için ubuntu olabilir.

  2. EC2'ye Bağlanma: SSH ile EC2 sunucunuza bağlanın:
    
    ssh -i /path/to/your-key-pair.pem ec2-user@YOUR_EC2_PUBLIC_IP
            

  3. Scripte Çalıştırma İzni Verme: Sunucuda, script dosyasını yürütülebilir hale getirin:
    
    chmod +x install_nginx.sh
            

  4. Scripti Çalıştırma: Scripti root yetkileriyle çalıştırın:
    
    sudo ./install_nginx.sh
            

Script başarıyla tamamlandığında, tarayıcınızdan EC2 sunucunuzun genel IP adresine giderek NGINX'in varsayılan karşılama sayfasını (veya scriptinizle özelleştirdiğiniz sayfayı) görmeniz gerekir. Eğer bir hata ile karşılaşırsanız, scriptin çıktısını dikkatlice inceleyerek sorunun kaynağını bulmaya çalışın.

Bu adımları takip ederek, NGINX'i AWS EC2 sunucunuza tamamen otomatik bir şekilde kurmuş ve yapılandırmış olacaksınız. Bu, manuel kurulumun getirdiği zaman kaybını ve hata riskini ortadan kaldırır.

Otomasyonu Geliştirme: NGINX Yapılandırma ve Hata Yönetimi Nasıl Yapılır?

Yukarıdaki script, NGINX'i kurmak için iyi bir başlangıç noktasıdır, ancak gerçek dünya senaryolarında daha fazla esneklik, hata yönetimi ve özelleştirme gerekebilir. Bu bölümde, NGINX yapılandırmasını daha dinamik hale getirmeyi ve scriptinize temel hata yönetimi mekanizmaları eklemeyi öğreneceksiniz.

1. Dinamik NGINX Yapılandırması

NGINX'i sadece kurmak yetmez, genellikle projenize özel yapılandırma dosyalarına ihtiyacınız olacaktır. Bu, bir site bloğu oluşturmak, ters proxy ayarları yapmak, SSL/TLS sertifikalarını yapılandırmak veya performans optimizasyonları eklemek anlamına gelebilir. Scriptinizi bu ihtiyaçlara göre nasıl geliştirebilirsiniz?

a. Özel Yapılandırma Dosyalarını Kullanma

Yerel makinenizde önceden hazırlanmış özel NGINX yapılandırma dosyalarınız (örneğin, my_website.conf) varsa, bunları EC2 sunucusuna kopyalayabilir ve scriptinizde etkinleştirebilirsiniz.


# Yerel makinenizde oluşturduğunuz özel NGINX yapılandırma dosyası
# my_website.conf dosyasının içeriği:
# server {
#     listen 80;
#     server_name example.com www.example.com;
#     root /var/www/my_website;
#     index index.html;
#     location / {
#         try_files $uri $uri/ =404;
#     }
# }

Scriptinize ekleyeceğiniz yapılandırma adımları şu şekilde olabilir:


configure_custom_nginx_site() {
    echo "Özel NGINX sitesi yapılandırılıyor..."

    LOCAL_NGINX_CONF_PATH="my_website.conf" # Yerelinizdeki yapılandırma dosyanızın adı
    REMOTE_NGINX_CONF_PATH="/etc/nginx/sites-available/my_website.conf"
    REMOTE_NGINX_SYMLINK_PATH="/etc/nginx/sites-enabled/my_website.conf"
    
    # Yerelden EC2'ye özel yapılandırma dosyasını kopyalayın
    # Not: Bu adımın scripti EC2 üzerinde çalışmadan önce yerel makineden çalıştırılması gerekir
    # scp -i /path/to/key.pem my_website.conf ec2-user@YOUR_IP:$HOME/
    
    # Veya script içinde direkt oluşturabilirsiniz
    echo '
server {
    listen 80;
    server_name ${DOMAIN_NAME:-your_ec2_public_ip}; # Dinamik domain adı
    root /var/www/html/my_website;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
' | sudo tee $REMOTE_NGINX_CONF_PATH > /dev/null

    # Web kök dizinini oluştur ve örnek index.html ekle
    sudo mkdir -p /var/www/html/my_website
    echo "

Merhaba, NGINX Otomasyonu!

Bu site Bash script ile kuruldu.

" | sudo tee /var/www/html/my_website/index.html > /dev/null # Varsayılan siteyi devre dışı bırak if [ -f "/etc/nginx/sites-enabled/default" ]; then sudo rm /etc/nginx/sites-enabled/default echo "Varsayılan NGINX sitesi devre dışı bırakıldı." fi # Yeni yapılandırma dosyasını etkinleştir if [ ! -L "$REMOTE_NGINX_SYMLINK_PATH" ]; then sudo ln -s $REMOTE_NGINX_CONF_PATH $REMOTE_NGINX_SYMLINK_PATH echo "Yeni NGINX sitesi etkinleştirildi." fi # NGINX yapılandırmasını kontrol et ve yeniden yükle echo "NGINX yapılandırması kontrol ediliyor ve yeniden yükleniyor..." sudo nginx -t && sudo systemctl reload nginx || { echo "NGINX yapılandırma hatası!"; exit 1; } }

Bu örnekte, scriptin NGINX yapılandırma dizinine özel bir dosya kopyalamasını, sites-enabled dizinine bir sembolik bağlantı oluşturarak onu etkinleştirmesini ve NGINX'i yeniden yüklemesini sağlıyoruz. Ayrıca, web sitesi için bir dizin oluşturup basit bir HTML dosyası da ekliyoruz. ${DOMAIN_NAME:-your_ec2_public_ip} kullanımı ile, script çalıştırılırken bir değişken tanımlanmamışsa varsayılan bir değer kullanılmasını sağlıyoruz.

b. Ortam Değişkenleri ve Parametreler Kullanma

Scriptinizi daha esnek hale getirmek için, çalıştırma sırasında parametreler veya ortam değişkenleri almasını sağlayabilirsiniz. Örneğin, alan adı veya web kök dizini gibi bilgileri dışarıdan besleyebilirsiniz.


# Scripti şu şekilde çalıştırabilirsiniz:
# DOMAIN_NAME="example.com" WEB_ROOT="/var/www/html/project_x" sudo ./install_nginx.sh

# Script içinde bu değişkenleri kullanmak:
DOMAIN_NAME=${DOMAIN_NAME:-"localhost"} # Varsayılan olarak localhost kullan
WEB_ROOT=${WEB_ROOT:-"/var/www/html"} # Varsayılan olarak /var/www/html kullan

# NGINX config içinde kullanımlar:
# server_name $DOMAIN_NAME;
# root $WEB_ROOT;

2. Hata Yönetimi ve Sağlamlaştırma

Otomasyon scriptlerinin en önemli parçalarından biri, olası hataları öngörmek ve bunlara uygun şekilde tepki vermektir. set -e harika bir başlangıç noktasıdır, ancak daha fazlasını yapabiliriz.

a. Loglama

Scriptinizin ne yaptığını ve nerede hata verdiğini takip etmek için loglama çok önemlidir. Her önemli adımı veya hatayı bir dosyaya yazabilirsiniz.


LOG_FILE="/var/log/nginx_deployment.log"
exec &> >(tee -a "$LOG_FILE") # Hem konsola hem dosyaya yazdırır

log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# Kullanım:
log_message "NGINX kurulumu başlatıldı."
# ... komutlar ...
if command -v nginx &> /dev/null; then
    log_message "NGINX zaten yüklü."
else
    log_message "NGINX yükleniyor..."
    sudo apt install nginx -y || log_message "HATA: NGINX yüklemesi başarısız oldu!" && exit 1
fi

b. Önkoşul Kontrolleri

Scriptin çalışması için gerekli önkoşulların (örneğin internet bağlantısı, yeterli disk alanı) kontrol edilmesi, daha sonra ortaya çıkabilecek sorunları engeller.


check_prerequisites() {
    echo "Önkoşullar kontrol ediliyor..."
    # İnternet bağlantısını kontrol et
    ping -c 1 google.com &> /dev/null || { echo "HATA: İnternet bağlantısı yok!"; exit 1; }
    echo "İnternet bağlantısı mevcut."

    # Yeterli disk alanını kontrol et (örneğin 1GB boş alan)
    if (( $(df / --output=avail | tail -n 1) < 1000000 )); then
        echo "HATA: Yetersiz disk alanı! En az 1GB boş alan gerekli."
        exit 1
    fi
    echo "Yeterli disk alanı mevcut."
}

# main() fonksiyonunda ilk çağrı:
# main() {
#     check_prerequisites
#     # ... diğer fonksiyonlar ...
# }

c. Idempotency (Tekrarlanabilirlik)

Scripti birden fazla kez çalıştırmak istediğinizde, her seferinde aynı sonucu vermesi ve gereksiz işlemleri tekrarlamaması önemlidir. Yukarıdaki if command -v nginx &> /dev/null; kontrolü, idempotency'nin basit bir örneğidir. Benzer şekilde, dosyaların veya sembolik bağlantıların varlığını kontrol ederek sadece gerektiğinde işlem yapabilirsiniz.


# Eğer dosya zaten varsa yedekleme yap
if [ -f "/etc/nginx/sites-available/default" ]; then
    sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
fi

Bu geliştirmeler, Bash scriptinizi daha sağlam, esnek ve gerçek dünya dağıtım senaryolarına uygun hale getirecektir. Unutmayın, iyi bir otomasyon scripti, sadece işi yapmakla kalmaz, aynı zamanda olası sorunları da yönetir.

Gerçek Dünya Uygulamaları: Bir Vaka Analizi

Bir Bash scriptinin NGINX dağıtımını nasıl kolaylaştırdığını daha iyi anlamak için, gerçek bir senaryoyu ele alalım. Diyelim ki hızlı büyüyen bir e-ticaret startup'ı olan "TrendyFinds" için çalışıyorsunuz. TrendyFinds, ürün kataloglarını, kullanıcı profillerini ve ödeme işlemlerini yöneten üç farklı mikroservis mimarisine sahip. Her mikroservis kendi arka uç servisi ile çalışıyor ve NGINX, bu servislere gelen trafiği yönlendirmek, yük dengelemek ve SSL sonlandırma yapmak için bir ters proxy olarak kullanılıyor. Yeni bir geliştirme ortamı oluşturmak veya mevcut bir ortamı ölçeklendirmek gerektiğinde, her mikroservis için ayrı bir NGINX yapılandırması gerekiyor.

Mevcut Durum ve Karşılaşılan Zorluklar

TrendyFinds başlangıçta her bir NGINX sunucusunu manuel olarak yapılandırıyordu. Bu süreç aşağıdaki zorlukları beraberinde getiriyordu:

  1. Zaman Kaybı: Her yeni geliştirme veya staging ortamı için NGINX'i sıfırdan kurmak ve yapılandırmak (paket yükleme, yapılandırma dosyalarını kopyalama, domainleri ayarlama, SSL sertifikalarını entegre etme) saatler sürüyordu.
  2. Hata Riski: Manuel adımlar sırasında yapılandırma dosyalarında typo (yazım hatası) yapılması, yanlış portların atanması veya SSL sertifikalarının hatalı yüklenmesi gibi insan kaynaklı hatalar sıkça yaşanıyordu. Bu hatalar, uygulama erişilebilirliğini etkiliyor ve hata ayıklama için ek zaman gerektiriyordu.
  3. Tutarsızlık: Farklı geliştiriciler veya sistem yöneticileri tarafından yapılan kurulumlar arasında küçük ama önemli farklılıklar olabiliyordu. Bu tutarsızlıklar, "benim makinemde çalışıyor" sorunlarına ve farklı ortamlarda beklenmedik davranışlara yol açıyordu.
  4. Ölçeklenebilirlik Sorunları: Yeni ürün lansmanları veya kampanya dönemlerinde hızla yeni sunucular devreye almak gerektiğinde, manuel süreçler darboğaz yaratıyor, dağıtım süreçlerini yavaşlatıyordu.

Bash Script ile Otomasyon Çözümü

TrendyFinds, bu sorunları çözmek için NGINX dağıtımını Bash scriptleri ile otomatikleştirmeye karar verdi. Geliştirilen script, şu yeteneklere sahipti:

  1. Genel Kurulum ve Temel Yapılandırma: Script, yeni bir Ubuntu tabanlı EC2 instance'ında NGINX'i kuruyor, temel güvenlik duvarı ayarlarını (UFW) yapıyor ve NGINX hizmetini başlatıyordu.
  2. Dinamik Site Blokları: Her mikroservis için özel bir NGINX site bloğu gerekiyordu. Script, parametre olarak alınan SERVICE_NAME, DOMAIN_NAME ve UPSTREAM_PORT gibi değişkenlerle dinamik NGINX yapılandırma dosyaları oluşturabiliyordu. Örneğin:
    
    #!/bin/bash
    # install_nginx_service.sh
    
    SERVICE_NAME=$1
    DOMAIN_NAME=$2
    UPSTREAM_PORT=$3 # Mikroservisin çalıştığı port
    
    if [ -z "$SERVICE_NAME" ] || [ -z "$DOMAIN_NAME" ] || [ -z "$UPSTREAM_PORT" ]; then
        echo "Kullanım: $0   "
        exit 1
    fi
    
    echo "NGINX ve UFW güncellemeleri yapılıyor..."
    sudo apt update -y
    sudo apt install -y nginx ufw
    
    # UFW yapılandırması (güvenlik duvarı)
    sudo ufw allow OpenSSH
    sudo ufw allow 'Nginx HTTP'
    sudo ufw allow 'Nginx HTTPS' # Eğer SSL kullanılacaksa
    sudo ufw --force enable
    
    # NGINX site yapılandırmasını oluştur
    NGINX_CONF_PATH="/etc/nginx/sites-available/${SERVICE_NAME}.conf"
    NGINX_SYMLINK_PATH="/etc/nginx/sites-enabled/${SERVICE_NAME}.conf"
    
    echo "NGINX yapılandırması oluşturuluyor: $NGINX_CONF_PATH"
    echo "
    server {
        listen 80;
        server_name $DOMAIN_NAME;
    
        location / {
            proxy_pass http://localhost:$UPSTREAM_PORT;
            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;
        }
    
        # SSL/TLS için ileri düzey yapılandırmalar buraya eklenebilir.
    }
    " | sudo tee $NGINX_CONF_PATH > /dev/null
    
    # Mevcut default siteyi devre dışı bırak
    if [ -f "/etc/nginx/sites-enabled/default" ]; then
        sudo rm "/etc/nginx/sites-enabled/default"
    fi
    
    # Yeni siteyi etkinleştir
    if [ ! -L "$NGINX_SYMLINK_PATH" ]; then
        sudo ln -s $NGINX_CONF_PATH $NGINX_SYMLINK_PATH
    fi
    
    echo "NGINX yapılandırması test ediliyor..."
    sudo nginx -t
    
    if [ $? -eq 0 ]; then
        echo "NGINX yapılandırması başarılı. Servis yeniden başlatılıyor..."
        sudo systemctl reload nginx
        echo "NGINX servisi yeniden başlatıldı. $DOMAIN_NAME artık $UPSTREAM_PORT üzerinden servise yönlendiriliyor."
    else
        echo "HATA: NGINX yapılandırma hatası oluştu. Lütfen kontrol edin."
        exit 1
    fi
            

    Bu scripti şu şekilde çalıştırabilirlerdi: sudo ./install_nginx_service.sh products-api api.trendyfinds.com 3001

  3. SSL/TLS Otomasyonu (İleri Düzey): Script, Let's Encrypt'in Certbot aracı ile otomatik olarak SSL sertifikaları alıp NGINX'e entegre edebiliyordu. Bu, certbot --nginx -d example.com gibi komutların otomasyonuyla sağlanıyordu.
  4. Hata Kontrolü ve Geri Dönüş: Script, her önemli adımda hata kontrolü yapıyor ve bir hata durumunda kullanıcıyı bilgilendirerek süreci durduruyordu.

Elde Edilen Faydalar

Bu otomasyon sayesinde TrendyFinds, önemli ölçüde fayda sağladı:

  • Dağıtım Hızında %80 Artış: Manuel kurulumlar yerine script ile NGINX dağıtımı dakikalar içinde tamamlanabiliyordu.
  • Hata Oranında Azalma: İnsan kaynaklı hatalar minimuma indi, çünkü script her zaman aynı doğru adımları uyguluyordu.
  • Tam Tutarlılık: Tüm geliştirme, staging ve üretim ortamlarındaki NGINX yapılandırmaları tamamen tutarlı hale geldi.
  • Kolay Ölçeklendirme: Yeni bir mikroservis veya ortam ihtiyacı doğduğunda, mevcut scriptler küçük parametre değişiklikleri ile hızla yeni NGINX instance'larını devreye alabiliyordu. Bu, iş yükünü ciddi ölçüde hafifletti ve yeni projelerin pazara sürülme süresini kısalttı.
  • Geliştirici Üretkenliği: Geliştiriciler, altyapı kurulumuyla uğraşmak yerine doğrudan kod yazmaya ve uygulama geliştirmeye odaklanabildi.

Bu vaka analizi, Bash scriptlerinin NGINX dağıtımını AWS EC2 üzerinde nasıl dönüştürebileceğini ve bir şirkete somut operasyonel faydalar sağlayabileceğini açıkça göstermektedir. Basit bir otomasyon aracı gibi görünse de, Bash scriptleri doğru kullanıldığında büyük bir etki yaratabilir.

İleri Düzey İpuçları ve En İyi Uygulamalar

Bash scriptleri ile NGINX dağıtımını otomatikleştirme sürecinde daha da ileri gitmek ve scriptlerinizi daha sağlam, güvenli ve verimli hale getirmek için bazı ileri düzey ipuçları ve en iyi uygulamalar mevcuttur. Bu bölümde, deneyimli kullanıcılar için değerli olabilecek konulara değineceğiz.

1. İdempotency (Tekrarlanabilirlik)

Bir scriptin idempotent olması, birden fazla kez çalıştırıldığında aynı sonucu vermesi ve sistem üzerinde ek bir değişiklik yapmaması anlamına gelir. Örneğin, NGINX zaten kuruluysa, scriptin tekrar kurmaya çalışmaması gerekir. Daha önce bahsettiğimiz if command -v nginx &> /dev/null; kontrolü bunun basit bir örneğidir. Benzer kontrolleri dosyaların varlığı, servislerin durumu veya sembolik bağlantıların mevcudiyeti için de uygulayarak scriptinizi daha akıllı hale getirebilirsiniz.


# NGINX servisinin zaten çalışıp çalışmadığını kontrol et
if systemctl is-active --quiet nginx; then
    echo "NGINX servisi zaten çalışıyor."
else
    echo "NGINX servisi başlatılıyor..."
    sudo systemctl start nginx
fi

2. Kullanıcı Verileri (User Data) ile Entegrasyon

AWS EC2 instance'ları başlatılırken "User Data" adı verilen bir mekanizma aracılığıyla ilk açılışta çalıştırılacak scriptleri kabul edebilir. Bu, scriptinizi bir EC2 instance'ına manuel olarak SSH ile bağlanıp çalıştırmak yerine, instance başlatıldığında otomatik olarak NGINX kurulumunun gerçekleşmesini sağlar. Bu, daha "serverless" bir dağıtım yaklaşımı sunar.


# EC2 User Data örneği (bir .txt dosyası olarak)
#!/bin/bash
# Tüm güncellemeleri yap
sudo apt update -y
sudo apt upgrade -y

# NGINX'i kur
sudo apt install nginx -y

# NGINX servisini başlat ve etkinleştir
sudo systemctl start nginx
sudo systemctl enable nginx

# Özel bir index.html dosyası oluştur
echo "

Otomatik Dağıtılmış NGINX Sayfası!

" | sudo tee /var/www/html/index.html # Diğer yapılandırma adımları...

Bu scripti EC2 instance'ı başlatılırken "Advanced details" altındaki "User data" alanına yapıştırabilirsiniz. Bu sayede, instance hazır olduğunda NGINX de kurulu ve çalışır durumda olacaktır.

Uzman İpucu: User Data scriptleri root yetkileriyle çalışır. Bu yüzden içerdikleri komutlara dikkat edilmelidir.

3. Hata Ayıklama ve Gelişmiş Loglama

Scriptlerde hata ayıklama (debugging) ve kapsamlı loglama, karmaşık sorunları çözmek için hayati öneme sahiptir. set -x komutu, Bash'in çalıştığı her komutu ve argümanlarını çıktıya yazmasını sağlayarak hata ayıklamayı kolaylaştırır.


#!/bin/bash
set -ex # x bayrağı debugging için
LOG_FILE="/var/log/nginx_deployment.log"
exec &> >(tee -a "$LOG_FILE")

# ... script içeriği ...

Ayrıca, her adımın başarılı olup olmadığını kontrol eden if [ $? -ne 0 ] yapılarını kullanarak belirli hatalara özel mesajlar verebilirsiniz.

4. Güvenlik En İyi Uygulamaları

  • Sudo Kullanımı: Scriptlerinizde sudo komutunu sadece gerçekten root yetkileri gerektiren işlemler için kullanın. Gereksiz yere tüm scripti sudo ile çalıştırmayın.
  • Anahtar Yönetimi: SSH anahtarlarınızı (.pem dosyaları) asla scriptin içine gömmeyin. Her zaman harici olarak yönetin ve uygun izinlerle (chmod 400) koruyun.
  • Ortam Değişkenleri: Hassas bilgileri (veritabanı şifreleri, API anahtarları) doğrudan script içine yazmaktan kaçının. Bunun yerine, bunları ortam değişkenleri aracılığıyla veya daha güvenli bir şekilde AWS Secrets Manager gibi hizmetler aracılığıyla besleyin.
  • Least Privilege (En Az Ayrıcalık): EC2 instance'ınız için oluşturduğunuz IAM Rollerini ve Güvenlik Gruplarını sadece gerekli olan minimum izinleri verecek şekilde yapılandırın. Örneğin, sadece 80 ve 443 portlarına internetten erişim izni verin.

5. Konfigürasyon Yönetim Araçları ve CI/CD Entegrasyonu

Bash scriptleri hızlı ve esnek olsalar da, çok büyük veya karmaşık altyapılar için daha gelişmiş konfigürasyon yönetim araçları (Ansible, Chef, Puppet, SaltStack) daha uygun olabilir. Bu araçlar, idempotency, durum yönetimi ve çapraz platform desteği gibi konularda daha güçlü yetenekler sunar.

Scriptlerinizi bir Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD) hattına entegre etmek, otomasyonunuzu bir sonraki seviyeye taşır. Gitlab CI, Jenkins, AWS CodePipeline gibi araçlar ile kod değişiklikleri tetiklendiğinde otomatik olarak NGINX dağıtım scriptlerinizi çalıştırabilir, test edebilir ve devreye alabilirsiniz.

6. Mobil Uyumlu HTML ve NGINX

NGINX doğrudan mobil uyumlu HTML üretmez, ancak mobil uyumlu web sitelerinin sunulmasında kritik bir rol oynar. NGINX yapılandırmanız, statik dosyaları (HTML, CSS, JS) hızlı bir şekilde sunarak mobil cihazlarda site performansını artırabilir. Mobil uyumlu tasarımlar için CSS @media kurallarını kullanmak esastır. Örneğin, farklı ekran boyutlarına göre elementlerin düzenini değiştirebilirsiniz:


/* Örnek bir CSS media query */
@media (max-width: 768px) {
  .container {
    flex-direction: column; /* Küçük ekranlarda elementleri dikey sırala */
  }
  .sidebar {
    display: none; /* Yan menüyü küçük ekranlarda gizle */
  }
}

Bu kod bloğu, 768 pikselden daha küçük ekranlarda belirli CSS kurallarının uygulanmasını sağlar. NGINX sunucunuz, bu CSS dosyalarını hızlı bir şekilde istemcilere ulaştırarak mobil uyumluluğun sorunsuz çalışmasına katkıda bulunur. Bu tür kurallar genellikle sitenizin bölümündeki