
Windows Server 2019 IIS Kurulumu: Site, Application Pool, SSL ve URL Rewrite
Windows Server 2019 IIS kurulumu, web sitesi oluşturma, Application Pool yapılandırması, SSL kurulumu ve performans optimizasyonu.
Windows Server 2019 IIS Kurulumu: Site, Application Pool, SSL ve URL Rewrite
Windows VDS aldınız, RDP ile bağlandınız, karşınızda taze bir Windows Server 2019 ya da 2022. ASP.NET projenizi yayına almak için IIS kuracaksınız ama "Server Manager mı, PowerShell mi", "Application Pool ne işe yarıyor", "Let's Encrypt sertifikasını IIS'e nasıl bağlarım" sorular kafanızda dönüyor. Bu rehber sıfırdan IIS rolünü kurmaktan üretime hazır bir HTTPS site açmaya kadar uçtan uca anlatım.
Önce dürüst bir uyarı: .NET ya da klasik ASP çalıştırmıyorsanız IIS'e mahkum değilsiniz. Aynı Windows Server'da Nginx (Windows binary) ya da Apache da çalışır. Statik site, Node.js, Python (WSGI), PHP için IIS Linux'taki Nginx kadar hafif değildir; bellek ayak izi fazla. Ama .NET (Framework / Core), Active Directory, Windows Authentication, MS SQL backend varsa IIS doğal seçim.
IIS Ne Zaman Mantıklı, Ne Zaman Değil
| Senaryo | Önerilen | Neden |
|---|---|---|
| ASP.NET Framework / classic ASP | IIS | Tek native seçenek |
| ASP.NET Core | IIS reverse proxy / Kestrel | IIS in-process hızlı |
| MS SQL + Windows Auth | IIS | AD native |
| WordPress / Laravel / Node.js | Nginx for Windows | Bellek düşük, ekosistem zengin |
| Statik site | Nginx | IIS overkill |
| Exchange / SharePoint | IIS | Front-end zorunlu |
Buyukweb tarafında: Windows VDS, KVM tabanlı sanal sunucu olarak Administrator yetkisiyle teslim ediliyor; Windows Server 2019 ya da 2022 kurulu geliyor. IIS rolünü siz açıyorsunuz; isterseniz Nginx for Windows da kurabilirsiniz. Plesk Windows panel + IIS hazır gelen paket için /windows-web-hosting ve /windows-reseller-hosting.
Windows Server 2019 mu, 2022 mi?
| Özellik | Server 2019 | Server 2022 |
|---|---|---|
| IIS sürümü | 10.0.17763 | 10.0.20348 |
| HTTP/3 (QUIC) | Yok | Native (HTTP.sys ile) |
| TLS 1.3 | Var (manuel açma gerekir) | Native, varsayılan açık |
| Mainstream support sonu | Ocak 2024 (geçti) | Ekim 2026 |
| Extended support sonu | Ocak 2029 | Ekim 2031 |
| Lisans gereksinimi | Aynı (Datacenter / Standard) | Aynı |
Pratik öneri: Sıfırdan kurulum için Windows Server 2022; HTTP/3 native gelir, TLS 1.3 ek ayar istemez. Mevcut 2019 kurulumu yenilemek için aceleniz yok (extended support 2029'a kadar). Bu yazıdaki komutlar her iki sürümde aynı çalışır; tek pratik fark HTTP/3 desteği.
IIS Rolünü Kurmak: Server Manager veya PowerShell
İki yöntem aynı sonucu verir. Görsel adım adım için Server Manager, scripte alıp tekrar kullanmak için PowerShell.
PowerShell ile Tek Komutta Kurulum
# IIS temel rolü + Management Console
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
# ASP.NET 4.8 + ISAPI (legacy .NET Framework siteleri)
Install-WindowsFeature -Name Web-Asp-Net45,Web-Net-Ext45,Web-ISAPI-Ext,Web-ISAPI-Filter
# URL Authorization + Authentication
Install-WindowsFeature -Name Web-Url-Auth,Web-Windows-Auth,Web-Basic-Auth
# Compression + WebSockets + Logging
Install-WindowsFeature -Name Web-Stat-Compression,Web-Dyn-Compression,Web-WebSockets,Web-Http-Logging
# Kontrol
Get-WindowsFeature -Name Web-* | Where-Object Installed -EQ $true
Komutu çalıştırdıktan sonra http://localhost veya sunucunuzun public IP'sine tarayıcıdan girdiğinizde "Welcome to IIS" sayfasını görürseniz kurulum tamam.
Server Manager ile Görsel Kurulum
Sunucuya RDP ile bağlanın → Server Manager → Manage → Add Roles and Features → "Server Roles" adımında Web Server (IIS) kutusunu işaretleyin. Başlangıç için Common HTTP Features + ASP.NET 4.8 + URL Authorization + Logging + Compression yeterli; tüm alt seçenekleri tek tek açmaya gerek yok.
IIS Manager'a İlk Bakış
inetmgr komutunu Run'a yazıp IIS Manager'ı açtığınızda sol panelde üç ana node göreceksiniz: Sites (Default Web Site hazır gelir), Application Pools (her site bir pool'da izole çalışır — biri çökerse diğeri etkilenmez), Server-level features (Authentication, Compression, MIME Types). Önce Default Web Site'ı silin (sağ tık → Remove); üretimde default sayfa güvenlik bilgisi sızdırır.
Yeni Site Oluşturma: Host Header, IP/Port
PowerShell ile temiz bir site açalım:
# Site dizini + Application Pool
New-Item -Path "C:\inetpub\siteler\ornek.com\public" -ItemType Directory -Force
New-WebAppPool -Name "ornek-pool"
Set-ItemProperty "IIS:\AppPools\ornek-pool" -Name "managedRuntimeVersion" -Value "v4.0"
Set-ItemProperty "IIS:\AppPools\ornek-pool" -Name "processModel.identityType" -Value "ApplicationPoolIdentity"
# Site oluştur
New-Website -Name "ornek.com" `
-PhysicalPath "C:\inetpub\siteler\ornek.com\public" `
-ApplicationPool "ornek-pool" `
-HostHeader "ornek.com" -Port 80
# www aliası için ek binding
New-WebBinding -Name "ornek.com" -Protocol "http" -Port 80 -HostHeader "www.ornek.com"
IIS Manager'da: Sites → sağ tık → Add Website → Site name, Physical path, Application pool, Binding (Type: http, IP: All Unassigned, Port: 80, Host name). DNS A kaydını sunucuya yönlendirdikten sonra tarayıcıda site açılır. SNI sayesinde aynı IP üzerinde birden fazla HTTPS sitesi farklı sertifikalarla çalışabilir; eski 2008 dönemindeki "her HTTPS sitesine ayrı IP" kısıtı 2019/2022'de yok.
Application Pool Detayları: Identity, Recycling, .NET Sürümü
Her pool ayrı bir w3wp.exe process'i olarak çalışır. Application Pools → pool seç → Advanced Settings ile ayarlanır.
| Ayar | Açıklama | Önerilen |
|---|---|---|
| .NET CLR Version | v4.0 (Framework 4.x) / v2.0 (legacy 3.5) / No Managed Code (.NET Core, statik) | Stack'e göre |
| Managed Pipeline Mode | Integrated (modern) / Classic (legacy IIS 6) | Integrated |
| Identity | ApplicationPoolIdentity / NetworkService / Custom | ApplicationPoolIdentity |
| Idle Time-out | İstek olmadığında kapalı kalma (dk) | 20 (default) |
| Regular Time Interval | Otomatik recycle (dk) | 1740 default ya da 0 + schedule |
| Rapid-Fail Protection | 5 dk'da 5 hata → pool'u durdur | Açık kalsın |
.NET Core / .NET 5+ özel durumu: ASP.NET Core uygulamaları "No Managed Code" pool'unda çalışır; çünkü .NET Core kendi runtime'ını taşır, IIS sadece reverse proxy gibi davranır. Yanlışlıkla v4.0 pool'una koyarsanız uygulama açılmaz.
ApplicationPoolIdentity: IIS her pool için IIS AppPool\PoolAdı sanal hesabı oluşturur. Site klasörüne yazma yetkisi vermek için NTFS izinleri şöyle:
icacls "C:\inetpub\siteler\ornek.com\public" /grant "IIS AppPool\ornek-pool:(OI)(CI)(M)"
SSL Sertifikası: win-acme ile Let's Encrypt Otomatik
Üretim sitesi HTTPS olmak zorunda. Ücretli sertifika alabilirsiniz, ama Let's Encrypt 90 günde bir yenilenen ücretsiz sertifikalarıyla çoğu sitede yeterli. Windows tarafında win-acme (önceki adı letsencrypt-win-simple) bunu otomatize eden en yaygın araç.
# Win-acme indir + extract
Invoke-WebRequest -Uri "https://github.com/win-acme/win-acme/releases/latest/download/win-acme.v2.x.x.x64.pluggable.zip" -OutFile "C:\Tools\wacs.zip"
Expand-Archive -Path "C:\Tools\wacs.zip" -DestinationPath "C:\Tools\wacs"
# İnteraktif sihirbaz
cd "C:\Tools\wacs"; .\wacs.exe
# Manuel hızlı yol
.\wacs.exe --target iis --siteid 1 --installation iis --emailaddress [email protected] --accepttos
Sihirbaz site, doğrulama yöntemi (HTTP-01 .well-known/acme-challenge) ve email sorar. Bittiğinde IIS bindingi otomatik HTTPS olarak eklenir (port 443, SNI açık) ve Scheduled Task oluşturulur — 60 günde bir sertifikayı yeniler, manuel müdahale gerekmez.
Ücretli PFX sertifikası alındıysa manuel import:
$pwd = ConvertTo-SecureString -String "sertifika-sifresi" -AsPlainText -Force
Import-PfxCertificate -FilePath "C:\cert\ornek.pfx" `
-CertStoreLocation "Cert:\LocalMachine\My" -Password $pwd
New-WebBinding -Name "ornek.com" -Protocol "https" -Port 443 -HostHeader "ornek.com" -SslFlags 1
SslFlags 1 SNI'yi açar; aynı IP üzerinde birden fazla HTTPS sitesi için zorunlu.
URL Rewrite: HTTP→HTTPS, www Yönlendirme, Server Header Gizleme
URL Rewrite, IIS'in Apache mod_rewrite veya Nginx rewrite direktifi karşılığı. Microsoft'un resmi modülü olarak ayrı kurulur (iis.net/downloads/microsoft/url-rewrite). Kurulum sonrası web.config dosyasına kural yazılır:
<?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" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
<rule name="WWW to non-WWW" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.+)$" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}" redirectType="Permanent" />
</rule>
</rules>
<outboundRules>
<rule name="Remove Server Header" preCondition="ResponseIsHtml">
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
</rewrite>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="X-Content-Type-Options" value="nosniff" />
<add name="Referrer-Policy" value="strict-origin-when-cross-origin" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
web.config Apache'deki .htaccess ile aynı mantıkla çalışır — dosyayı site köküne koyduğunuzda kurallar anında geçerli olur, IIS restart gerekmez.
Application Request Routing (ARR): Reverse Proxy
ARR, IIS'i Nginx gibi reverse proxy olarak kullanmanızı sağlar. Senaryo: aynı Windows sunucuda Node.js (port 3000) ve Python (port 5000) çalışıyor; ikisini 443 portundan tek HTTPS endpoint üzerinden yayınlamak istiyorsunuz. ARR + URL Rewrite kurulu olmalı; IIS Manager → server → Application Request Routing Cache → Server Proxy Settings → "Enable proxy" tikle.
<rule name="Reverse Proxy to Node" stopProcessing="true">
<match url="^api/(.*)" />
<action type="Rewrite" url="http://localhost:3000/{R:1}" />
</rule>
Yük dengeleme (load balancing) de mümkün — birden fazla backend, round-robin veya weighted dağıtım. IIS dış yüze HTTPS, SSL termination, URL Rewrite, compression sağlar; arka plan Kestrel veya Node.js plain HTTP.
Performans: Compression, Output Caching, Kernel-Mode Cache
Dört levye var: Static Compression (CSS/JS/HTML gzip, dahili açık), Dynamic Compression (ASP.NET çıktısı her istek için sıkıştırılır), Output Caching (tam sayfa cache, URL pattern'leri X saniye), Kernel-mode cache (HTTP.sys) (çekirdek seviyesinde, user-mode IIS'i bypass eder; authenticated request'te kapanır).
Set-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" `
-Filter "system.webServer/httpCompression" `
-Name "doStaticCompression" -Value $true
Set-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" `
-Filter "system.webServer/httpCompression" `
-Name "doDynamicCompression" -Value $true
<!-- web.config — output cache + kernel cache 60 saniye -->
<system.webServer>
<caching enabled="true" enableKernelCache="true">
<profiles>
<add extension=".aspx" policy="CacheForTimePeriod" kernelCachePolicy="CacheForTimePeriod" duration="00:01:00" />
</profiles>
</caching>
</system.webServer>
Logging ve Failed Request Tracing
IIS varsayılan olarak W3C formatında C:\inetpub\logs\LogFiles\W3SVC1\ altına log yazar. Default field set yetersizdir; en azından cs(Referer), sc-bytes, time-taken, cs(User-Agent) field'larını ekleyin (IIS Manager → site → Logging → Select Fields). Log analizi için Log Parser Studio (Microsoft, ücretsiz) SQL syntax'ıyla IIS loglarına sorgu atar.
Failed Request Tracing (FREB): "500 hatası alıyorum ama nedenini bulamıyorum" sorununun çözümü. Site → Failed Request Tracing Rules → Add → status code 500 veya time-taken > 30s tetikleyici. Hata tekrar oluştuğunda C:\inetpub\logs\FailedReqLogFiles\ altında XML trace dosyası belirir; tarayıcıda açıldığında hangi modülde hata olduğunu gösterir.
Güvenlik: Request Filtering, IP Restrictions, TLS Sıkılaştırma
Üretime almadan önce atlamayın:
- Request Filtering: TRACE, OPTIONS, DELETE gibi kullanılmayan HTTP metodlarını kapat; maksimum URL uzunluğu ve content length sınırla.
- IP and Domain Restrictions: Admin paneline yalnızca belirli IP'lerden erişim aç (allow list mantığı).
- TLS 1.0 / 1.1 kapat: Registry'de
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\ProtocolsaltındaTLS 1.0\ServerveTLS 1.1\ServeranahtarlarınaEnabled = 0. IIS Crypto (Nartac, ücretsiz) "Best Practices" preset'i tek tıkla uygular. - Server header gizle: Yukarıdaki URL Rewrite outbound rule ile
Microsoft-IIS/10.0header'ı temizleyin. - WebDAV kapalı tutun: Çoğu site ihtiyaç duymaz; açık bırakmak
PROPFIND,MKCOLile saldırı yüzeyi açar. - Cloudflare / WAF: IIS önüne Cloudflare proxy koymak DDoS ve bot trafiğini sunucuya gelmeden filtreler.
X-Forwarded-Forheader'ı gerçek istemci IP'sini taşır.
Buyukweb Windows Hizmetleri: Hangi Paket Hangi Senaryo?
| Paket | Yönetim | IIS | Uygun Senaryo |
|---|---|---|---|
| Windows Web Hosting | Plesk Windows panel hazır | Hazır, panelden | ASP.NET / classic ASP, panel istiyorsanız |
| Windows Reseller Hosting | Plesk reseller | Hazır, müşteri başına | Web ajansları, çoklu müşteri |
| Windows VDS | Unmanaged, Administrator | Siz açıyorsunuz | Özel konfig, .NET Core, ARR reverse proxy |
| Fiziksel Dedicated | Tam donanım | Kendi lisansınızla | Yüksek trafik, izole donanım |
Windows VDS başlangıç paketi ₺250/ay; KVM tabanlı sanal sunucu, anında teslim, 7/24 Türkçe destek. Bursa Tier 3 veri merkezi, 17 yıllık altyapı tecrübesi.
Sıkça Sorulan Sorular
IIS mi Nginx mi — hangisi daha hızlı?
Ham statik dosya ve düşük bellek için Nginx for Windows IIS'ten hızlı. Ancak ASP.NET, Windows Auth, AD, MS SQL senaryolarında IIS native ve daha az sürtünmeli. .NET Core uygulamaları Kestrel ile çalışır; IIS sadece reverse proxy görevi görür — bu durumda Nginx de aynı işi yapar.
Application Pool çökerse otomatik nasıl restart edilir?
Rapid-Fail Protection varsayılan açık: 5 dk'da 5 hata → pool durdurulur. Restart için IIS Manager → pool → Recycle, ya da PowerShell Restart-WebAppPool. Auto-Start için "Start Mode = AlwaysRunning" + site "preloadEnabled = true" ekleyin; pool uyumaz, ilk istek hızlı cevap verir.
win-acme nedir, manuel sertifika yenileme yapacak mıyım?
win-acme, ACME protokolü ile Let's Encrypt'ten ücretsiz sertifika alıp IIS bindingini otomatik güncelleyen komut satırı aracı. İlk kurulumda sihirbaz çalıştırırsınız; oluşturulan Scheduled Task 60 günde bir sertifikayı yeniler ve bindingi günceller — manuel müdahale gerekmez.
Failed Request Tracing üretimde sürekli açık tutulmalı mı?
Hayır. Her trace XML diske yazılır; yoğun trafikte disk doldurur ve performansı düşürür. Sorun anında geçici açıp tekrar kapatın; ya da sadece spesifik status code/path tetikleyicisine bağlayın.
.NET Core uygulaması IIS'te neden açılmıyor?
En sık sebep: Application Pool yanlış ayarlı. .NET Core uygulamaları için pool'un .NET CLR Version değeri "No Managed Code" olmalı. v4.0 olursa IIS uygulamayı .NET Framework gibi açmaya çalışır, hata verir. Ayrıca ASP.NET Core Hosting Bundle (Microsoft'tan ayrı indirilir) sunucuda kurulu olmalı — AspNetCoreModuleV2 modülünü IIS'e o ekler.
Plesk olmadan IIS yönetimi ne kadar zor?
Tamamen mümkün; bu yazıdaki PowerShell + IIS Manager kombinasyonu yeterli. Plesk size "tek tıkla site oluştur, SSL yenile, FTP kullanıcı ekle" paneli verir. Tek site yönetiyorsanız Plesk'siz idare edilir; 5+ site veya çoklu müşteri yönetiyorsanız Plesk Windows panelli paket (/windows-web-hosting) zaman tasarrufu sağlar.
IIS'te HTTP/2 ve HTTP/3 nasıl açılır?
HTTP/2 Windows Server 2016'dan beri TLS bindingi olan sitelerde otomatik açık (DevTools Network'te h2 görmeli). HTTP/3 (QUIC) Windows Server 2022 ile native; 2019'da yok. 2022'de açmak için HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters altına EnableHttp3 = 1 ve EnableAltSvc = 1 ekleyip reboot.
IIS için kaç RAM yeterli?
Her Application Pool boştayken 30-50 MB RAM tüketir; aktif ASP.NET sitesi yükle 200-500 MB. 10 küçük site için 4 GB RAM yeterli; orta ölçekli ASP.NET kurumsal siteler için 8 GB minimum, 16 GB güvenli. Buyukweb Windows VDS 2 GB RAM'den başlar.
IIS, Microsoft ekosistemine bağlı projelerde olgun ve güvenilir. ASP.NET, AD, MS SQL stack'i için doğal seçim. PHP/Node.js/Python yığını için Nginx for Windows ya da Linux daha verimli olur. Doğru iş için doğru aracı.
İlgili Büyükweb Hizmetleri
Windows Server üzerinde IIS çalıştırmak için:
- Windows Web Hosting — Plesk Windows panel + IIS hazır, anında teslim
- Windows Reseller Hosting — Plesk reseller, çoklu müşteri
- VDS Sunucu — KVM, Administrator yetkisi, ₺250/ay'dan
- Fiziksel Dedicated — Tam donanım kontrolü
- Linux Hosting — Linux + cPanel + LiteSpeed alternatifi
Sorularınız için 0850 302 60 70 veya iletişim sayfası; Bursa Tier 3 veri merkezi, 17 yıllık altyapı tecrübesi, 7/24 Türkçe destek.
İşletim Sistemleri İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

