Takip et

Uygulamalarınızı Dünyaya Açmaya Hazır mısınız? Ubuntu 24.04’te Uygulama Sunucusu Kurulumu

Ubuntu 24.04’te Uygulama Sunucusu Kurulumu ve Yapılandırması

Uygulamalarınızı Dünyaya Açmaya Hazır mısınız? Ubuntu 24.04’te Uygulama Sunucusu Kurulumu

Modern web uygulamaları geliştirdiniz, ancak bu harika projeleri internet kullanıcılarıyla nasıl buluşturacağınızı mı merak ediyorsunuz? Uygulama sunucuları, kodunuzu canlı bir ortama taşımanın ve kesintisiz bir kullanıcı deneyimi sunmanın temel taşıdır. Bu kapsamlı rehberde, Ubuntu 24.04 işletim sistemi üzerinde güçlü ve güvenilir bir uygulama sunucusunu sıfırdan nasıl kurup yapılandıracağınızı adım adım keşfedeceğiz.

Dijital dünyada yerinizi almak, geliştirdiğiniz web uygulamalarını güvenilir ve yüksek performanslı bir altyapı üzerinde yayınlamakla başlar. Özellikle Ubuntu 24.04 gibi güncel ve topluluk tarafından yoğun şekilde desteklenen bir işletim sistemi, bu süreç için mükemmel bir zemin sunar. Bu makale, sadece teknik adımları göstermekle kalmayacak, aynı zamanda her bir bileşenin neden önemli olduğunu ve gerçek dünya senaryolarında size nasıl fayda sağlayacağını da açıklayacaktır. İster küçük bir kişisel blog, ister büyük ölçekli bir e-ticaret platformu olsun, bu rehber sayesinde uygulamanızı güvenle yayına alabileceksiniz. Sunucu hazırlığından güvenlik önlemlerine, performans optimizasyonlarından ileri düzey yapılandırmalara kadar her detayı ele alacağız. Hadi başlayalım ve uygulamanızın potansiyelini tam anlamıyla ortaya çıkaralım!

Uygulama Sunucusu Nedir ve Neden Önemlidir? Temel Kavramlara Derin Bir Bakış

Bir web uygulamasının geliştirilmesi, sürecin yalnızca bir parçasıdır. Uygulamanın internet üzerinden erişilebilir olması ve düzgün çalışması için bir “uygulama sunucusu”na ihtiyacımız vardır. Peki, tam olarak nedir bu uygulama sunucusu ve onu bir web sunucusundan ayıran nedir?

Basitçe ifade etmek gerekirse, bir uygulama sunucusu, dinamik web içeriği üreten uygulamaları çalıştırmak için tasarlanmış bir yazılım katmanıdır. Geleneksel web sunucuları (örneğin Apache HTTP Server veya Nginx), genellikle statik HTML sayfaları, resimler ve CSS/JavaScript dosyaları gibi önceden oluşturulmuş içerikleri doğrudan istemcilere sunarken, uygulama sunucuları kullanıcılardan gelen istekleri işler, veritabanlarıyla etkileşime girer, iş mantığını yürütür ve dinamik olarak HTML, JSON veya başka formatlarda yanıtlar oluşturur. Bu yanıtlar daha sonra bir web sunucusu (genellikle bir ters proxy olarak yapılandırılmış) aracılığıyla istemciye iletilir.

Uygulama sunucularının önemini birkaç maddeyle açıklayabiliriz:

  • Dinamik İçerik Üretimi: Kullanıcı girişine, veritabanı sorgularına veya diğer faktörlere bağlı olarak sürekli değişen içerik sağlamak için vazgeçilmezdirler.
  • İş Mantığı Yürütme: Uygulamanızın temel fonksiyonlarını (örneğin, sipariş işleme, kullanıcı kimlik doğrulaması, veri analizi) çalıştıran kod burada barındırılır.
  • Kaynak Yönetimi: Uygulama süreçlerini yönetir, bellek ve CPU gibi kaynakların verimli kullanılmasını sağlar.
  • Güvenlik: Uygulama katmanında güvenlik politikaları uygulamak, kullanıcı oturumlarını yönetmek ve hassas verilere erişimi kontrol etmek için kritik bir rol oynar.
  • Ölçeklenebilirlik: Yüksek trafik durumlarında uygulamanın performansını korumak için birden fazla uygulama örneğini çalıştırma ve yük dengeleme yeteneği sunar.

Popüler Uygulama Sunucusu Türleri ve Ubuntu 24.04 ile Uyumu

Piyasada farklı programlama dilleri ve çerçeveleri için optimize edilmiş çok sayıda uygulama sunucusu bulunmaktadır:

  • Java Tabanlı Sunucular (Tomcat, JBoss/WildFly): Java tabanlı web uygulamaları (örneğin Spring Boot) için idealdir. Geniş kurumsal uygulamalarda sıkça tercih edilirler.
  • Python Tabanlı Sunucular (Gunicorn, uWSGI): Django ve Flask gibi Python web çerçeveleriyle birlikte kullanılır. Genellikle Nginx gibi bir web sunucusu ile ters proxy olarak çalışırlar.
  • Node.js Süreç Yöneticileri (PM2, Forever): Node.js uygulamalarını arka planda sürekli çalışır halde tutar, çökmelerde otomatik yeniden başlatma ve yük dengeleme gibi özellikler sunar.
  • PHP Tabanlı Sunucular (PHP-FPM): Laravel, Symfony gibi PHP çerçeveleri için tasarlanmıştır. Apache veya Nginx ile hızlı PHP işleme yeteneği sağlar.

