چالشهای متداول توسعهدهندگان ASP.NET Core هنگام استفاده از Nginx - قسمت دوم - مدیریت فرآیند و سرویسها
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۴/۰۸ ۰۸:۱۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
systemd، سیستم مدیریت سرویس استاندارد در اکثر توزیعهای مدرن لینوکس (مانند اوبونتو، CentOS، Debian)، استفاده خواهیم کرد تا برنامه ما به صورت خودکار اجرا، مدیریت و در صورت نیاز، راهاندازی مجدد شود.systemdsystemd مدیر سیستم و سرویسها در لینوکس است. وقتی برنامه خود را به عنوان یک سرویس به systemd معرفی میکنید، وظیفه مدیریت چرخه حیات (Lifecycle) آن را به سیستمعامل میسپارید.systemd:systemd فوراً آن را مجدداً اجرا میکند.start, stop, restart, status) میتوانید سرویس خود را کنترل کنید.root یک ریسک امنیتی بزرگ است.journald (سرویس لاگ systemd) جمعآوری میشود.systemd قدم به قدمMyWebApp فرض میکنیم./etc/systemd/system/ قرار میگیرند و باید پسوند .service داشته باشند. با یک ویرایشگر متن (مانند nano یا vim) فایل را ایجاد کنید:sudo nano /etc/systemd/system/kestrel-mywebapp.service
[Unit] Description=My Awesome ASP.NET Core Web App [Service] # مسیر پوشهای که فایلهای برنامه در آن قرار دارند WorkingDirectory=/var/www/mywebapp # دستور اصلی برای اجرای برنامه. حتما از مسیر کامل dotnet استفاده کنید ExecStart=/usr/bin/dotnet /var/www/mywebapp/MyWebApp.dll # راهاندازی مجدد خودکار در صورت شکست Restart=always # تاخیر ۱۰ ثانیهای قبل از راهاندازی مجدد RestartSec=10 # سیگنال استاندارد برای خاموش کردن نرم برنامه KillSignal=SIGINT # یک شناسه برای لاگهای برنامه در syslog SyslogIdentifier=mywebapp # کاربری که برنامه با دسترسی آن اجرا میشود (بسیار مهم) User=www-data # تنظیم متغیرهای محیطی، مهمترین آن برای محیط پروداکشن Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
[Unit]:Description: یک توضیح کوتاه و خوانا برای سرویس شما.[Service]: این بخش قلب تنظیمات ماست.WorkingDirectory: (راه حل مشکل مسیرهای نسبی) این دستور به systemd میگوید که قبل از اجرای برنامه، به این پوشه برود. این کار باعث میشود برنامه شما فایلهایی مانند appsettings.json یا دیتابیس SQLite را به درستی پیدا کند.ExecStart: دستوری که باید برای شروع برنامه اجرا شود. همیشه از مسیرهای مطلق (کامل) برای dotnet و فایل DLL برنامه خود استفاده کنید.Restart=always: تضمین میکند که اگر برنامه به هر دلیلی بسته شد، systemd آن را دوباره اجرا کند.User=www-data: (راه حل مشکل امنیتی) مشخص میکند که برنامه با کاربر www-data اجرا شود، نه root. کاربر www-data معمولاً توسط Nginx استفاده میشود و دسترسیهای محدودی دارد که امنیت را افزایش میدهد.Environment: برای تنظیم متغیرهای محیطی استفاده میشود. تنظیم ASPNETCORE_ENVIRONMENT=Production باعث میشود برنامه شما در حالت بهینه و امن اجرا شود و تنظیمات داخل appsettings.Production.json را بخواند.[Install]:WantedBy=multi-user.target: این خط به systemd میگوید که این سرویس باید هنگام بوت شدن سیستم در حالت چندکاربره فعال شود.systemd: به systemd بگویید تا فایل جدید شما را بخواند. sudo systemctl daemon-reload
sudo systemctl enable kestrel-mywebapp.service
sudo systemctl start kestrel-mywebapp.service
sudo systemctl status kestrel-mywebapp.service
active (running) را مشاهده کنید.status وضعیت failed را نشان میدهدsystemctl status یک خروجی قرمز رنگ با وضعیت failed یا inactive (dead) را نمایش میدهد.www-data)، اجازه خواندن و اجرای فایلهای برنامه در پوشه WorkingDirectory را ندارد.# تغییر مالکیت کل پوشه و فایلهای آن به کاربر و گروه www-data sudo chown -R www-data:www-data /var/www/mywebapp # اطمینان از اینکه فایلها دسترسیهای صحیح را دارند sudo chmod -R 755 /var/www/mywebapp
WorkingDirectory یا ExecStart در فایل .service اشتباه است.sudo journalctl -u kestrel-mywebapp.service
journalctl:sudo journalctl -u kestrel-mywebapp.service -f
sudo journalctl -u kestrel-mywebapp.service -n 100
sudo journalctl -u kestrel-mywebapp.service -e
systemctl و journalctl آن را کنترل و عیبیابی کنید.