atVSG

0011001000110100

وحید امیری مطلق

توسعه دهنده وب و موبایل

انتشار وب اپ ساخته شده با ASP.NET Core با وب سرور Apache


ASP.NET Core + Apache

نسخه جدید فرم ورک Microsoft ASP.NET با عنوان ASP.NET Core یک فریم ورک ماژولار و منبع باز برای ساخت Web App و انواع Web API استفاده میشه. از بزرگترین مزیت های این نسخه، استفاده اون از NET Core هست که باعث میشه بتونید علاوه بر ویندوز، روی انواع توزیع های لینوکس و macOS هم برنامه ها رو اجرا کنید و از تمام مزیت هایی که دارن از جمله مصرف کمتر منابع و وب سرور قوی و محبوب nginx بهره مند بشید.

مسلما مثل همیشه امکان میزبانی ASP.NET Core روی وب سرور IIS که مخصوص ویندوزه هست ولی به دلایل زیادی از IIS خوشم نمیاد و ترجیح میدم از Apache استفاده کنم. مهم ترین دلایل من برای این کار اینه که تجربه ی مناسبی با Apache دارم و بدون اتلاف وقت میتونم تموم اون ها رو برای ASP.NET Core پیاده کنم و از طرفی همون طور که همه دنیا میدونن، Apache یک نرم افزار Cross Platform هستش که به معنی اینه که Apache رو روی هر سیستم عاملی اجرا کنید، دقیقا همین کار هایی که برای تنظیم Apache روی مثلا لینوکس انجام میدید رو بتونید با کمترین تغییر ممکن روی ویندوز هم پیاده کنید و این به شما این اجازه رو میده که به راحتی و در صورت نیاز، بتونید برنامه خودتون رو به یک سرور با یک سیستم عامل کاملا متفاوت منتقل کنید. همچنین این معنیه که میتونید چندین سایت با تکنولوژی های کاملا متفاوت رو کنار هم و بدون کوچکترین مشکلی روی یک سرور و یک وب سرور هاست کنید!

اولین قدم برای هاست کردن ASP.NET Core روی Apache اینه که برنامه رو build کنید و سپس publish (انتشار). 2 روش برای انجام این کار وجود داره.

اولین روش اینه که از برنامه به صورت یک کتابخونه Net Core خروجی بگیرید که به این صورت برای اجرا احتیاج به net core runtime داره که باید در سرور نصب بشه حتما.

دومین روش و روشی که من بیشتر دوست دارم اینه که از برنامه رو همراه با runtime کامپایل و build کنید و یک net core self contained web app دریافت کنید که در این روش خروجی برنامه همراه با runtime مخصوص اون environment مشخص شده مثلا win10 یا win7 یا ubuntu.16.04 خواهد بود که در این صورت یک فایل اجرایی هم تحویل میگیرید که از طریق اون میشه برنامه رو تحت وب سرور Kestrel در قالب یک پنجره console یا terminal اجرا و log های برنامه رو دید. مطمئنا حجم برنامه در این حالت بیشتر از حالت اول هست ولی در عوض میتونید اون رو در هر محیطی بدون نیاز به نصب بودن framework منتقل و اجرا کرد. حتی میشه اون رو به راحتی با یک flash drive منتقل و بلافاصله استفاده کرد.

 

پس در ادامه روش دوم رو توضیح میدم.

 

گرفتن خروجی برنامه ASP.NET Core 1.x

 

اولین مطمئن بشید Net Core SDK نصب و آماده استفاده هست.

بعدش باید به محل (فولدر) پروژه شروع (Startup Project) برید و فایل .csproj رو با یک text editor باز کنید. داخل تگ Project و همچنین داخل اولین تگ PropertyGroup تگ زیر رو اضافه کنید:

<RuntimeIdentifiers>win7-x64;win7-x86;win10-x64;</RuntimeIdentifiers>

پس حالا یه همچین چیزی خواهید داشت:

asp.net core project csproj file

داخل این تگ لیستی از انواع Runtime IDs ها هست که لیست کاملشون اینجا موجوده. این لیست تمام Runtime ID های مورد پشتیبانی توسط وب اپ ما رو شامل میشه. فایل رو ذخیره کنید.

حالا در همون پوشه پنجره ی کنسول رو باز کنید (نگه داشتن shift و راست کلیک در محل خالی و انتخاب Open command window here) و دستور dotnet restore رو اجرا کنید. این دستور باعث میشه که تغییرات ما در فایل .csproj اعمال بشه و در صورت نیاز package های مورد استفاده پروژه دانلود بشن.

حالا نوبت به مرحله اصلی یعنی build و publish میرسه. ما از دستور publish برای این کار استفاده میکنیم که خودش عمل build هم انجام میده. دستور زیر برنامه ما رو برای خانواده 64 بیتی ویندوز 7 شامل ویندوز سرور 2008 منتشر میکنه. یعنی فایل های برنامه علاوه بر runtime های مورد نیاز برای این نوع سیستم عامل رو میسازه و در کنار هم قرار میده.

