• Web (HTTP) Servis Yönetimi | LKD #2

    Web sunucularının tarihi 90’lara dayanır. O dönemde en popüler web sunucusu, Rob McCool tarafından geliştirilen NCSA HTTPd çekiyordu. Ancak 1994’te McCool projeyi bırakıp Netscape’e geçince, sunucu yazılımı bir anda sahipsiz kaldı.

    NCSA HTTPd desteğini yitirince, topluluk bu kodu patch’leyerek (yamalayarak) “A Patchy Server” yani Apache’yi ortaya çıkardı ve zamanla bu yapı dev bir vakfa dönüştü. Apache 1’den Apache 2’ye geçiş sürecinde sistem çok yavaşlayınca, bu hantallığa tepki olarak yüksek performanslı Nginx doğdu; ancak zamanla Nginx de benzer karmaşık modülleri ve yenilikleri bünyesine katarak o da yavaşlamaya başladı. Günümüzde rekabet sürüyor.

    İlk önce Debian ve Rocky makinelerimize Nginx kurarak başlayalım.

    Kurulum Aşaması

    Paketleri yüklemek için 2 farklı seçeneğimiz bulunuyor:

    • Doğrudan üreticinin deposundan son sürümü indirip kurabiliriz.
    • Kullandığımız dağıtımın paket depolarında bulunan sürümü indirip kullanabiliriz, bunun dezavantajı daima güncel sürümün paket depolarında bulunamaması olabiliyor.

    Kullanacağımız yönteme göre dosyaların kurulumları, konfigürasyonları farklılık gösterebilir.

    Güvenliği, kullanılabilirliği düşündüğümüzde doğru tercih paket deposunu tercih etmek olacaktır.

    Sürümlerde,
    Stable sürüm (çift haneliler) uzun süre destek verilen sürümlerdir. (LTS ile aynı mantıkta)
    Mainline sürüm (tek haneliler) şu anda test edilen sürümlerdir. (LTS olmayanlar)

    Dikkat, burada Apache ve Nginx sunucularında bir port çakışmaması yaşanmaması adına Apache kurduğumuz sanal makinenin aksine yeni bir sanal makineye Nginx kuracağız.

    Debian NGİNX Kurulumu

    Güncellemeleri yaparak başlıyoruz.

    bash
    user@linux:~$ sudo apt update && sudo apt upgrade -y

    Kurulum öncesinde kuracağımız Nginx sürümünü öğrenmek için,

    bash
    user@linux:~$ apt info nginx

    yazarak

    çıktısını alıyoruz. Bu şekilde indirilecek sürümü, bağımlılıkları… öğrenebiliyoruz. (Ben daha önce indirdiğim için çıktı farklı olacaktır.)

    bash
    user@linux:~$ sudo apt install nginx -y

    Kurulan paketleri listelemek için:

    bash
    user@linux:~$ dpkg -L nginx

    Burada service dosyalarını göremedik çünkü, Nginx’in servis dosyası, paket parçalama stratejisi gereği ortak dosyaları içeren nginx-common paketiyle birlikte gelir ve genellikle /lib/systemd/system/nginx.service yolunda bulunur.

    Rocky NGİNX Kurulumu

    Kuracağımız paketler hakkında bilgi almak için aşağıdaki komutu çalıştıralım.

    bash
    user@rocky:~$ dnf info nginx

    Kurmak için,

    bash
    user@rocky:~$ sudo dnf install nginx -y

    Çalıştıralım. Ardından kurduğumuz sunucunun durumunu kontrol etmek için komutları çalıştıralım.

    bash
    user@rocky:~$ sudo systemctl start nginx
    user@rocky:~$ sudo systemctl enable nginx
    user@rocky:~$ rpm -ql nginx
    user@rocky:~$ _

    Apache Ayar Dosyaları

    Rocky

    Rocky ile başlayalım. Kurulumlar /etc/httpd altında.

    Burada ve farklı kurulumlarda .d dosyaları, ana konfigürasyon dosyasına (örneğin nginx.conf) dokunmadan, dışarıdan uygulama veya modül bazlı ayarların bir klasör içine ayrı dosyalar halinde atılmasına olanak tanıyarak sistem yönetimini kolaylaştırır.

    httpd.conf Dosyası

    Web servisine ait ana ayarların yapıldığı dosyadır.

    Burada kök dizinimiz /etc/httpd olarak belirlenmiş, yani konfigürasyonun ilerleyen aşamasında tam yolu verilmeden tanımlanan bütün dizinlerin yeri burası olacaktır.

    Yönettiğimiz tüm servisleri yeni bir kullanıcı oluşturarak yönetiriz. Bu kullanıcı tek bir servisten sorumlu olmalıdır. Aksi taktirde çeşitli erişim ve güvenlik problemleri yaşanabilir. Örneğin Apache servisiyle MySQL servisi için tek bir kullanıcı belirlersek ilerleyen aşamalarda farklı dosyalarda güvenlik ile ilgili problemler baş gösterebilir.

    <Directory>, ile birer blok tanımı yaparız. Directory’nin yanında yazan index’te geçerli ayarları tanımlar. Eğer yanında özel bir index belirtmezsek bu ayarlar tüm dizinlerde geçerli olacak şekilde yapılandırılır.

    İndex belirttiğimizde, örneğin:

    Bu blok “/var/www”de geçerlidir. Özetle, bu yapı dizin bazlı özel ayarlamalar yapmamıza imkan sağlar.

    Burada da belirtilen, AllowOverride temelde şu anlama gelir, Apache’nin ana konfigürasyon dosyasındaki ayarların, web dizinleri içindeki .htaccess dosyaları tarafından geçersiz kılınıp kılınamayacağını belirleyen bir yapıdır. “None” ve “All” olmak üzere 2 seçeneği vardır.

    • AllowOverride None, ile .htaccess dosyaları tamamen yok sayılır. Tüm konfigürasyonlar ana dosyalardan yapılır.
    • AllowOverride All, ile .htaccess dosyaları konfigürasyon dosyalarında bulunan ayarları yok sayıp kendi kurallarını uygulatırlar.

    Dökümantasyonda .htaccess dosyalarının performansı düşürdüğüne ve bu sebepten bu yapı yerine directory kullanmanın avantajlı olduğuna dair bir not var. Bunun sebebi sunucu, her dosya isteğinde (bir resim, bir HTML sayfası vb.) o dizine ve tüm üst dizinlere bakıp .htaccess dosyası var mı diye kontrol eder. Bu da her “tık” için fazladan disk okuma işlemi demektir.

    Buradaki FollowSymLinks ifadesi sembolik bağlantılara izin verildiğini gösterir.

    Sembolik bağlantılar işimize nerede yarıyor:

    Kısaca bu ayar, bir dosya veya dizin asıl yerinde olmasa bile, sembolik bir bağ aracılığıyla ona erişilmesini sağlar. Bazı dezavantajları da bulunur, bu sebepten kapatılması da bazı sistem yöneticileri tarafından tercih edilebilir. Özellikle paylaşımlı sunucu ortamlarında, saldırganların sistem dosyalarına erişmesini engellemek için bu özellik devre dışı bırakılır veya kısıtlanır.

    Burada istemci için bir karşılama dosyası belirliyoruz. Web sitesine giriş yapıldığında ilk açılacak dosyayı bu ayarla belirleriz.

    Bu kısımda log’ların ne formatta tutulacağı belirlenir. access.log da başarılı ya da başarısız tüm loglar bulunur.

    Burada access.log tutmak için 2 farklı seçeneğimiz bulunuyor common ve combined. Combined farklı olarak Referer ve User-Agent bilgisi de tutar.
    Bu bilgilerin tutulması 5651 sayılı kanuna uyulması için önemlidir.

    Log level warn, Hangi durumlarda hata uyarısı verilir şeklinde.
    Possible values include kısmı derecelendirme içerir. En önemli durum en sondadır. Mesela error seçildiğinde error, crit, alert ve emerg loglanır.

    Referer, istemcinin hangi web sayfasından geldiğini söyler. Mesela farklı bir site üzerinden geldiyse referer bunu doğrudan belirtir. Eğer aynı sitede farklı bir sayfadan geldiyse referer, sayfayı da ekleyerek bunu belirtir.

    User-Agent, istemcinin kullandığı cihaza ait bazı bilgileri içerir. Örneğin,

    Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1 “.

    Referer ve User-Agent bilgisi tarayıcıda saklanır. Buna bağlı olarak kullanıcı tarafından değiştirilebilir, bu sebepten sunucu tarayıcıdan gelen bilgilere güvenmemelidir.

    alias_module sayesinde sunucunun dosya sistemindeki fiziksel bir klasörü, web sitesindeki sanal bir yola eşlemesi mümkün olur. Örneğin,

    Alias kullanarak sunucuya şunu dersin: “Ziyaretçi /resimler yoluna gitmek isterse, onu ana web klasörümün dışındaki /mnt/depo/gorseller klasörüne yönlendir.”.

    Sunucuya hangi çeşit dosyayı ne şekilde açacağını söyleyen bir rehberdir. Mesela,

    Sunucu, .Z, .gz veya .tgz uzantılı bir dosya gönderirken tarayıcıya “Bu bir sıkıştırılmış arşiv dosyasıdır” etiketini yapıştırır. Bu sayede tarayıcı, dosyayı bir metin gibi açmaya çalışmak yerine düzgün bir şekilde indirir veya uygun programla açar.

    Hangi hata mesajında hangi sayfa gösterilecek kısmıdır. İlgili hatalar için http return kodları kullanılır.

    Konfigürasyonun son satırında da conf.d’yi konfigürasyon dosyasına uygulatıp kapatıyoruz.

    Debian Apache2

    Apache2 kurulumu /etc/apache2 dizini altında bulunur.

    Burada ilk olarak dikkatimizi available-enabled çiftleri çekiyor.

    Available klasörleri tüm olası yapılandırma dosyalarının tutulduğu bir kütüphane görevi görürken, Enabled klasörleri sunucunun o an aktif olarak kullandığı yapılandırmaları belirtir. Enabled kısmındaki dosyalar sembolik linkler ile Available’dan bağlanmıştır.

    Burada Debian tabanlı dağıtımlarda kullanabileceğimiz, işimizi kolaylaştıran birkaç komut vardır.

    • a2enconf: Genel sunucu ayarlarını aktif etmek için kullanılır.
    • a2disconf: Genel sunucu ayarlarını inaktif hale getirmek için kullanılır (Sembolik bağlantı siler)
    • a2enmode: Modülü aktif eder.
    • a2dismode: Modülü inaktif eder.
    • a2ensite: Web sitesini yayına alır.
    • a2dissite: Web sitesini yayından alır.

    Sembolik bağlantıları düzenlemek için bu komutları kullanabiliriz. Syntax ” komut ilgili_dosya ” şeklindedir.

    Apache konfigürasyonunda genel yapı şu şekilde,

    userdir.conf dosyasında da her kullanıcı için özel bir kişisel web alanı açan ayarları içeren yapıdır. Ancak günümüzde pek tercih edilen bir yapı değildir.

    ports.conf dosyasında da Apache’nin hangi portları dinleyeceğini ve hangi IP adreslerinden gelen isteklere yanıt vereceğini belirleyen dosyadır.

    apache2.conf
    • Timeout 300 : Sunucunun bir isteği tamamlamak için bekleyeceği maksimum süredir. Eğer 5 dakikanın sonunda veri alışverişi olmazsa sunucu bağlantıyı koparır.
    • KeepAlive On : Aynı istemcinin (örneğin bir tarayıcı) birden fazla isteği (resimler, CSS dosyaları vb.) tek bir bağlantı üzerinden göndermesine izin verir.
    • MaxKeepAliveRequests 100 : Tek bir “KeepAlive” bağlantısı üzerinden yapılabilecek maksimum istek sayısını belirler. Burada 100 olarak ayarlanmış; yani bir bağlantı üzerinden 100 dosya alındıktan sonra bağlantı kapatılır ve yenisi açılır. Sınırsız yapmak için 0 verilebilir.
    • KeepAliveTimeout 5 : Sunucunun, mevcut bir bağlantıyı kapatmadan önce yeni bir istek gelmesi için bekleyeceği süredir (saniye). Eğer kullanıcı 5 saniye boyunca yeni bir şeye tıklamazsa veya bir dosya istemezse, sunucu bağlantıyı sonlandırır.

    Bu ayar, sunucunuza bağlanan ziyaretçilerin log dosyalarına nasıl kaydedileceğini belirler:

    • Off (Kapalı): Ziyaretçiler sadece IP adresleri ile kaydedilir
    • On (Açık): Sunucu, her IP adresinin hangi alan adına (hostname) ait olduğunu bulmak için bir DNS sorgusu yapar ve ismi kaydeder

    Bu kısımda Apache HTTP sunucusunda düzenli ifadeler (regex) kullanarak ismi “.ht” ile başlayan hassas yapılandırma dosyalarına (örn. .htaccess, .htpasswd) HTTP protokolü üzerinden gelen tüm istemci taleplerini “403 Forbidden” yanıtıyla reddeder.

    Görseldeki LogFormat satırlarında yer alan bazı önemli ifadelerin karşılıkları şunlardır:

    • %h (Remote Host): İsteği gönderen istemcinin IP adresidir.
    • %l (Remote Logname): İstemcinin kimliği (genelde - olarak görünür).
    • %u (Remote User): Eğer HTTP kimlik doğrulaması yapılmışsa kullanıcı adı.
    • %t (Time): İsteğin alındığı zaman damgası.
    • %r (First line of Request): İsteğin ilk satırı (Örn: GET /index.html HTTP/1.1).
    • %>s (Status): Sunucunun döndüğü durum kodu (Örn: 200, 404).
    • %O (Bytes Sent): Başlıklar (headers) dahil olmak üzere gönderilen toplam bayt miktarı.
    • %{Referer}i: İstemcinin bu sayfaya hangi adresten geldiğini gösteren “Referer” başlığı.
    • %{User-Agent}i: İstemcinin kullandığı tarayıcı ve işletim sistemi bilgisi.
    • %v: İsteğin yapıldığı sunucun adı (Virtual Host).
    • %p: İsteğin geldiği port numarası.

    Debian NGINX

    Kurulumlar /etc/nginx altında bulunur.

    NGİNX.conf

    gzip on; : Aktif edildiğinde, sunucu HTML, CSS ve JavaScript gibi metin tabanlı dosyaları sıkıştırarak gönderir.

    Bu ayarlar, Nginx web sunucusunun modüler bir yapıda çalışmasını sağlayarak farklı klasörlerdeki yapılandırma dosyalarını otomatik olarak ana ayarların içine dahil eder.

    Bu yapı sayesinde birden fazla web sitesini tek bir sunucu üzerinden canlandırabiliriz.

    Rocky NGINX

    Kurumlar /etc/nginx altında bulunur.

    Sunucunun ağ trafiği kapasitesini belirler; bu ayara göre her bir işlemci çekirdeği (worker) aynı anda en fazla 1024 bağlantıyı yönetebilir.

    Yani eğer sunucunda 1 tane worker process (işlemci çekirdeği) çalışıyorsa, aynı anda en fazla 1024 bağlantı kabul edilebilir. 1025. kişi gelirse, sunucu “meşgul” yanıtı döner veya bağlantıyı reddeder.

    Log Formatı

    Varsayılan web sunucusu tanımlanır. Hem ıpv4 hem de ıpv6 için ayarlar kabul edilir.

    Devamını okumak için…