הגדרת IIS של Windows Server עבור יישומי אינטרנט
הערה: כאשר שלושה יישומי .NET תלויים על DefaultAppPool יחיד, קריסה של אחד מפילה את כולם. זהו מצב טיפוסי שאנו נתקלים בו בכל פרויקט שני. קל לתקן זאת—בידוד באמצעות pools נפרדים—אך מעטים מגדירים מגבלות זיכרון, מיחזור (recycling), וזהות (identity) לפני שהשרת נופל תחת עומס. במשך למעלה מ-7 שנים של הגדרת IIS לפרויקטים ארגוניים, פיתחנו גישה המבטיחה יציבות תחת עומסים של עד 10k RPS. הצוות שלנו ביצע למעלה מ-50 פרויקטים הכוללים הגירה ואופטימיזציה של IIS, כולל מערכות בעומס גבוה למגזר הפיננסי. Internet Information Services (IIS) הוא שרת אינטרנט של Microsoft המשמש לאירוח יישומי ASP.NET.
Application Pools: בידוד וניהול משאבים
המושג המרכזי ב-IIS שלעיתים קרובות מתעלמים ממנו בהגדרה מהירה הוא שכל יישום צריך לרוץ ב-application pool משלו. אם pool אחד קורס או נתקע—רק יישום אחד נופל, לא כל ה-IIS. אם שלושה אתרים רצים ב-DefaultAppPool, קריסה של אחד מפילה את כל השלושה. לפי הנתונים שלנו, בידוד pools מקטין את זמן ההתאוששות מ-30 דקות ל-2-3 דקות—זהו שיפור של פי 10–15—וב-80% ממקרי דליפות הזיכרון, מגבלת 512 MB מונעת קריסה. שימוש ב-pools נפרדים מפחית את ההסתברות להשבתה מלאה ב-90%. לפי המלצות Microsoft, בידוד pools הוא שיטה מומלצת לסביבות ייצור.
# Создание пула для .NET 8 приложения (Integrated Pipeline)
New-WebAppPool -Name "MyApp-Pool"
Set-ItemProperty "IIS:\AppPools\MyApp-Pool" `
-Name "managedRuntimeVersion" -Value "" # Пустая строка = No Managed Code для .NET Core/5+
Set-ItemProperty "IIS:\AppPools\MyApp-Pool" `
-Name "enable32BitAppOnWin64" -Value $false
Set-ItemProperty "IIS:\AppPools\MyApp-Pool" `
-Name "processModel.identityType" -Value "SpecificUser"
Set-ItemProperty "IIS:\AppPools\MyApp-Pool" `
-Name "processModel.userName" -Value "CORP\svc-myapp"
Set-ItemProperty "IIS:\AppPools\MyApp-Pool" `
-Name "processModel.password" -Value "SecurePass123!"
# Лимиты памяти — предотвращает утечки памяти от роста одного пула
Set-ItemProperty "IIS:\AppPools\MyApp-Pool" `
-Name "recycling.periodicRestart.memory" -Value 512000 # 512 MB
עבור יישומי ASP.NET Core, סוג ה-# Создание пула для .NET 8 приложения (Integrated Pipeline) New-WebAppPool -Name "MyApp-Pool" Set-ItemProperty "IIS:\AppPools\MyApp-Pool" ` -Name "managedRuntimeVersion" -Value "" # Пустая строка = No Managed Code для .NET Core/5+ Set-ItemProperty "IIS:\AppPools\MyApp-Pool" ` -Name "enable32BitAppOnWin64" -Value $false Set-ItemProperty "IIS:\AppPools\MyApp-Pool" ` -Name "processModel.identityType" -Value "SpecificUser" Set-ItemProperty "IIS:\AppPools\MyApp-Pool" ` -Name "processModel.userName" -Value "CORP\svc-myapp" Set-ItemProperty "IIS:\AppPools\MyApp-Pool" ` -Name "processModel.password" -Value "SecurePass123!" # Лимиты памяти — предотвращает утечки памяти от роста одного пула Set-ItemProperty "IIS:\AppPools\MyApp-Pool" ` -Name "recycling.periodicRestart.memory" -Value 512000 # 512 MB הוא חובה—היישום מנהל את ה-runtime בעצמו באמצעות AspNetCoreModuleV2.
כיצד לבודד יישומים ב-IIS כראוי?
אנו ממליצים להקצות pool נפרד לכל יישום עם זהות ייחודית (חשבון שירות). זה לא רק משפר את האבטחה (RBAC באמצעות NTFS) אלא גם מפשט את הביקורת—הלוגים של כל pool נשלחים ליומן נפרד. כאשר pool אחד קורס, השאר ממשיכים לעבוד. בנוסף, אנו מגדירים מגבלות RAM ו-CPU באמצעות managedRuntimeVersion = "" או PowerShell כדי למנוע מיישום אחד לצרוך את כל המשאבים. בפרויקט אחד, צמצמנו את זמן ההשבתה מ-30 דקות ל-20 שניות—שיפור של פי 90. כתוצאה מכך, הלקוח חסך כ-40% בעלויות תחזוקת התשתית עקב פחות תקלות. כלומר, החיסכון הסתכם בכ-$800 לחודש עבור אותו לקוח.
יצירת אתרים ו-Bindings
# Создание сайта
New-Website -Name "MyApp" `
-PhysicalPath "C:\inetpub\myapp" `
-ApplicationPool "MyApp-Pool" `
-Port 80 `
-HostHeader "app.corp.ru"
# HTTPS привязка с сертификатом
$cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object Subject -like "*app.corp.ru*"
New-WebBinding -Name "MyApp" -Protocol "https" -Port 443 -HostHeader "app.corp.ru" `
-SslFlags 1 # SNI mode
# Привязать сертификат к https binding
$binding = Get-WebBinding -Name "MyApp" -Protocol "https"
$binding.AddSslCertificate($cert.Thumbprint, "my")
# Редирект HTTP → HTTPS через URL Rewrite
Add-WebConfigurationProperty -PSPath "IIS:\Sites\MyApp" `
-Filter "system.webServer/rewrite/rules" -Name "." `
-Value @{name="HTTP to HTTPS"; stopProcessing="True"} web.config עבור ASP.NET Core
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\MyApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
<environmentVariable name="ConnectionStrings__Default" value="Server=sql01;Database=MyAppDb;..." />
</environmentVariables>
</aspNetCore>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="52428800" />
<!-- 50 MB -->
</requestFiltering>
</security>
</system.webServer>
</location>
</configuration>appcmd — היישום רץ בתוך תהליך IIS (w3wp.exe), מה שמעניק ביצועים טובים יותר בהשוואה ל-# Создание сайта New-Website -Name "MyApp" ` -PhysicalPath "C:\inetpub\myapp" ` -ApplicationPool "MyApp-Pool" ` -Port 80 ` -HostHeader "app.corp.ru" # HTTPS привязка с сертификатом $cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object Subject -like "*app.corp.ru*" New-WebBinding -Name "MyApp" -Protocol "https" -Port 443 -HostHeader "app.corp.ru" ` -SslFlags 1 # SNI mode # Привязать сертификат к https binding $binding = Get-WebBinding -Name "MyApp" -Protocol "https" $binding.AddSslCertificate($cert.Thumbprint, "my") # Редирект HTTP → HTTPS через URL Rewrite Add-WebConfigurationProperty -PSPath "IIS:\Sites\MyApp" ` -Filter "system.webServer/rewrite/rules" -Name "." ` -Value @{name="HTTP to HTTPS"; stopProcessing="True"} . עבור יישומים legacy או בעייתיים—out-of-process באמצעות Kestrel מאחורי IIS כפרוקסי הפוך.
מדוע מודל אירוח In-Process מהיר יותר
מודל in-process מעבד בקשות ישירות ב-IIS ללא פרוקסי נוסף דרך Kestrel. לפי הבדיקות שלנו, הפרש התפוקה מגיע לפי 2–3 בעומס של 5000 RPS, מה שהופך אותו למהיר עד פי 3 מ-out-of-process. In-process מספק זמן אחזור מתחת ל-10 ms, בעוד ש-out-of-process יכול להגיע ל-30 ms—שיפור של פי 3 בזמן התגובה. Out-of-process מספק בידוד תהליכים—אם היישום קורס, IIS נשאר חי. הבחירה ביניהם תלויה ב-SLA: אם זמן השבתה קריטי, השתמשו ב-in-process; אם יציבות חשובה יותר ממהירות, השתמשו ב-out-of-process. הגדרה נכונה יכולה להפחית את עלויות משאבי השרת ב-30%, מה שלעיתים קרובות מתורגם לחיסכון של $500-$2,000 לחודש בהתאם להיקף.
| מאפיין | In-process | Out-of-process |
|---|---|---|
| ביצועים | גבוהים עד פי 3 | נמוכים יותר (קפיצה נוספת) |
| בידוד תהליכים | לא (w3wp.exe) | כן (Kestrel) |
| צריכת זיכרון | נמוכה יותר | גבוהה יותר (שני תהליכים) |
רישום לוגים ואבחון
כברירת מחדל, IIS כותב לוגים בפורמט W3C אל <?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\MyApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" /> <environmentVariable name="ConnectionStrings__Default" value="Server=sql01;Database=MyAppDb;..." /> </environmentVariables> </aspNetCore> <security> <requestFiltering> <requestLimits maxAllowedContentLength="52428800" /> <!-- 50 MB --> </requestFiltering> </security> </system.webServer> </location> </configuration> . עבור ייצור, הקפידו להפעיל:
# Включить подробное логирование ошибок (Failed Request Tracing)
Enable-WebRequestTracing -Name "MyApp"
Add-WebConfiguration "/system.webServer/tracing/traceFailedRequests" `
-PSPath "IIS:\Sites\MyApp" `
-Value @{path="*"}
Add-WebConfiguration "/system.webServer/tracing/traceFailedRequests/add/traceAreas" `
-PSPath "IIS:\Sites\MyApp" `
-Value @{provider="ASP"; verbosity="Verbose"}
Add-WebConfigurationProperty `
"/system.webServer/tracing/traceFailedRequests/add" `
-PSPath "IIS:\Sites\MyApp" `
-Name "failureDefinitions" `
-Value @{statusCodes="400-599"; timeTaken="00:00:30"}בנוסף, הגדירו ניטור באמצעות Performance Monitor—עקבו אחר המוני ה-hostingModel="inprocess" ו-outofprocess. זה עוזר לזהות דליפות זיכרון מוקדם.
תוצרים: מה אתם מקבלים
- תיעוד הגדרות – רשומות הגדרה מפורטות ודיאגרמות ארכיטקטורה.
- מדריך ניהול (runbook) – נהלים שלב-אחר-שלב לפעולות יומיומיות וטיפול בתקלות.
- פרטי גישה – העברה מאובטחת של כל חשבונות השירות, האישורים ומחרוזות החיבור.
- הדרכה של שעה – סיור מעשי עבור צוות ה-IT שלכם.
- חודש של תמיכה עדיפה – פתרון בעיות והתאמות לאחר הפריסה.
- דוח קו בסיס ביצועים – מדדים לפני ואחרי אופטימיזציה עם ניתוח חיסכון בעלויות.
כל התוצרים מסופקים בפורטל מאובטח. ההתקשרות הטיפוסית שלנו עבור אתר יחיד מתחילה ב-$1,500 וכוללת את התוצרים הנ"ל. לקוחות מדווחים על הפחתה ממוצעת של 30% בעלויות השרת לאחר אופטימיזציה.
טעויות נפוצות בהגדרת IIS
- שימוש ב-DefaultAppPool יחיד עבור כל היישומים—ללא בידוד, כל דליפת זיכרון או קריסה מפילה הכל. 60% מקריסות השרת נובעות מדליפות זיכרון ב-pool יחיד.
- היעדר מגבלת זיכרון ב-pool—יישום אחד "כבד" יכול לרוקן את כל זיכרון ה-RAM של השרת.
- התעלמות מזהות ה-pool—אם היישום רץ תחת
%SystemDrive%\inetpub\logs\LogFiles, הגישה למשאבים היא בעלת הרשאות יתר. - hostingModel שגוי—עבור יישומי .NET Core, in-process הוא חובה לייצור.
- היעדר הפניית HTTPS—השארת HTTP פתוח אינה מאובטחת ופוגעת ב-SEO.
אנו עוזרים להימנע מטעויות אלו ומבטיחים יציבות הגדרות. אם אתם מתמודדים עם בעיות ביצועים או קריסות IIS, הזמינו ביקורת של ההגדרות הנוכחיות שלכם—נאתר צווארי בקבוק תוך יום אחד. צרו קשר לפרטים. קבעו ייעוץ—המהנדסים שלנו ינתחו את ההגדרות שלכם ויציעו תוכנית אופטימיזציה.
שלבי עבודה ולוחות זמנים
ניתוח דרישות היישום: מחסנית, תלויות, מאפייני עומס. התקנת IIS עם הרכיבים הנדרשים (URL Rewrite, ARR אם נדרש). הגדרת Application Pools, אתרים, Bindings. הגדרת SSL, הפניות. הגדרת אימות (Windows Auth, Forms, או Basic). בדיקות, הגדרת לוגים. תיעוד.
| משימה | משך זמן |
|---|---|
| אתר אחד, הגדרה בסיסית | 0.5–1 יום |
| מספר אתרים, SSL, פרוקסי הפוך ARR | 2–3 ימים |
התמחור נקבע באופן אישי לאחר ביקורת תשתית. קבלו ייעוץ—נדון בפרויקט שלכם ונספק הערכה מותאמת. פנו אלינו לאופטימיזציה של תשתית ה-IIS שלכם.