dotnet publish -c Release -r win7-x64

حالا در همون محل، فولدری به اسم bin ایجاد میشه که داخلش باید فولدری به اسم Release باشه که داخل اون فولدری با اسمی مشابه و شاید یکسان با netcoreapp1.1 خواهید داشت. داخل این فولدر یه پوشه به نام win7-x64 رو میبینید که درون اون یکسری فایل هست و یک فولدر به اسم publish که این یکی همونیه که ما احتیاج داریم. داخل این فولدر، فایل ها و یکسری پوشه ها رو میشه دید. یک فایل اجرایی وجود داره که اسمش مثل اسم پروژه وب اپ شماست. اون فایل رو باز کنید. با چیزی مثل تصویر زیر رو به رو میشید:

netapp

میبینید که برنامه با موفقیت روی پورت 5000 و در آدرس localhost اجرا شده و منتظر request هایی هست که به سمتش میاد. اگه در این مرحله برنامه کرش کرد به معنی اینه که احتمالا یک runtime خارجی وجود نداره روی سیستم شما. من قبلا با این مشکل رو به رو شدم و نصب Visual C++ 2015 Redistributable مشکل رو برطرف کرد.

حالا برنامه رو ببندید، ctrl+c.

محتویات فولدر publish رو در یک archive ذخیره کنید و به سرور مورد نظر که وب سرور Apache رو اون هست، منتقل کنید.

 

تنظیمات Apache 2.4

 

من در اینجا فرض میکنم که شما یک سرور دارای IP استاتیک دارید که DNS اون رو تنظیم کردید و یک دامنه مثل example.com دارید که میخواید سایت ASP.NET Core خودتون رو در اون آدرس نمایش بدید. بعد از نصب آپاچی و تنظیم اون به عنوان یک service میتونید ادامه بدید و در پوشه ای که انتخاب کردید فایل های سایت رو از آرشیوی که قبلا درست کردید خارج و در اونجا بریزید. حالا به پوشه محل نصب Apache برید و در پوشه conf و درون extra فایل httpd-vhosts.conf رو با یه ادیتور خوب مثل nodepad++ باز کنید و بلوک کد زیر رو بهش اضافه کنید:

	<VirtualHost *:80>
		ProxyPreserveHost On
		ProxyPass / http://127.0.0.1:5000/
		ProxyPassReverse / http://127.0.0.1:5000/
		Header set Access-Control-Allow-Origin "*"
		ServerName example.com
		ServerAlias www.example.com
		ErrorLog "logs/example.com-error.log"
		CustomLog "logs/example.com-access.log" common
	</VirtualHost>

در بلوک بالا اول اعلام میکنیم که این virtual host به عنوان proxy عمل میکنه بعد آدرس forward proxy و reverse proxy رو بهش میدیم که در اینجا 127.0.0.1 معادل localhost هست و در پورت 5000 قرار داره که این همون جاییه که اپ ASP.NET Core ما اجرا میشه و اونجا رو listen میکنه. قسمت ServerName خیلی مهمه و باید حتما دامنه صحیح رو وارد کنید وگرنه ممکنه با مشکل مواجه بشید (مخصوصا وقتی که چندین virtual host داشته باشید و قصد داشته باشید چندین دامنه رو روی این سرور هاست کنید). من در بلوک بالا برای نمونه یک header هم ست کردم که صرفا به شما نشون بدم که این کار هم میشه در همین بلوک انجام داد. برای مشاهده مستندات کامل این بخش به اینجا و برای مثال های بیشتر به اینجا مراجعه کنید.

 

تمام شد! حالا اگه به آدرس دامنه خودتون مراجعه کنید Apache به محض دریافت request از سمت کاربر، اون رو بدون تغییر منتقل میکنه به Kestrel و اپ ASP.NET Core شما و نتیجه نهایی به Apache و در نهایت به کاربر برگردانده میشه.

 

توجه: در ابتدای این virtual host ما نوشتیم: VirtualHost *:80 که این به معنیه اینه که این virtual host به هر request روی این سرور (صرف نظر از IP) در پورت 80 جواب میده. اگه سرور شما دارای چندین IP اختصاصیه او موقع ممکنه بخواید که بعضی سایت هاتون رو روی بعضی IP ها و بقیه رو روی یک رنج دیگه هاست کنید که در اون حالت باید * رو با IP مورد نظرتون جایگزین کنید. در ضمن برای پشتیبانی از پورت های دیگه میتونید 80 (که پورت استاندارد و پیش فرض مرورگرهای اینترنت هست) رو عوض کنید. مثلا برای TLS و SSL باید از پورت 443 استفاده کنید که توضیحش طولانیه.


 دیدگاه ها:
سوال یا دیدگاه؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *