Apache HTTP Sunucusu Sürüm 2.2
Devingen Paylaşımlı Nesne Desteği
Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir
grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller sunucunun
derlenmesi sırasında doğrudan httpd
programının
içinde derlenebileceği gibi Devingen Paylaşımlı Nesneler (DSO - Dynamic
Shared Object) halinde httpd
programından ayrı
olarak da derlenebilir. 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 sunucuya eklenebilir.
Bu belgede DSO modüllerinin kullanımının yanında teorisine de değinilecektir.
Gerçeklenim
İlgili Modüller | İlgili Yönergeler |
---|---|
Apache modüllerini yüklemek için DSO desteği, Apache ç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. Hemen hemen tüm diğer Apache modülleri kurulum belgesinde de açıklandığı gibi
configure
betiğinin
--enable-modül=shared
seçeneği her modül için ayrı
ayrı belirtilerek birer DSO modülü olarak derlenebilir. Derlenmiş
modüller mod_filanca.so
biçeminde birer DSO ismi alırlar ve
her biri istenirse httpd.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.
Apache 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 modüllerini Apache kaynak ağacından
ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache
derlenirken DSO dosyalarını derlemek için platforma bağımlı
derleyici ve ilintileyici seçenekleri apxs
programının içine konur ve Apache’nin make install
ile
kurulumu sırasında Apache C başlık dosyaları da kurulur. Böylece
kullanıcı Apache 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 modülünü apxs
programını
kullanarak derleyebilir.
Kullanıcı Özeti
Apache 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 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=shared
$ make install - Kaynak dosyası
mod_filanca.c
dosyasında dağıtılan bir üçüncü parti Apache modülünümod_filanca.so
isminde bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:$ ./configure --add-module=modül-türü:/bir/kurulum/yeri/mod_filanca.c \
--enable-filanca=shared
$ make install - Paylaşımlı modülleri sonradan kurmak için Apache şöyle
yapılandırılır:
$ ./configure --enable-so
$ make install - Kaynak dosyası
mod_filanca.c
dosyasında dağıtılan bir üçüncü parti Apache modülümod_filanca.so
isminde bir DSO modülü olarak Apache kaynak ağacının dışındaapxs
kullanarak derlemek ve kurmak için şöyle yapılır:$ cd /bir/kurulum/yeri
$ apxs -c mod_filanca.c
$ apxs -i -a -n filanca mod_filanca.la
Tüm durumlarda derlenen paylaşımlı modülü Apache’nin etkin kılabilmesi
için httpd.conf
dosyasında o modül için bir LoadModule
yönergesi bulunmalıdır.
Artalan Bilgisi
Günümüzün Unix türevlerinde var olan şık 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. Diğer taraftan, bir programın işlevselliğini genişletmek için paylaşımlı nesne kullanımı çoğu program tarafından kullanılan bir şey değildir.
1998 itibariyle, DSO nesneleriyle çalışma anında çalıştırılabilir program işlevselliğini genişleten başlıca birkaç yazılım paketi vardır: Perl 5 (XS mekanizması ve DynaLoader modülü üzerinden), Netscape Sunucusu, vd. 1.3 sürümünden itibaren Apache de bu gruba katıldı. Çünkü Apache, modül kavramını zaten program işlevselliğini genişletmek için kullanıyordu ve temel işlevselliğine dış modülleri ilintilemek için dahili olarak dağıtım listesine dayalı bir yaklaşım kullanmaktaydı. Dolayısıyla Apache, modüllerini çalışma anında yüklemek için DSO kullanmaya baştan yazgılıydı.
Getiriler ve Götürüler
Yukarıda bahsedilen DSO’ya dayalı özelliklerin getirileri şunlardır:
- Sunucu paketi çalışma anında daha esnektir çünkü, asıl sunucuyu
oluşturan parçalar derleme sırasında
configure
seçenekleriyle birleştirilmek yerinehttpd.conf
içindeLoadModule
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 güçlendirilmiş sürümü [mod_perl, PHP3], vs.) - Sunucu paketi kurulumdan sonra bile üçüncü parti modüllerle kolayca genişletilebilir. Bu özellikle, bir Apache temel paketinin yanında PHP3, mod_perl, mod_fastcgi gibi ek paketler oluşturan paket dağıtıcılarına büyük yarar sağlar.
- Yeni Apache modülleri için daha kolay prototip geliştirilebilir:
Modül kaynak kodunu DSO/
apxs
çifti sayesinde Apache kaynak ağacının dışında derleyip modülün yeni bir sürümünü birapxs -i
komutunun ardındanapachectl restart
yaparak çalışan bir Apache sunucusunda denemek daha kolay hale getirilmiştir.
DSO kullanımının götürüleri ise şunlardır:
- Her platformda hazır olarak desteklenmeme: Tüm işletim sistemleri bir programa devingen olarak kod yükleme becerisine sahip olmadığından DSO mekanizması her platformda kullanılamaz.
- İlk yüklemede %20 yavaşlama: Unix yükleyicisi simgeleri çözümlemek zorunda olduğundan sunucu ilk başlatılırken yaklaşık %20 daha yavaş faaliyete geçer.
- Çalışma sırasında % 5 yavaşlama: Konumdan bağımsız kodun (PIC - Position Independent Code) göreli adresleme için karmaşık oyunlara girmesi ve bunun mutlak adresleme kadar hızlı olmaması nedeniyle sunucu bazı platformlarda çalışma anında yaklaşık %5 daha yavaş çalışabilir.
- DSO'nun tüm modüller için uygun olmaması: DSO modülleri bazı
platformlarda diğer DSO temelli kütüphanelerle ilintilenemediğinden
(
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 temel kodunda vardır ya Apache 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 çekirdeğinin modüle bir atıf içermesini sağlamak ya da modül kodunudlopen()
vasıtasıyla yüklemektir.