Apache HTTP Sunucusu Sürüm 2.4

Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir
      grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller, Devingen
      Paylaşımlı Nesneler (DSO - Dynamic Shared Object) halinde
      httpd programından ayrı olarak derlenir. DSO modülleri
      sunucunun derlenmesi sırasında derlenebileceği gibi ayrı olarak derlenip
      daha sonra Apache Eklenti Aracı (Apache Extension Tool)
      apxs programı kullanılarak da sunucuya eklenebilir.
Bu belgede DSO modüllerinin kullanımının yanında teorisine de değinilecektir.
| İlgili Modüller | İlgili Yönergeler | 
|---|---|
Apache httpd modüllerini yüklemek için DSO desteği, Apache httpd
      çekirdeğine durağan olarak ilintilenerek derlenmiş olan
      mod_so adında bir modül tarafından sağlanır.
      core modülünden  başka, bir DSO modülü olamayan tek modül
      mod_so modülüdür. Apache ile dağıtılan hemen hemen tüm
      diğer Apache modülleri bir DSO modülüne yerleştirilebilir. Derlenmiş
      modüller mod_filanca.so biçeminde birer DSO ismi alırlar ve
      her biri istenirse apache2.conf dosyasında
      mod_so modülünün LoadModule yönergesiyle belirtilerek sunucu başlatılırken
      veya yeniden başlatılırken sunucuya yüklenebilir.
Kurulum belgesinde açıklandığı gibi, her DSO
      modülü configure programının
      --enable-mods-static seçeneği ile devredışı bırakılabilir.
Apache httpd modülleri için (özellikle üçüncü parti modüller için) DSO
      dosyası üretimini kolaylaştırmak amacıyla apxs
      (APache eXtenSion) adında yeni bir destek programı
      kullanılmaktadır. Bu program Apache httpd modüllerini Apache httpd kaynak
      ağacından ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache
      HTTP Sunucusu derlenirken DSO dosyalarını derlemek için platforma bağımlı
      derleyici ve ilintileyici seçenekleri apxs
      programının içine konur ve make install ile kurulum sırasında
      Apache httpd C başlık dosyaları da kurulur. Böylece
      kullanıcı Apache httpd dağıtımının kaynak ağacına ihtiyaç duymadan ve
      platforma bağımlı derleyici ve ilintileyici seçeneklerini bilmek zorunda
      kalmadan istediği Apache httpd modülünü apxs
      programını kullanarak derleyebilir.
Apache HTTP Sunucusu 2.x’in DSO özelliklerine bir giriş olarak burada kısaca bir bilgi vermekle yetinilecektir:
Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir
        özgün Apache htpd modülünü mod_filanca.so isminde
        bir  DSO modülü olarak derlemek ve kurmak için şöyle yapılır:
  $ ./configure --prefix=/kurulum/yeri --enable-filanca
  $ make install
Apache HTTP Sunucusunu tüm modüller etkin olarak
        derleyebilirsiniz. Fakat sunucunun başlatılması sırasında sadece temel
        modüller yüklenir.  Daha sonra apache2.conf içindeki
        LoadModule yönergelerini etkin
        veya etkisiz hale getirerek yüklenecek modülleri
        değiştirebilirsiniz.
$ ./configure --enable-mods-shared=all
$ make install
Bazı modüller sadece geliştiriciler içindir ve bunlar tüm
        modüllerin derlenmesini (all) seçseniz bile derlenmeyecektir.
        Geliştirici modülleri dehil tüm modülleri derlemek isterseniz
        reallyall kullanınız. Ek olarak, derlenmiş modüller için
        kullanılan LoadModule
        yönergelerinin tamamını --enable-load-all-modules derleme
        seçeneği ile etkin kılabilirsiniz.
$ ./configure --enable-mods-shared=reallyall --enable-load-all-modules
$ make install
Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir
        üçüncü parti Apache httpd modülü mod_filanca.so
        isminde bir DSO modülü olarak Apache httpd kaynak ağacının dışında
        apxs kullanarak derlemek ve kurmak için şöyle
        yapılır:
$ cd /bir/kurulum/yeri
$ apxs -c mod_filanca.c
$ apxs -aci filanca mod_filanca.la
Tüm durumlarda derlenen paylaşımlı modülü Apache httpd’nin etkin
      kılabilmesi  için apache2.conf dosyasında o modül için bir
      LoadModule yönergesi
      bulunmalıdır.
Ayrıntılı bilgi için apxs belgelerine bakınız.
Günümüzün Unix türevlerinde var olan bir mekanizma sayesinde çalıştırılabilir bir programın adres uzayına çalışma anında yüklenmek veya ilintilenmek üzere Devingen Paylaşımlı Nesneler (DSO - Dynamic Shared Object) adı verilen, özel bir biçem kullanarak kodlanmış program parçaları oluşturulabilir.
Bu yükleme normalde iki yolla yapılabilir: Ya çalıştırılabilir
      programın başlatılması sırasında yüklenen ld.so adlı bir
      sistem programınının devingen olarak yüklenmesi ile ya da
      çalıştırılabilir programın içinden Unix yükleyicisine programsal sistem
      arayüzü sağlayan dlopen()/dlsym() sistem çağrılarının elle
      yapılması suretiyle.
İlk yöntemde kullanılan DSO’lara genelde paylaşımlı
      kütüphaneler veya DSO kütüphaneleri adı verilir ve
      bunların dosyaları libfilanca.so veya
      libfilanca.so.1.2 biçiminde isimlendirilir. Belli bir
      sistem dizininde (normalde /usr/lib) bulunurlar ve derleme
      sırasında ilintileyici komutuna -lfilanca şeklinde
      belirtilerek çalıştırılabilir programla ilintilenirler. Doğrudan
      çalıştırılabilir koda eklenen bu kodlar Unix yükleyicisinin programın
      başlatılması sırasında kütüphaneyi /usr/lib altında
      libfilanca.so adıyla bulabilmesini sağlar. Kütüphanelerin
      aranacağı yerler ya -R gibi bir ilintileyici seçeneği ile
      koda eklenir ya da arama yolları LD_LIBRARY_PATH ortam
      değişkeni aracılığıyla yapılandırılır. Böylece çalıştırılabilir
      programda henüz çözümlenmemiş simgeler DSO içinde bulunarak
      çözümlenebilir.
Çalıştırılabilir program içindeki simgelere normalde DSO içinden
      atıfta bulunulmaz (genel kod kütüphanesinin başka programlarca da
      kullanılması nedeniyle). Bu bakımdan DSO tarafında böyle bir çözümleme
      yapılmaz. Çalıştırılabilir program da DSO’daki simgeleri kendisi
      çözümlemeye uğraşmaz, bu işlemlerden tamamen Unix yükleyicisi
      (ld.so) sorumludur. (Aslında, ld.so’yu
      çağıracak kod, her çalıştırılabilir programın içine ilintilenmiş
      (durağan değil) başlatma kodunun bir parçasıdır.) Programlar tarafından
      ortaklaşa kullanılan kütüphanelerin devingen olarak yüklenmesinin sebebi
      basittir: Kütüphane kodu libc.so gibi bir sistem
      kütüphanesine bir kere kaydedilip disk alanından yer kazanılmış
      olur.
İkinci yöntemde kullanılan DSO’lara yine paylaşımlı
      kütüphaneler veya DSO kütüphaneleri adı verilir fakat
      bunların dosyaları geçerli kabule göre filanca.so gibi
      isimlendirilse de genelde keyfi olarak seçilen bir dosya uzantısı
      kullanılarak isimlendirilirler. Bu dosyalar genellikle programa özel bir
      dizinde dururlar ve bu dosyaları kullanacak olan çalıştırılabilir
      programla aralarında özdevimli olarak bağ kurulmamıştır. Bunun yerine,
      çalıştırılabilir program DSO’yu çalışma anında dlopen()
      sayesinde kendi adres uzayına ekler. Çalıştırılabilir program için
      DSO’daki simgeler bu sırada çözümlenmez. Özdevimli olarak devreye
      giren Unix yükleyicisi, (varsa) artakalan simgeleri, çalıştırılabilir
      ihraç edilen simge kümelerini (ve özellikle her yerde hazır ve nazır
      libc.so içindeki tüm simgeleri) kullanarak çözümler. Bu
      yolla DSO, çalıştırılabilir programın simge kümesi bilgilerini sanki
      kendisine baştan durağan olarak ilintilenmiş gibi ulaşabilir.
Son olarak, DSO’nun programlama arayüzünün getirilerinden yararlanmak
      amacıyla çalıştırılabilir program, daha sonra dağıtım tabloları vb.
      yerlerde kullanmak üzere dlsym() üzerinden DSO’daki belli
      simgeleri çözümlemek zorundadır. Başka bir deyişle: Çalıştırılabilir
      program ihtiyaç duyduğu her simgeyi kullanmak için kendisi çözümleme
      yapmak zorundadır. Böyle bir mekanizmanın getirisi, programın isteğe
      bağlı parçalarının gerekli olana kadar yüklenmemesidir (böylece daha az
      bellek alanı kullanılır). Gerektiği zaman programın işlevselliğini
      arttırmak amacıyla bu parçalar devingen olarak programa
      yüklenebilir.
DSO mekanizmasının bu basit gibi görünen işleyişinde zorluk içeren bir adım şudur (başkaları da olabilir): Bir programın işlevselliğini genişletmek için DSO kullanılırken (ikinci yöntem) çalıştırılabilir programdan DSO için simgelerin çözümlenmesi. Zorluğun sebebi, "tersine çözümleme" yapılmasıdır; çalıştırılabilir programın simge kümesindeki DSO simgeleri kütüphane tasarımına aykırı bir şekilde çözümlenir ve bu uygulama tüm platformlarda hazır olarak desteklenmediği gibi standartlaşmış da değildir. Geçer uygulamada çalıştırılabilir programın evrensel simgeleri çoğunlukla yeniden dışa verilmez ve bu bakımdan bir DSO içinde kullanılmaları uygun değildir. Esas sorun, çalıştırılabilir bir programın işlevselliğini çalışma anında genişletmek için DSO kullanımı sırasında ilintileyicinin tüm evrensel simgeleri dışa vermesini zorlamanın bir yolunu bulmaktır.
Paylaşımlı kütüphane yaklaşımı bu bakımdan türünün tek örneğidir, çünkü DSO mekanizması özellikle bunun için tasarlanmıştır, dolayısıyla işletim sisteminin sağladığı hemen hemen tüm kütüphaneler için kullanılabilir.
Yukarıda bahsedilen DSO’ya dayalı özelliklerin getirileri şunlardır:
configure
        seçenekleriyle birleştirilmek yerine apache2.conf içinde
        LoadModule yönergeleri
        sayesinde çalışma anında birleştirilebilmektedir. Bu yolla, örneğin
        tek bir Apache kurulumuyla birbirinden farklı yapılandırmalara sahip
        çok sayıda sunucu çalıştırmak mümkündür. (standart veya SSL sürümü;
        basitleştirilmiş veya devingen sürümü [mod_perl, PHP3], vs.)apxs çifti
        sayesinde Apache httpd kaynak ağacının dışında derleyip modülün yeni
        bir sürümünü bir apxs -i komutunun ardından
        apache2ctl restart yaparak çalışan bir Apache HTTP
        Sunucusunda denemek daha kolay hale getirilmiştir.DSO kullanımının götürüleri ise şunlardır:
ld -lfilanca) DSO mekanizmasını tüm modül türleri için
        kullanamazsınız (örneğin a.out temelli platformlar bu işlevselliği
        ELF temelli platformlar kadar iyi sağlamaz). Başka bir deyişle, DSO
        dosyaları olarak derlenmiş modüllerin kullanabileceği simgeler ya
        Apache httpd temel kodunda vardır ya Apache httpd temel kodunun
        kullandığı C kütüphanesinde (libc) ve diğer durağan ve
        devingen kütüphanelerde vardır ya da konumdan bağımsız kodu içeren
        durağan kütüphane arşivlerinde (libfilanca.a)
        vardır. Diğer modülleri kullanmak için tek şansınız ya Apache httpd
        çekirdeğinin modüle bir atıf içermesini sağlamak ya da modül kodunu
        dlopen() vasıtasıyla yüklemektir.