پیشتر و زمانی که یک شب کامل گنجور از دسترس خارج شد به لحاظ آن که دوستان زیادی نگران شده بودند راجع به آن نوشتم تا نگرانی دوستان رفع شود منتهی آن اطلاعرسانی باعث نگرانی بیشتر شد!
دوستان زیادی در آن زمان برای ارائهٔ راه حل تلاش و اقدام کردند و از جملهٔ آنها آقای محمد حکیمی از شرکت نئور فاوا راه حل اساسی و استاندارد این مشکل را ارائه کردند. برای استفادهٔ سایر دوستان (کسانی که روی ویندوز و روی IIS سایتهای مبتنی بر ASP.NET Core را میزبانی میکنند) راه حل ایشان را بازگو میکنم.
سلام
در مورد مشکل Stop شدن IIS که نوشته بودید؛ اگر موضوع Stop شدن سرویس IIS باشد، یک راه ساده این است که یک Scheduled Task ایجاد کنید که با اجرای یک خط دستور Powershell، در بازه زمانی هر 1 دقیقه یکبار اگر سرویس مورد نظر Stop شده بود، آن را Start کند. این Task خیلی ساده است و تقریبا هیچ باری به سرور وارد نمیکند.
Get-Service | Where-Object {$_.Status -eq “Stopped” -and $_.StartType -eq “Automatic” -and $_.Name -eq “W3SVC”} | Start-Service
اگر خود وب سایت در IIS به صورت Stop در آمده باشد، می توانید یک Task ایجاد کنید تا فقط آن وب سایت را هر 1 دقیقه Start کند.
Import-Module IISAdministration
Start-IISSite -Name “api.ganjoor.net”
اگر مشکل با Application Pool است به این صورت میتوانید اقدام کنید.
Import-Module WebAdministration
set-Location IIS:\AppPools
$ApplicationPools = dir
foreach ($item in $ApplicationPools)
{
$ApplicationPoolName = $item.Name
$ApplicationPoolStatus = $item.state
Write-Host “$ApplicationPoolName -> $ApplicationPoolStatus”
if($ApplicationPoolStatus -ne “Started”)
{
Write-Host “—–> $ApplicationPoolName found stopped.”
Start-WebAppPool -Name $ApplicationPoolName
Write-Host “—–> $ApplicationPoolName started.”
}
}
اگر مشکلی بود و توضیح بیشتر یا کمک فنی نیاز بود حتما بفرمایید. تا جایی که از دستم برآید دریغ نخواهم کرد.
ممنون از زحمات شما
—
Mohammad Hakimi
Neor Fava
با سپاس از آقای حکیمی عزیز، پیش از تماس ایشان برای رفع اشکال از راه حل مشابهی در قالب یک برنامهٔ دات نتی استفاده کردم که کد آن در این نشانی در دسترس است (تهیه شده با کمک چتجیپیتی).
در پاسخ به طرح این موضوع آقای حکیمی نکتهٔ بجایی را عنوان کردند:
چه خوب.
البته معمولا ترجیح ما بر این است که در پروژهها برای انجام کارهای ساده از برنامه هایی که به این صورت نوشته و Compile میشوند پرهیز کنیم چون معمولا به جزئیات مربوط به امنیت و Performance توجه کافی نمیشود. با فراخوانی Componentها، تعدادی DLL روی Memory فراخوانی میشوند و پس از اجرای برنامه هم باقی میمانند و در طول زمان منجر به پر شدن Memory سرور و کند شدن عملکرد میشود. در صورتیکه با استفاده از Scriptهای استاندارد Powershell، مدیریت مسائل جانبی توسط خود Powershell انجام میشود و دیگر دغدغههای امنیتی یا Performance وجود ندارد.
این توضیح کلی بود و مربوط به این مورد خاص نبود.
امیدوارم که در هر صورت مشکل برطرف شود و این پروژه ارزشمند پابرجا باشد.
ممنون از زحمات ارزشمند شما
با این حال با توجه به آن که راه حل پیشتر پیادهسازی شده (برنامهٔ مجزا) قبل از آن روی سرور راهاندازی شده بود من تنبلی کردم و راه حل را تغییر ندادم.
اما به نظرم رسید که راه حل آقای حکیمی را (که من در جستجوهایم به آن نرسیده بودم) برای روز مبادا و برای دیگرانی که دچار همین مشکل میشوند در اینجا به اشتراک بگذارم.