IIS Nedir: Windows’un Web Sunucusuna Giriş ve Kurulum
Microsoft’un web sunucusu teknolojisi, özellikle kurumsal Windows ortamlarında çalışan sysadminler için kaçınılmaz bir gerçeklik. Yıllarca “IIS mi, Apache mi?” tartışmalarına sahne olan toplantılarda bulundum; ancak şunu söyleyeyim: Eğer altyapınız Windows tabanlıysa, IIS’i iyi tanımak bir tercih değil, zorunluluk. Bu yazıda IIS’in ne olduğunu, nasıl kurulduğunu ve temel yapılandırmasını gerçek dünya perspektifinden ele alacağız.
IIS Nedir?
Internet Information Services (IIS), Microsoft tarafından geliştirilen ve Windows işletim sistemleriyle birlikte gelen web sunucusu yazılımıdır. HTTP, HTTPS, FTP, FTPS, SMTP ve NNTP protokollerini destekler. İlk olarak 1995 yılında Windows NT 3.51 ile hayatımıza giren IIS, bugün itibarıyla kurumsal .NET uygulamalarının, ASP.NET Core servislerinin ve klasik ASP projelerinin en yaygın barındırma platformu olmaya devam ediyor.
Apache veya Nginx ile karşılaştırıldığında IIS, Windows ekosistemiyle olan derin entegrasyonu sayesinde bazı konularda ciddi avantajlar sunar:
- Active Directory entegrasyonu: Kerberos ve NTLM kimlik doğrulama desteği
- Windows Authentication: Kullanıcıları domain hesaplarıyla doğrudan doğrulama
- Application Pool izolasyonu: Her uygulamayı ayrı bir worker process’te çalıştırma
- GUI tabanlı yönetim: IIS Manager arayüzü üzerinden görsel yapılandırma
- ASP.NET native desteği: .NET Framework ve .NET Core uygulamaları için optimize edilmiş ortam
Şu an IIS’in en güncel kararlı sürümü olan IIS 10.0, Windows Server 2016, 2019 ve 2022 ile birlikte geliyor. Windows 10 ve 11’de de kullanılabilir, ancak bu sürümler production için değil, geliştirme ortamları için uygundur.
IIS Mimarisi: Biraz Arka Plan Bilgisi
Kuruluma geçmeden önce IIS’in iç işleyişini anlamak, ilerleyen dönemde karşılaşacağınız sorunları çözmede büyük fark yaratır.
IIS iki temel katmandan oluşur:
Kernel modu (http.sys): Windows çekirdeğinde çalışan bu sürücü, gelen HTTP isteklerini doğrudan yakalar. Port 80 ve 443’ü dinleyen, SSL termination yapabilen bu bileşen sayesinde IIS diğer web sunucularına kıyasla oldukça düşük latency değerleri elde edebiliyor.
Kullanıcı modu (w3svc ve worker process’ler): World Wide Web Publishing Service (W3SVC) ve her Application Pool için ayrı başlatılan w3wp.exe worker process’leri bu katmanda çalışır. Bir uygulama çöktüğünde sadece ilgili pool etkilenir, diğer uygulamalar bundan bağımsız çalışmaya devam eder. Bu izolasyon modeli, production ortamlarında hayat kurtarır.
Application Pool kavramını iyice özümsemenizi öneririm. Her pool kendi kimliği, kendi bellek alanı ve kendi .NET runtime versiyonuyla çalışır. Bir müşteri projesinde üç farklı ASP.NET versiyonunu aynı sunucuda koşturmamız gerektiğinde bu mimari gerçekten can simidi olmuştu.
Kurulum Öncesi Hazırlık
Kuruluma başlamadan önce birkaç şeyi netleştirmeniz gerekiyor.
Sunucunuzun rolünü belirleyin. Salt web sunucusu mu olacak, yoksa aynı zamanda uygulama sunucusu işlevi de görecek mi? Bu sorunun cevabı hangi IIS özelliklerini aktive edeceğinizi doğrudan etkiler.
Güvenlik duvarı kurallarını planlayın. HTTP için 80, HTTPS için 443 portlarının açık olması gerekir. FTP kullanacaksanız 21 ve pasif mod için ek bir port aralığı belirlemeniz gerekecek.
Servis hesabını düşünün. IIS varsayılan olarak ApplicationPoolIdentity adlı sanal hesapla çalışır. Ancak bazı senaryolarda (örneğin network share erişimi veya veritabanı Windows Authentication) özel bir servis hesabı tanımlamanız gerekebilir.
IIS Kurulumu: Server Manager ile
Windows Server üzerinde IIS kurmanın en temel yolu Server Manager üzerinden yapmak. Ancak ben size hem GUI yolunu hem de PowerShell yolunu göstereceğim; çünkü otomasyon yapmak istediğinizde CLI vazgeçilmez.
Server Manager üzerinden adım adım:
- Server Manager’ı açın
- “Add Roles and Features” seçeneğine tıklayın
- “Role-based or feature-based installation” seçin
- Sunucunuzu seçin
- Server Roles listesinden “Web Server (IIS)” seçeneğini işaretleyin
- Açılan pencerede “Add Features” diyerek bağımlılıkları kabul edin
- Features ekranında .NET Framework versiyonlarını seçin
- Role Services ekranında ihtiyaç duyduğunuz modülleri seçin
- Confirm ekranında “Install” butonuna basın
Kurulum tamamlandıktan sonra http://localhost adresine gittiğinizde IIS’in varsayılan karşılama sayfasını görüyorsanız her şey yolunda demektir.
IIS Kurulumu: PowerShell ile (Önerilen Yöntem)
Özellikle birden fazla sunucu kuracaksanız ya da altyapınızı kod olarak yönetmek istiyorsanız PowerShell şiddetle tavsiye edilir. Tekrarlanabilirlik açısından bunun yerini hiçbir şey tutamaz.
Temel IIS kurulumu:
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
Yaygın kullanılan tüm IIS özelliklerini tek seferde kurmak için:
Install-WindowsFeature -Name Web-Server, Web-Common-Http, Web-Default-Doc, `
Web-Dir-Browsing, Web-Http-Errors, Web-Static-Content, `
Web-Http-Logging, Web-Stat-Compression, Web-Filtering, `
Web-Windows-Auth, Web-Net-Ext45, Web-Asp-Net45, `
Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Mgmt-Console `
-IncludeManagementTools
Kurulumun başarılı olup olmadığını doğrulayın:
Get-WindowsFeature -Name Web-* | Where-Object {$_.InstallState -eq "Installed"} | Select-Object Name, DisplayName
Çıktıda kurulu olan tüm IIS bileşenlerini göreceksiniz. Bu listeyi bir dosyaya kaydederek başka sunucularda aynı yapılandırmayı tekrarlayabilirsiniz.
İlk Web Sitesini Oluşturma
IIS kurulumu tamamlandıktan sonra varsayılan olarak “Default Web Site” adlı bir site zaten aktif olarak gelir. Bu siteyi silmemenizi, ancak production’da kullanmadan önce yapılandırmasını gözden geçirmenizi öneririm. Şimdi sıfırdan yeni bir site oluşturalım.
Önce site içeriği için klasör yapısını hazırlayın:
New-Item -ItemType Directory -Path "C:inetpubsitesmyapp"
New-Item -ItemType Directory -Path "C:inetpubsitesmyapplogs"
# Test amaçlı basit bir index.html oluşturun
Set-Content -Path "C:inetpubsitesmyappindex.html" -Value "<h1>Merhaba IIS!</h1>"
Şimdi PowerShell üzerinden Application Pool ve web sitesini oluşturalım:
# WebAdministration modülünü import et
Import-Module WebAdministration
# Yeni Application Pool oluştur
New-WebAppPool -Name "MyAppPool"
# Pool ayarlarını yapılandır
Set-ItemProperty -Path "IIS:AppPoolsMyAppPool" -Name "managedRuntimeVersion" -Value "v4.0"
Set-ItemProperty -Path "IIS:AppPoolsMyAppPool" -Name "managedPipelineMode" -Value "Integrated"
Set-ItemProperty -Path "IIS:AppPoolsMyAppPool" -Name "startMode" -Value "AlwaysRunning"
# Yeni web sitesi oluştur
New-Website -Name "MyApp" -Port 8080 -PhysicalPath "C:inetpubsitesmyapp" -ApplicationPool "MyAppPool"
# Siteyi başlat
Start-Website -Name "MyApp"
Siteyi doğrulamak için:
# Site durumunu kontrol et
Get-Website -Name "MyApp"
# Tüm siteleri listele
Get-ChildItem IIS:Sites
Tarayıcınızdan http://localhost:8080 adresine gittiğinizde “Merhaba IIS!” yazısını görmeniz gerekiyor. Bu kadar basit.
HTTPS Yapılandırması
Günümüzde HTTP üzerinden servis vermek artık kabul edilemez. Self-signed sertifika veya Let’s Encrypt ile HTTPS kurulumunu inceleyelim.
Geliştirme ortamı için self-signed sertifika oluşturma ve bağlama:
# Self-signed sertifika oluştur
$cert = New-SelfSignedCertificate `
-DnsName "myapp.local", "localhost" `
-CertStoreLocation "cert:LocalMachineMy" `
-NotAfter (Get-Date).AddYears(2) `
-FriendlyName "MyApp Development Certificate"
# Sertifikanın thumbprint'ini al
$thumbprint = $cert.Thumbprint
# HTTPS binding ekle
New-WebBinding -Name "MyApp" -Protocol "https" -Port 443 -HostHeader "myapp.local"
# SSL sertifikasını binding'e bağla
$binding = Get-WebBinding -Name "MyApp" -Protocol "https"
$binding.AddSslCertificate($thumbprint, "MY")
Write-Host "SSL yapılandırması tamamlandı. Thumbprint: $thumbprint"
Production ortamları için Let’s Encrypt kullanmak istiyorsanız win-acme (wacs) aracını tercih edebilirsiniz. Bu araç IIS ile harika entegre olur ve sertifika yenileme işlemini otomatikleştirir.
IIS Logging Yapılandırması
Log yönetimi pek çok sysadmin tarafından ihmal edilen bir konu, ancak bir güvenlik olayı ya da performans sorunu yaşandığında bu loglar altın değerinde olabiliyor.
# Log format ve konumunu yapılandır
Import-Module WebAdministration
# W3C format ile genişletilmiş loglama
Set-WebConfigurationProperty -Filter "system.applicationHost/sites/site[@name='MyApp']/logFile" `
-PSPath "IIS:" `
-Name "logFormat" `
-Value "W3C"
# Log dizinini özelleştir
Set-WebConfigurationProperty -Filter "system.applicationHost/sites/site[@name='MyApp']/logFile" `
-PSPath "IIS:" `
-Name "directory" `
-Value "C:inetpubsitesmyapplogs"
# Loglanacak alanları genişlet (User-Agent ve X-Forwarded-For dahil)
Set-WebConfigurationProperty -Filter "system.applicationHost/sites/site[@name='MyApp']/logFile" `
-PSPath "IIS:" `
-Name "logExtFileFlags" `
-Value "Date,Time,ClientIP,UserName,Method,UriStem,UriQuery,HttpStatus,Win32Status,TimeTaken,UserAgent,Referer,HttpSubStatus"
Log dosyaları varsayılan olarak C:inetpublogsLogFiles altında tutulur. Sunucu disk alanını yememesi için log rotation politikası mutlaka belirlenmeli. IIS bunu günlük, haftalık veya boyut bazlı olarak yapabilir.
Web.config: IIS’in Yapılandırma Merkezi
IIS’de yapılandırmanın büyük bölümü web.config dosyası üzerinden yönetilir. Bu XML tabanlı dosya, hem IIS’in davranışını hem de ASP.NET uygulamasının ayarlarını kontrol eder. Birkaç kritik örnek:
HTTP’den HTTPS’e yönlendirme için:
# web.config içine URL Rewrite kuralı ekle (appcmd ile)
%windir%system32inetsrvappcmd.exe set config "MyApp" `
/section:system.webServer/rewrite/rules `
/+"[name='HTTP to HTTPS',stopProcessing='true']" `
/commit:apphost
Daha pratik olan XML tabanlı web.config yaklaşımı şu şekilde görünür (bu dosyayı doğrudan site kök dizinine koyarsınız):
# web.config dosyasını PowerShell ile oluştur
$webConfig = @"
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HTTP to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="52428800" />
</requestFiltering>
</security>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" path="/404.html" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
"@
Set-Content -Path "C:inetpubsitesmyappweb.config" -Value $webConfig -Encoding UTF8
Application Pool Sağlık Kontrolü ve Yönetimi
Gerçek bir production ortamında Application Pool’ların düzenli olarak izlenmesi gerekir. Zaman zaman pool’lar beklenmedik şekilde durabilir ve bunu fark etmek için bir izleme mekanizmanız olmalı.
# Tüm Application Pool'ların durumunu kontrol et
Import-Module WebAdministration
$pools = Get-ChildItem IIS:AppPools
foreach ($pool in $pools) {
$state = (Get-WebAppPoolState -Name $pool.Name).Value
if ($state -ne "Started") {
Write-Warning "UYARI: $($pool.Name) pool'u $state durumunda!"
# Otomatik yeniden başlatma
Start-WebAppPool -Name $pool.Name
Write-Host "$($pool.Name) pool'u yeniden başlatıldı."
} else {
Write-Host "$($pool.Name): $state" -ForegroundColor Green
}
}
Bu scripti bir Scheduled Task olarak çalıştırırsanız pool’ların durumunu düzenli aralıklarla kontrol edebilirsiniz. Küçük ama hayat kurtaran bir otomasyon.
Yaygın Sorunlar ve Çözümleri
IIS ile çalışırken karşılaşacağınız bazı klasik sorunları ve çözüm yollarını paylaşmadan geçemezdim.
HTTP 500 Internal Server Error: Çoğunlukla uygulama kodundan kaynaklanır. IIS’de “Show Detailed Errors” aktif değilse sadece jenerik bir hata mesajı görürsünüz. Geliştirme ortamında web.config içinde veya ayarını yapın.
HTTP 403 Forbidden: Genellikle NTFS izin sorunudur. Site kök dizinine IIS worker process’inin erişim hakkı olduğundan emin olun:
# IIS_IUSRS grubuna okuma yetkisi ver
icacls "C:inetpubsitesmyapp" /grant "IIS_IUSRS:(OI)(CI)R" /T
HTTP 503 Service Unavailable: Application Pool çökmüştür. Olay görüntüleyicisinde (Event Viewer) Application ve System loglarını kontrol edin. Pool kimliği yanlış yapılandırılmışsa da bu hata alınabilir.
Port çakışması: Başka bir servis aynı portu kullanıyorsa IIS başlamaz. Hangi servisin portu kullandığını bulmak için:
netstat -ano | findstr ":80 "
# PID'i öğrendikten sonra:
tasklist | findstr "<PID>"
Güvenlik Hardening: Temel Adımlar
IIS kurulumunun ardından mutlaka yapmanız gereken birkaç güvenlik adımı var:
- Server header’ı kaldırın: IIS varsayılan olarak response header’larında versiyon bilgisini açıklar. Bunu kapatmak için
removeServerHeader="true"ayarını yapın - Directory browsing’i devre dışı bırakın: Eğer açıksa site ziyaretçileri dosya listelerinizi görebilir
- Request filtering: Maksimum URL uzunluğu, maksimum header boyutu ve izin verilen HTTP metodlarını sınırlandırın
- Gereksiz modülleri kaldırın: Kullanmadığınız her IIS modülü potansiyel bir saldırı yüzeyidir; WebDAV’ı kullanmıyorsanız kaldırın
- Application Pool kimliği: Mümkünse her uygulama için ayrı düşük yetkili bir servis hesabı kullanın
Sonuç
IIS, doğru anlaşıldığında ve doğru yapılandırıldığında son derece sağlam ve yetenekli bir web sunucusu platformudur. Windows ortamlarında .NET uygulamaları barındırmak için neredeyse rakipsiz bir seçenek olarak kalmaya devam ediyor.
Bu yazıda temel kurulum ve yapılandırmanın üzerinden geçtik. Ancak IIS’in derinlikleri burada bitmiyor: URL Rewrite Module, ARR (Application Request Routing) ile reverse proxy yapılandırması, WebSockets desteği, HTTP/2 optimizasyonu, Centralized Certificate Store gibi konular ayrı başlıkları hak ediyor.
Bir sonraki yazıda IIS üzerinde reverse proxy kurulumunu ve birden fazla uygulamayı tek bir sunucuda nasıl barındırabileceğinizi ele alacağız. O zamana kadar bu kurulumu test ortamınızda denemenizi ve özellikle PowerShell tabanlı yönetim alışkanlığı kazanmanızı şiddetle tavsiye ederim. Çünkü elle yapılan her şeyin bir gün otomasyona ihtiyacı olduğunu, genellikle en kritik anda anlıyoruz.