Ubuntu 24.04, bu sunucu türlerinin hemen hemen tamamını sorunsuz bir şekilde barındırabilen, modern, kararlı ve güçlü bir işletim sistemidir. LTS (Uzun Süreli Destek) sürümü olması, uzun vadeli güvenilirlik ve güvenlik güncellemeleri anlamına gelir. Bu da onu üretim ortamları için cazip bir seçenek haline getirir. Gelişmiş çekirdek desteği, güncel paket depoları ve geniş topluluk desteği sayesinde, karşılaşabileceğiniz her türlü soruna hızlıca çözüm bulabilirsiniz.

Vaka Analizi: Startup’ın İlk Adımları ve Uygulama Sunucusu Seçimi

Genç bir startup olan “YemekSepetiClone”, yeni nesil yemek dağıtım platformunu geliştiriyor. Uygulama, Python (Django) ve Node.js (gerçek zamanlı bildirimler için) teknolojilerini kullanıyor. Başlangıçta tek bir sunucu üzerinde tüm altyapıyı kurmak istiyorlar. Bu durumda, Ubuntu 24.04 üzerinde Nginx’i ters proxy olarak konumlandırıp, Django uygulaması için Gunicorn’u, Node.js bildirim servisi için ise PM2’yi kullanmak mantıklı bir seçim olacaktır. Nginx, hem statik dosyaları servis edecek hem de gelen istekleri doğru uygulama sunucusuna yönlendirerek yük dengelemesi ve SSL sonlandırması gibi görevleri üstlenecektir. Bu yapılandırma, uygulamanın farklı bileşenlerini izole etmeye ve her birinin kendi ortamında en iyi performansı göstermesine olanak tanır.

Ubuntu 24.04 Ortamını Hazırlama: Adım Adım Sunucu Kurulumu

Uygulama sunucunuzu kurmaya başlamadan önce, Ubuntu 24.04 işletim sistemini barındıran sunucunuzu doğru bir şekilde hazırlamak kritik öneme sahiptir. Bu hazırlık adımları, hem sistemin güvenliğini hem de gelecekteki performansını doğrudan etkileyecektir.

Sistem Güncellemeleri ve Temel Güvenlik Adımları

Yeni bir Ubuntu kurulumundan sonra yapılması gereken ilk şey, sistemin güncel olduğundan emin olmaktır. Bu, hem güvenlik açıklarının kapatılmasına hem de en yeni yazılım sürümlerine erişmenize olanak tanır.

Terminali açın ve aşağıdaki komutları çalıştırın:


sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y
  
  • sudo apt update: Paket listelerini günceller.
  • sudo apt upgrade -y: Mevcut paketleri yükseltir. -y parametresi, tüm sorulara otomatik olarak “evet” yanıtı verir.
  • sudo apt autoremove -y: Artık ihtiyaç duyulmayan bağımlılıkları ve eski çekirdekleri temizler.

Güvenli SSH Erişimi ve Kullanıcı Yönetimi

Varsayılan olarak, çoğu bulut sağlayıcısı veya sanal makine kurulumu, root kullanıcısı ile SSH erişimine izin verir. Ancak bu, güvenlik açısından önerilmez. Bunun yerine, sudo yetkilerine sahip yeni bir kullanıcı oluşturmalı ve root ile doğrudan SSH erişimini devre dışı bırakmalısınız.

Yeni bir kullanıcı oluşturmak için:


sudo adduser [kullanici_adi]
sudo usermod -aG sudo [kullanici_adi]
  

Kullanıcınız için güçlü bir parola belirledikten sonra, onu sudo grubuna ekleyerek yönetimsel ayrıcalıklar vermiş olursunuz. Artık bu yeni kullanıcı ile SSH yapabilir ve sudo komutunu kullanarak root ayrıcalıklarıyla komutları çalıştırabilirsiniz. Bu, yanlışlıkla sistem dosyalarını bozma riskini azaltır.

SSH güvenliğini artırmak için:

  1. Parola yerine SSH anahtarları kullanın: Bu, çok daha güvenli bir kimlik doğrulama yöntemidir. Yerel makinenizde bir SSH anahtar çifti oluşturun ve genel anahtarınızı sunucunuzdaki ~/.ssh/authorized_keys dosyasına ekleyin.
  2. SSH portunu değiştirin: Varsayılan 22 numaralı port yerine farklı bir port kullanmak, otomatik saldırı girişimlerini azaltabilir. /etc/ssh/sshd_config dosyasını düzenleyerek Port 22 satırını değiştirin.
  3. Root ile SSH erişimini devre dışı bırakın: Aynı dosyada PermitRootLogin yes satırını PermitRootLogin no olarak değiştirin.
  4. Parola ile kimlik doğrulamayı devre dışı bırakın (isteğe bağlı ama önerilir): Eğer SSH anahtarlarını kullanıyorsanız, PasswordAuthentication yes satırını PasswordAuthentication no olarak ayarlayarak parola tabanlı girişleri engelleyebilirsiniz.

Değişikliklerden sonra SSH servisini yeniden başlatın:


sudo systemctl restart sshd
  

Güvenlik Duvarı Yapılandırması (UFW)

Ubuntu’da UFW (Uncomplicated Firewall), sunucunuza gelen ve giden trafiği yönetmek için kullanıcı dostu bir arayüz sağlar. Sadece gerekli portları açarak sunucunuzu dışarıdan gelebilecek saldırılara karşı koruyabilirsiniz.


sudo ufw allow OpenSSH  # SSH erişimine izin ver
sudo ufw allow http     # HTTP (80) portuna izin ver
sudo ufw allow https    # HTTPS (443) portuna izin ver
sudo ufw enable         # Güvenlik duvarını etkinleştir
sudo ufw status         # Güvenlik duvarı durumunu kontrol et
  

Eğer SSH portunu değiştirdiyseniz, OpenSSH yerine yeni port numarasını belirtmeniz gerekir: sudo ufw allow [yeni_ssh_portu]/tcp.

Zaman Dilimi ve Yerel Ayarlar

Sunucunuzun doğru zaman dilimine ayarlanması, logların doğru tutulması ve zaman bazlı işlemlerin (örneğin cron işleri) düzgün çalışması için önemlidir.


sudo timedatectl set-timezone Europe/Istanbul # Kendi zaman diliminizi ayarlayın
timedatectl                                   # Ayarları kontrol edin
  

Yerel ayarlar (locale) ise, sistem mesajlarının ve programların dilini, karakter setini ve diğer bölgesel ayarları belirler. Genellikle varsayılan ayarlar yeterli olsa da, belirli uygulamalar için özel bir locale gerekebilir.

Vaka Analizi: Yanlış Yapılandırılmış Sunucunun Riskleri

Bir yazılım firması, yeni müşterisi için acilen bir test sunucusu kurmak zorundaydı. Hızlı davranmak adına, sistem güncellemelerini atladılar, root ile SSH erişimini açık bıraktılar ve güvenlik duvarını hiç yapılandırmadılar. Birkaç hafta sonra, sunucuya dışarıdan sızıldığı ve kötü amaçlı yazılımların yüklendiği fark edildi. Bu durum, hem firmanın itibarını zedeledi hem de müşteri verilerinin tehlikeye girmesine neden oldu. Bu örnek, yukarıdaki temel hazırlık adımlarının ne kadar kritik olduğunu açıkça göstermektedir. Her adım, potansiyel bir güvenlik açığını kapatır ve sunucunun genel sağlığını iyileştirir.

Nginx ile Güçlü Bir Ters Proxy ve Statik İçerik Sunucusu Nasıl Kurulur?

Nginx (Engine-X olarak telaffuz edilir), yüksek performanslı, hafif ve esnek bir web sunucusu ve ters proxy çözümüdür. Modern web mimarilerinin vazgeçilmez bir parçası haline gelmiştir. Peki, Nginx’in rolü nedir ve neden onu kullanmalıyız?

Nginx, uygulama sunucunuzun önünde bir “ters proxy” (reverse proxy) görevi görerek gelen tüm web isteklerini karşılar. Bu, Nginx’in birçok avantaj sunmasını sağlar:

  • Yük Dengeleme: Birden fazla uygulama sunucusu örneği çalıştırıyorsanız, Nginx gelen istekleri bu sunucular arasında dağıtarak yükü dengeleyebilir ve performansı artırabilir.
  • SSL/TLS Sonlandırma: SSL sertifikalarını Nginx üzerinde yöneterek, uygulama sunucunuzun bu yükten kurtulmasını sağlar. Bu, uygulamanızın performansını artırır ve SSL yapılandırmasını merkezileştirir.
  • Statik İçerik Sunma: Resimler, CSS, JavaScript gibi statik dosyaları doğrudan Nginx üzerinden sunarak, uygulama sunucunuzun daha çok dinamik içerik üretimine odaklanmasına olanak tanır. Bu, genel yanıt süresini önemli ölçüde hızlandırır.
  • Önbellekleme: Sıkça istenen içerikleri önbelleğe alarak sunucu yükünü azaltır ve yanıt sürelerini iyileştirir.
  • Güvenlik: Temel düzeyde DDoS koruması sağlayabilir ve uygulamanızı doğrudan internete maruz kalmaktan korur.

Nginx Kurulumu

Ubuntu 24.04 üzerinde Nginx kurulumu oldukça basittir:


sudo apt update
sudo apt install nginx -y
  

Kurulum tamamlandıktan sonra, Nginx servisi otomatik olarak başlar. Durumunu kontrol etmek için:


sudo systemctl status nginx
  

Tarayıcınızda sunucunuzun IP adresini veya alan adını ziyaret ettiğinizde “Welcome to Nginx!” sayfasını görmelisiniz. Eğer görmüyorsanız, güvenlik duvarınızı (UFW) kontrol ettiğinizden ve HTTP (80) portuna izin verdiğinizden emin olun.

Temel Nginx Yapılandırması ve Sanal Hostlar

Nginx’in ana yapılandırma dosyası /etc/nginx/nginx.conf adresindedir. Ancak, her site veya uygulama için ayrı yapılandırma dosyaları oluşturmak ve bunları sites-available dizininde tutmak daha iyi bir uygulamadır. Daha sonra, etkinleştirmek istediğiniz yapılandırmaları sites-enabled dizinine sembolik link (symlink) ile bağlarsınız.

Yeni bir site yapılandırma dosyası oluşturalım (örneğin, /etc/nginx/sites-available/uygulamam):


# /etc/nginx/sites-available/uygulamam
server {
    listen 80;
    server_name www.ornekuygulama.com ornekuygulama.com; # Alan adınızı buraya yazın

    root /var/www/ornekuygulama; # Statik dosyalarınızın yolu
    index index.html index.htm;

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

    # Hata sayfaları
    error_page 404 /404.html;
    location = /404.html {
        internal;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        internal;
    }
}
  

Bu örnek, temel bir statik web sitesi yapılandırmasıdır. root direktifi, Nginx’in statik dosyaları nerede arayacağını belirtir. server_name ise, bu yapılandırmanın hangi alan adları için geçerli olduğunu tanımlar.

Yapılandırmayı etkinleştirmek için bir sembolik link oluşturun ve Nginx’i yeniden yükleyin:


sudo ln -s /etc/nginx/sites-available/uygulamam /etc/nginx/sites-enabled/
sudo nginx -t # Yapılandırma dosyasında hata olup olmadığını kontrol et
sudo systemctl restart nginx
  

Uzman İpucu: Nginx ile Performansı Artırın

Nginx yapılandırmanızda gzip on; ekleyerek sıkıştırmayı etkinleştirebilir, böylece bant genişliği kullanımını azaltabilir ve sayfa yükleme sürelerini hızlandırabilirsiniz. Ayrıca, expires direktiflerini kullanarak tarayıcı önbelleklemesini optimize edebilirsiniz. Örneğin, statik dosyalar için expires 30d; eklemek, kullanıcıların bu dosyaları 30 gün boyunca yerel olarak önbelleğe almasını sağlar.

Vaka Analizi: E-ticaret Sitesinin Yük Problemleri

Küçük bir e-ticaret sitesi, Black Friday indirimleri sırasında aşırı yük nedeniyle çökmeye başladı. Uygulama sunucusu, hem dinamik içerik üretmek hem de binlerce statik ürün görselini aynı anda sunmaya çalışıyordu. Çözüm olarak, Nginx bir ters proxy olarak yapılandırıldı. Tüm statik dosyalar (resimler, CSS, JS) doğrudan Nginx tarafından servis edildi ve Nginx’in önbellekleme özellikleri etkinleştirildi. Gelen dinamik istekler ise Nginx tarafından uygulama sunucusuna yönlendirildi. Bu değişiklik sayesinde, uygulama sunucusu üzerindeki yük %60 oranında azaldı ve site yoğun trafik altında bile kesintisiz hizmet vermeye devam etti. Bu, Nginx’in doğru yapılandırmayla nasıl bir performans cankurtaranı olabileceğinin mükemmel bir örneğidir.

Node.js Uygulamasını Dağıtma ve PM2 ile Yönetme: Bir Örnek Uygulama

Node.js, sunucu tarafında JavaScript çalıştırmanıza olanak tanıyan güçlü bir çalışma zamanı ortamıdır. Hızlı ve ölçeklenebilir web uygulamaları geliştirmek için popüler bir tercihtir. Ancak, bir Node.js uygulamasını üretim ortamında güvenilir bir şekilde çalıştırmak, sadece node app.js komutunu çalıştırmaktan daha fazlasını gerektirir. İşte burada PM2 gibi bir süreç yöneticisi devreye girer.

Node.js Kurulumu (NVM ile Önerilir)

Node.js’i doğrudan Ubuntu’nun paket yöneticisinden kurmak mümkün olsa da, NVM (Node Version Manager) kullanmak, farklı Node.js sürümleri arasında kolayca geçiş yapmanızı ve projelerinize özel sürümleri yönetmenizi sağlar. Bu, özellikle birden fazla Node.js projesi çalıştırıyorsanız çok faydalıdır.

NVM’yi kurmak için:


curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
  

Kurulumdan sonra terminali kapatıp yeniden açmanız veya aşağıdaki komutu çalıştırmanız gerekebilir:


source ~/.bashrc # veya ~/.zshrc eğer zsh kullanıyorsanız
  

Şimdi NVM’yi kullanarak Node.js’in en son LTS (Uzun Süreli Destek) sürümünü kurabiliriz:


nvm install --lts
nvm use --lts
node -v # Yüklü Node.js sürümünü kontrol edin
npm -v  # Yüklü NPM sürümünü kontrol edin
  

Basit Bir Node.js Uygulaması Oluşturma

Örnek olarak, “Merhaba Dünya” döndüren basit bir Express.js uygulaması oluşturalım. İlk olarak, projeniz için bir dizin oluşturun ve içine girin:


mkdir ~/my_nodejs_app
cd ~/my_nodejs_app
npm init -y
npm install express
  

Şimdi app.js adında bir dosya oluşturun ve aşağıdaki kodu içine yapıştırın:


// ~/my_nodejs_app/app.js
const express = require('express');
const app = express();
const port = 3000; // Uygulamanızın çalışacağı port

app.get('/', (req, res) => {
  res.send('Merhaba Ubuntu 24.04 Uygulama Sunucusu!');
});

app.listen(port, () => {
  console.log(Uygulama http://localhost:${port} adresinde çalışıyor);
});
  

Uygulamanızı manuel olarak test etmek için:


node app.js
  

Ancak bu, uygulamayı arka planda çalıştırmaz ve terminali kapattığınızda durur. İşte burada PM2 devreye giriyor.

PM2 ile Node.js Uygulamalarını Yönetme

PM2 (Process Manager 2), Node.js uygulamalarını üretim ortamında sürekli çalışır halde tutmak, izlemek ve yönetmek için tasarlanmış bir süreç yöneticisidir. Sunduğu başlıca özellikler:

  • Otomatik Yeniden Başlatma: Uygulama çöktüğünde veya beklenmedik bir şekilde durduğunda otomatik olarak yeniden başlatır.
  • Süreç Yönetimi: Uygulamanızı arka planda çalıştırır, terminali kapatsanız bile aktif kalmasını sağlar.
  • Yük Dengeleme: Birden fazla CPU çekirdeğinden yararlanmak için uygulamanızın birden fazla örneğini çalıştırabilir.
  • İzleme: CPU, bellek kullanımı, loglar gibi metrikleri izlemek için kullanışlı komutlar sunar.
  • Başlangıç Betikleri: Sunucu yeniden başlatıldığında uygulamalarınızın otomatik olarak başlamasını sağlar.

PM2 Kurulumu ve Uygulamayı Başlatma


npm install pm2 -g
pm2 start ~/my_nodejs_app/app.js --name "my-ubuntu-app"
  
  • pm2 start app.js: Uygulamanızı PM2 ile başlatır.
  • --name "my-ubuntu-app": Uygulamanıza kolayca tanınabilir bir isim verir.

PM2’nin durumunu kontrol etmek için:


pm2 list
pm2 monit # Gerçek zamanlı izleme
pm2 logs my-ubuntu-app # Uygulamanın loglarını görüntüleme
  

Sunucu yeniden başlatıldığında uygulamalarınızın otomatik olarak başlaması için başlangıç betikleri oluşturun:


pm2 startup systemd
pm2 save # Mevcut PM2 süreçlerini kaydet
  

Bu komutlar, sisteminizin init sistemi (Ubuntu’da Systemd) için bir PM2 başlangıç betiği oluşturacak ve mevcut tüm PM2 süreçlerinizi kaydederek sunucu yeniden başlatıldığında otomatik olarak başlamalarını sağlayacaktır.

Nginx’i Node.js Uygulamasına Ters Proxy Olarak Bağlama

Şimdi Nginx’i, Node.js uygulamanızdan gelen istekleri dinlemesi ve uygulamanıza yönlendirmesi için yapılandıralım. Nginx yapılandırma dosyanızı (/etc/nginx/sites-available/uygulamam) aşağıdaki gibi güncelleyin:


# /etc/nginx/sites-available/uygulamam
server {
    listen 80;
    server_name www.ornekuygulama.com ornekuygulama.com; # Alan adınızı buraya yazın

    location / {
        proxy_pass http://localhost:3000; # Node.js uygulamanızın çalıştığı adres ve port
        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;
    }

    # Statik dosyalarınız varsa, onları doğrudan Nginx'ten sunmak için
    # location /static/ {
    #     alias /path/to/your/nodejs/app/public/static/;
    #     expires 30d;
    #     add_header Cache-Control "public, no-transform";
    # }
}
  

Yapılandırmayı test edin ve Nginx’i yeniden başlatın:


sudo nginx -t
sudo systemctl restart nginx
  

Artık alan adınızı veya sunucu IP adresinizi tarayıcınızda ziyaret ettiğinizde, Nginx isteği Node.js uygulamanıza iletecek ve uygulamanızın yanıtını göreceksiniz. Bu yapılandırma, uygulamanızı doğrudan internete maruz bırakmadan güvenli ve performanslı bir şekilde yayınlamanızı sağlar.

Vaka Analizi: PM2 ile Kesintisiz Dağıtım

Bir SaaS şirketi, müşterilerine 7/24 hizmet veren bir Node.js tabanlı API geliştiriyordu. Yeni özellikler veya hata düzeltmeleri yayınlandığında, geleneksel yöntemlerle uygulamayı durdurup yeniden başlatmak, kısa süreli de olsa hizmet kesintilerine yol açıyordu. Bu, kurumsal müşteriler için kabul edilemezdi. PM2’nin “zero-downtime deployment” (sıfır kesintiyle dağıtım) özelliği sayesinde, yeni kod dağıtıldığında PM2 eski uygulama süreçlerini yavaşça sonlandırırken, yeni süreçleri başlatıyor ve trafik yeni versiyona sorunsuz bir şekilde yönlendiriliyordu. Bu sayede, müşteriler hiçbir kesinti yaşamadan güncellenmiş API’yi kullanmaya devam edebildiler, bu da müşteri memnuniyetini ve hizmet kalitesini önemli ölçüde artırdı.

Güvenliği Sıkılaştırma: SSL/TLS ve Güvenlik Duvarı Yapılandırması

Uygulamanızın yayında olması harika, ancak güvenlik olmadan bir web uygulaması, açık kapı bırakılmış bir eve benzer. Kullanıcı verilerinin korunması, veri bütünlüğünün sağlanması ve arama motoru sıralamalarında iyi bir yer edinmek için SSL/TLS şifrelemesi ve sağlam bir güvenlik duvarı yapılandırması olmazsa olmazdır.

SSL/TLS ile HTTPS Etkinleştirme (Certbot ve Let’s Encrypt)

SSL/TLS (Secure Sockets Layer/Transport Layer Security), sunucu ile istemci (tarayıcı) arasındaki tüm iletişimi şifreleyen bir protokoldür. Bu, özellikle hassas verilerin (parolalar, kredi kartı bilgileri) aktarıldığı e-ticaret siteleri veya giriş panelleri için kritik öneme sahiptir. HTTPS, aynı zamanda SEO için de önemli bir sıralama faktörüdür.

Let’s Encrypt, ücretsiz, otomatik ve açık bir Sertifika Yetkilisi (CA) olup, web siteniz için kolayca SSL/TLS sertifikaları almanızı sağlar. Certbot ise, Let’s Encrypt sertifikalarını otomatik olarak alıp yapılandıran bir araçtır.

Certbot Kurulumu ve Sertifika Alma

Certbot’u Nginx ile kullanmak için aşağıdaki adımları izleyin:


sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx -d ornekuygulama.com -d www.ornekuygulama.com
  
  • sudo snap install core; sudo snap refresh core: Snap paket yöneticisini günceller.
  • sudo snap install --classic certbot: Certbot’u yükler.
  • sudo ln -s /snap/bin/certbot /usr/bin/certbot: Certbot komutunu sistem PATH’ine ekler.
  • sudo certbot --nginx -d ornekuygulama.com -d www.ornekuygulama.com: Nginx için sertifika alır ve Nginx yapılandırmanızı otomatik olarak günceller. Alan adlarınızı (-d parametresi ile) doğru şekilde belirttiğinizden emin olun.

Certbot, size bazı sorular soracaktır (e-posta adresi, hizmet şartlarını kabul etme, HTTP trafiğini HTTPS’e yönlendirme isteyip istemediğiniz gibi). Genellikle, tüm HTTP trafiğini HTTPS’e yönlendirmeyi seçmek en iyi uygulamadır.

Sertifika Yenileme

Let’s Encrypt sertifikaları 90 gün geçerlidir. Certbot, bu sertifikaları otomatik olarak yenilemek için bir cron işi veya systemd zamanlayıcısı ayarlar. Yenileme işlemini manuel olarak test edebilirsiniz:


sudo certbot renew --dry-run
  

Bu komut, sertifikaların başarıyla yenileneceğini doğrular.

Gelişmiş Güvenlik Duvarı Yapılandırması (UFW)

Daha önce temel UFW kurallarını ayarlamıştık. Şimdi, uygulamanızın ihtiyaçlarına göre daha spesifik kurallar ekleyebiliriz. Örneğin, veritabanınız sadece uygulama sunucunuzdan erişilebilir olmalıysa, veritabanı portunu sadece belirli IP adreslerine açabilirsiniz.


# Eğer veritabanı sunucunuz farklı bir IP'deyse ve sadece oradan erişim istiyorsanız
# sudo ufw allow from [veritabani_sunucusu_ip_adresi] to any port 5432 # PostgreSQL için
# sudo ufw allow from [veritabani_sunucusu_ip_adresi] to any port 3306 # MySQL için

# Nginx'in 80 ve 443 portlarını zaten açmıştık.
# Eğer başka bir uygulama belirli bir portta çalışıyorsa ve dışarıdan erişilebilir olması gerekiyorsa:
# sudo ufw allow 8080/tcp # Örnek bir uygulama portu
sudo ufw status verbose
  

Unutmayın, güvenlik duvarı kurallarını uygularken dikkatli olun. Yanlış bir kural, sunucunuza erişimi tamamen engelleyebilir. Her zaman SSH bağlantınızın açık olduğundan emin olun veya bir konsol erişimine sahip olun.

Vaka Analizi: SSL Olmadan Çalışan Bir E-ticaret Sitesinin Riskleri

Küçük bir online butik, başlangıçta SSL sertifikası kullanmadan faaliyet gösteriyordu. Müşteriler ürünleri sepete ekleyebiliyor ve ödeme sayfasına gidebiliyorlardı. Ancak, ödeme sırasında kredi kartı bilgilerini girerken tarayıcılar “Güvenli Değil” uyarısı veriyordu. Bu durum, müşterilerin güvenini sarsıyor ve sepet terk oranlarını artırıyordu. Dahası, arama motorları bu siteyi HTTPS kullanan rakiplerine göre daha alt sıralarda gösteriyordu. Site sahibi, Certbot ile ücretsiz SSL kurduktan sonra, hem müşteri güveninde hem de arama motoru sıralamalarında belirgin bir iyileşme gözlemledi. Bu, SSL’in sadece güvenlik için değil, iş sürekliliği ve büyümesi için de ne kadar kritik olduğunun bir kanıtıdır.

Performans Optimizasyonu ve İleri Düzey Yapılandırma İpuçları

Uygulama sunucunuzu temel olarak kurup yapılandırdınız. Şimdi sıra, performansı artırmak, kaynak kullanımını optimize etmek ve daha sağlam bir altyapı oluşturmak için ileri düzey ipuçlarına ve en iyi uygulamalara geldi. Küçük optimizasyonlar bile, özellikle yüksek trafikli uygulamalarda büyük fark yaratabilir.

Nginx Optimizasyonları

Nginx, doğru yapılandırıldığında muazzam bir performans sunar.

  • GZIP Sıkıştırma: Web sayfalarının, CSS ve JavaScript dosyalarının boyutunu küçülterek bant genişliği kullanımını azaltır ve yükleme sürelerini hızlandırır.
    
    # /etc/nginx/nginx.conf içinde http bloğuna ekleyin
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
          
  • HTTP/2 Etkinleştirme: HTTP/2, web performansını önemli ölçüde artıran daha modern bir protokoldür. Nginx’te HTTPS ile birlikte etkinleştirilir. SSL yapılandırmanızda listen 443 ssl http2; şeklinde belirtmeniz yeterlidir.
  • Önbellekleme (Caching): Sıkça istenen statik dosyaları (resimler, CSS, JS) veya hatta dinamik yanıtları Nginx üzerinde önbelleğe alarak uygulama sunucusuna olan yükü azaltabilirsiniz.
    
    # /etc/nginx/nginx.conf içinde http bloğuna ekleyin
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
    
    # site yapılandırmanızda (server bloğu içinde)
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        add_header X-Cache-Status $upstream_cache_status;
        proxy_pass http://localhost:3000;
        # ... diğer proxy ayarları ...
    }
          

    Bu örnek, dinamik içerik için temel bir önbellekleme ayarı gösterir. Dikkatli kullanılmalı ve uygulamanızın dinamik yapısına göre ayarlanmalıdır.

Sunucu Kaynak İzleme ve Log Yönetimi

Sunucunuzun performansını anlamak ve olası sorunları tespit etmek için kaynak kullanımını izlemek hayati öneme sahiptir.

  • CPU ve Bellek İzleme: htop, top, free -h gibi komutlarla anlık CPU, bellek ve süreç kullanımını takip edebilirsiniz. Daha gelişmiş izleme için Prometheus, Grafana gibi araçlar kullanılabilir.
  • Disk Kullanımı: df -h komutu ile disk alanı kullanımını kontrol edin. Disk doluluğu performansı ciddi şekilde etkileyebilir.
  • Log Yönetimi: Uygulama ve sunucu logları, sorun giderme ve güvenlik analizi için paha biçilmezdir. logrotate aracı, log dosyalarının boyutunu yönetmek ve diskte yer kaplamalarını önlemek için kullanılır. Nginx ve diğer servisler için varsayılan olarak yapılandırılmıştır, ancak uygulamanızın logları için de özel kurallar ekleyebilirsiniz.

Otomatik Dağıtım (CI/CD) Entegrasyonuna Giriş

Manuel olarak uygulama dağıtımı yapmak zaman alıcı ve hataya açıktır. CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) boru hatları, kod değişikliklerinin otomatik olarak test edilmesini, derlenmesini ve üretim sunucularına dağıtılmasını sağlar. GitHub Actions, GitLab CI/CD, Jenkins gibi araçlar, bu süreçleri otomatikleştirmek için kullanılabilir.

Basit bir dağıtım senaryosunda, kodunuzu bir Git deposuna (örneğin GitHub) push yaptığınızda, bir CI/CD aracı otomatik olarak tetiklenir, testleri çalıştırır, uygulamanızı derler ve SSH aracılığıyla sunucunuza bağlanarak yeni kodu çeker, bağımlılıkları yükler ve PM2 gibi bir süreç yöneticisi aracılığıyla uygulamanızı yeniden başlatır (veya sıfır kesintiyle günceller).

Konteynerizasyon (Docker) ve Sanallaştırma (VM)

Uygulama sunucusu yapılandırmalarını daha esnek ve taşınabilir hale getirmek için konteynerizasyon ve sanallaştırma teknolojileri kullanılabilir:

  • Sanallaştırma (VM): Bir fiziksel sunucu üzerinde birden fazla izole işletim sistemi çalıştırmanıza olanak tanır. Her VM’nin kendi çekirdeği, işletim sistemi ve kaynakları vardır. Daha fazla izolasyon sağlar ancak kaynak tüketimi daha yüksektir.
  • Konteynerizasyon (Docker): Uygulamanızı tüm bağımlılıklarıyla birlikte hafif, taşınabilir bir “konteyner” içinde paketler. Konteynerler, ana bilgisayarın çekirdeğini paylaşır ve VM’lere göre daha az kaynak tüketir, daha hızlı başlar ve daha kolay ölçeklenir. Uygulama sunucusu kurulumu, bir Docker imajı içinde tanımlanabilir ve bu imaj her yerde aynı şekilde çalışır. Bu, “benim makinemde çalışıyordu” sorununu ortadan kaldırır.

Gelecekteki projelerinizde Docker ve Docker Compose gibi araçları kullanarak uygulama sunucusu ortamınızı daha modüler ve yönetilebilir hale getirmeyi düşünebilirsiniz.

Uzman İpucu: Monitörleme ve Uyarı Sistemleri

Uygulama sunucunuzun sağlığını ve performansını sürekli izlemek için Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana) gibi araçları kurmayı düşünün. Bu sistemler, kritik metriklerde anormal durumlar oluştuğunda size otomatik olarak bildirim göndererek proaktif bir şekilde sorunları çözmenize yardımcı olur. Örneğin, CPU kullanımı %90’ı aştığında veya bellek tükenmeye başladığında SMS veya e-posta ile uyarı alabilirsiniz.

