Ana Sayfa / Habeler / Apache CLI ile ASP.NET Sayfaları Çalıştırma
.NET ve IIS 6.0 sürümü ile Microsoft web sunucusu pazarında Apache’’nin tahtını tehtid etmeye başladı. Bugün hala bağımsız organizasyonların yaptığı araştırmalar Apache sunucusunun en çok kullanılan sunucu olduğunu göstermekte. Gerek güvenlik nedenleriyle olsun gerekse tüm sistemler üzerinde yüksek performans ile çalışması Apache’’nin başlıca tercih edilme sebeplerinden. Apache esasında sadece basit bir web sunucusu değil Apache Foundation altında bir çok alt projeleri bulunmakta, bunlardan başlıcaları HTTP (web sunucusu projesi), ANT (Java derleme aracı), JAKARTA (Apache üzerinde Java çözümleri sağlamakta), TOMCAT (Jakartanın alt projesi ve Java Server Pages uygulamalarının çalışmasını sağlamakta), vs ... Tüm projeler için www.apache.org sitesini ziyaret edebilirsiniz.
Apache HTTP projesinin altında son zamanlarda CLI adlı yeni bir alt başlık belirdi. Bu alt proje Microsoft Windows üzerinde çalıştırılan Apache web sunucularında Microsoft’’un .NET CLR özelliği kullanılarak ASP.NET uygulamaları çalıştırmanızı sağlamakta. Bunu ufak bir aracı modül gerçekleştirmekte ( mod_aspdotnet ). Açık kodlu olan bu modül Apache.Web kütüphanesi içerisinde System.Web.Host ve System.Web.Request arayüzlerini kullanarak Apache web sunucusu için CLR ASP.NET motoruna erişim kapısı açmaktadır. Bu anlamda ASP.NET ’’in IIS üzerinde size fonksiyonalite olarak sağladığı tüm özellikleri Apache üzerinden uygulama esnasında temin edebilmektesiniz. Fakat geliştirme sürecinde hata ayıklama husunda sadece size web arayüzü sağlamakta buda zaten ASP.NET motorunun bir özelliği. Proje demin de bahsettiğim gibi henüz yeni ve Visual Studio ile hali hazır bir entegrasyonu bulunmamakta.
Performans konusunda bir çok kişi tereddütlü fakat direkt olarak mod_aspdotnet ASP.NET motoruna erişmek için bir arayüz sağladığından ASP.NET motorunun performansı ile doğru orantılı çalışmakta. Keza ASP.NET sayfalarının ilk çalıştıklarında derlenmesi ve sonra hafızadan çalıştırılması gibi özellikler zaten ASP.NET motoru tarafından sunulmakta bu durumda IIS ile Apache arasında ASP.NET projelerinin koşturulması konusunda büyük bir ayrım ortaya çıkmıyor. Aynı zaman da IIS’’in sunduğu uygulama havuzları optimizasyonunu Apache tarafında da gerçekleştirmek mümükün. Şuan için aspdotnet modülünün sadece .NET Framework 1.1 desteği bulunmakta fakat Microsoft’’un 2.0’’ı sürmesi ile beraber .NET Framework 2.0 desteği de eklenecek.
Bir çok kişinin aklında "Peki ya Mono projesi?" sorusu gelmekte. mod_aspdotnet’’in amacı sadece Microsoft Windows platformu üzerinde .NET Framework kaynaklarına Apache üzerinden ulaşabileceğimiz bir arayüz sağlamak. Bu anlamda .NET Framework’’un platform bağımsız implementasyonu olan Mono projesi ile çakıştığı bir durum bulunmamakta.
http://httpd.apache.org/cli/ Adresinden güncel kurulum dosyasını edinebilirsiniz. Bu noktada şunu belirtmekte fayda görüyorum asp_dotnet modülü Apache 2.0 handler spesifikasyonlarına göre geliştirildiğinden 2.0 öncesi sürümlerinde çalşmamaktadır. Kurulum esnasında Apache’’nin çalıştığı klasörünü göstermeniz yeterli. Ardından httpd.conf konfigrasyon dosyasında Modüller bölümünde aşağıdaki değişiklikleri yapmanız gerekmekte.
AspNetMount / "C:/Apache/Apache2/htdocs" AliasMatch /aspnet_client/system_web/(\d+)_(\d+)_(\d+)_(\d+)/(.*) "C:/Windows/Microsoft.NET/Framework/v$1.$2.$3/ASP.NETClientFiles/$4"
LoadModule komutu Apache için genel bir komuttur ve aspdotnet_module modülünün dinamik olarak yüklenmesini sağlar.
AddHandler komutu Apache için genel bir komuttur aspx, asax, vs .. gibi dosya uzantılarının hangi modül tarafından ele alınacağını tanımlar.
AspNetMount komutu aspdotnet_module modülüne özel bir komuttur ve bu modül sağlıklı yüklenmedikçe bu komut geçerli olmaz dolayısı ile çalıştırma zamanında hata verir. Bu komutun amacı hangi sanal dizinde fiziksel olarak hangi klasörde aspdotnet_module ’’ün aktif olacağını belirtmektedir. Yukardaki tanım kök dizininden başlayarak tüm klasörlerde aspdotnet_module ’’ünün çalışabileceğini belirtmektedir.
Eğer her klasörde index.aspx veya default.aspx dosyasının tanımlı çalışmasını istiyorsanız DirectoryIndex komutuna aşağıdaki gibi ekleme yapınız.
DirectoryIndex index.php index.html index.html.var index.aspx default.aspx
aspdotnet_module’’ün sağlıklı çalışmasını kontrol etmek için basit bir aspx dosyası deneyebilirsiniz. Eğer hata ile karşılaşırsanız lütfen logs klasörü altındaki error.log’’u kontrol ediniz. En çok karşılaşılan Internal Server Error hatası için error.log’’da aşağıdaki gibi bir uyarı göreceksiniz.
[Sat Jun 04 10:19:58 2005] [error] [client 127.0.0.1] mod_aspdotnet: Forbidden, Options ExecCGI is not set for: C:/Apache/Apache2/htdocs/test.aspx
Hatanın da belirttiği gibi aspdotnet modülünü çalıştıracağımız klasörlere ExecCGI (CGI çalıştırma) izni vermemiz gerekmekte. Zaten yukarda da anlattığım gibi bu modül bize bir arayüz sağlamakta bu şu anlama geliyor Apache uygulamanın güvenliğini denetleyemiyor; çalışma zamanında sağlanacak güvenlik Microsoft Windows tarafında ASP.NET motoruna ve işletim sistemine ait olduğundan, aspdotnet modülü sadece girdileri ASP.NET motoruna iletiyor ve çıktıları kullanıcıya geri iletiryor buda bu modülün CGI özelliği taşıdığını gösteriyor. Bu neden den aspdotnet modülü çalıştıracağımız klasörlere Apache konfigrasyonu tarafında ExecCGI izni vermemiz gerekiyor. Bunuda aşağıdaki şekilde gerçekleştirebiliriz.
PS: Aynı anda IIS ve Apache sunucularını çalıştırmanız ancak üzerinde çalıştıkları port değişimi ile mümkün olmaktadır. Normalde istemci talepleri HTTP aracılığı ile 80 port ’’dan ele alınmaktadır bu durumda iki sunucu da 80 portu dinlemek istediğinden işletim sistemi buna izin vermeyecektir bu yüzden servis sıralamasından önce çalışan sunucu port’’u alacak diğer sunucu hata verip kapanacaktır. Bunu IIS’’de EventLog’’dan Apache’’de error.log dosyasından takip edebilirsiniz. Fakat Apache Konfigrasyon dosyası olan httpd.conf dosyasında Listen komutu için geçerli portu 8080 belirterek üzerinde çalıştığı portu değiştirebilir ve Apache sunucusuna http://localhost:8080 ’’den ulaşabilirsiniz.Aynı şekilde IIS sunucusu tarafında da yönetim panelinden çalıştığı portu değiştirmek mümkündür.
IIS’’i durdurmak için komut satırına: net stop iisadmin yazabilirsiniz.
Apache’’i başlatmak için komut satırına: net start apache2 yazabilirsiniz.