Sonuç: Uygulama Sunucunuz Artık Yayında!

Bu kapsamlı rehber boyunca, Ubuntu 24.04 üzerinde sağlam ve güvenilir bir uygulama sunucusu kurmak ve yapılandırmak için gerekli tüm adımları detaylı bir şekilde inceledik. İlk olarak, sisteminizi güncelleyerek ve temel güvenlik önlemlerini alarak sağlam bir zemin hazırladık. Ardından, Nginx’i güçlü bir ters proxy ve statik içerik sunucusu olarak yapılandırarak uygulamanızın önünde bir kalkan oluşturduk. Node.js uygulamanızı PM2 ile yönetmeyi öğrenerek, uygulamanızın sürekli ve kesintisiz çalışmasını sağladık. Son olarak, SSL/TLS şifrelemesi ve güvenlik duvarı ayarlarıyla güvenliği sıkılaştırırken, performans optimizasyonları ve ileri düzey ipuçlarıyla sunucunuzu daha verimli hale getirdik.

Artık uygulamanız, internet dünyasında güvenle yerini almaya hazır. Unutmayın ki sunucu yönetimi sürekli bir süreçtir. Güvenlik güncellemelerini takip etmek, logları düzenli olarak kontrol etmek ve performansı izlemek, uygulamanızın uzun ömürlü ve sorunsuz çalışması için kritik öneme sahiptir. Bu rehber, size güçlü bir başlangıç noktası sunarken, teknoloji dünyasındaki yenilikleri takip ederek ve öğrendiklerinizi uygulayarak bilginizi sürekli genişletmeniz gerektiğini hatırlatır. Başarılar dileriz!

Sıkça Sorulan Sorular (SSS)

Uygulama sunucusu ve web sunucusu arasındaki temel fark nedir?

Cevap: Web sunucusu (örneğin Nginx, Apache HTTP Server), statik dosyaları (HTML, CSS, JS, resimler) doğrudan istemcilere sunmak veya dinamik içerik isteklerini uygulama sunucusuna yönlendirmekle sorumludur. Uygulama sunucusu ise (örneğin Node.js, Gunicorn, Tomcat), gelen dinamik istekleri işler, veritabanlarıyla etkileşime girer, iş mantığını yürütür ve dinamik içerik (HTML parçaları, JSON verisi) üretir. Genellikle bir web sunucusu, uygulama sunucusunun önünde bir ters proxy olarak görev yapar.

Neden Nginx kullanmalıyım? Apache’den farkı ne?

Cevap: Nginx, yüksek eşzamanlı bağlantıları (concurrent connections) daha az bellek tüketimiyle yönetme konusunda Apache’ye göre genellikle daha performanslıdır. Özellikle statik içerik sunumu ve ters proxy olarak kullanıldığında Nginx öne çıkar. Apache ise daha modüler bir yapıya sahiptir ve .htaccess dosyaları gibi dizin bazlı yapılandırmalarla esneklik sunar. Çoğu modern web uygulaması mimarisinde, Nginx ters proxy olarak kullanılırken, dinamik içerik işleme uygulama sunucularına bırakılır.

PM2 yerine başka bir süreç yöneticisi kullanabilir miyim?

Cevap: Evet, PM2 Node.js için popüler bir seçenek olsa da, Forever, Supervisor gibi başka süreç yöneticileri de mevcuttur. Ayrıca, Systemd gibi işletim sistemi düzeyindeki init sistemlerini doğrudan kullanarak da uygulamanızı bir servis olarak çalıştırabilirsiniz. PM2, özellik zenginliği (izleme, yük dengeleme, başlangıç betikleri) nedeniyle genellikle tercih edilir.

Ubuntu 24.04’te güvenlik güncellemelerini nasıl takip etmeliyim?

Cevap: Güvenlik güncellemelerini düzenli olarak sudo apt update && sudo apt upgrade -y komutlarıyla manuel olarak yapabilirsiniz. Daha otomatize bir yaklaşım için, Ubuntu’nun unattended-upgrades paketini kurarak kritik güvenlik güncellemelerinin otomatik olarak yüklenmesini sağlayabilirsiniz. Bu, sunucunuzun her zaman güncel kalmasına yardımcı olurken, manuel müdahale ihtiyacını azaltır.

Uygulama sunucumu ölçeklendirmek için ne yapmalıyım?

Cevap: Uygulama sunucunuzu ölçeklendirmenin iki ana yolu vardır:

  1. Dikey Ölçeklendirme (Vertical Scaling): Mevcut sunucunuzun CPU, RAM veya disk kapasitesini artırmaktır. Daha güçlü bir sunucuya geçiş yaparsınız.
  2. Yatay Ölçeklendirme (Horizontal Scaling): Uygulamanızın birden fazla kopyasını farklı sunucularda veya konteynerlerde çalıştırıp, bir yük dengeleyici (örneğin Nginx veya özel bir yük dengeleyici hizmeti) aracılığıyla gelen trafiği bu kopyalar arasında dağıtmaktır. Bu yöntem, daha yüksek erişilebilirlik ve daha iyi performans sağlar. PM2’nin küme modu (cluster mode) da tek bir sunucu üzerinde yatay ölçeklendirmeye benzer bir etki yaratır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.