وب سرور Apache و ميزبانی مجازی

 

تهيه كننده: امين ايزدپناه

 

يکی از اساسی ترين و شايد مهمترين سرويس های ارائه شده به همراه سيستم عامل لينوکس ، وب سرور می باشد . همانگونه که می دانيد وب سرور توانايی راه اندازی و تنظيم وب سايت شما و يا احيانا تعداد بيشتری وب سايت را برايتان فراهم می آورد . امروزه عمده ترين و معمول ترين وب سروری که در محيط لينوکس مورد استفاده قرار می گيرد، وب سرور Apache است . اين وب سرور توسط موسسه نرم افزاری Apache  (www.apache.org) پشتيبانی می گردد . حال بد نيست که قبل از هر چيز با هم نگاهی گذرا بر نحوه عملکرد وب سرور بر روی يک ماشين داشته باشيم . به زبان ساده می توان گفت که وظيفه يک وب سرور پاسخ دادن به درخواست هایی است که برای آن ارسال می گردد . اين عمل توسط پروتکل HTTP صورت می پذيرد . پروتکل مزبور يک سرويس ساده است که به کلاينت ها (ميزبان های راه دور) توانايی درخواست اسناد مختلف را از سرور می دهد . اين پروتکل همچنين کلاينت ها را قادر به برگشت دادن اطلاعات به سرور ( به منظور برقراری يک ارتباط متقابل ) می نمايد . اکثر نسخه های لينوکس بصورت پيش فرض وب سرور Apache را نصب می کنند . اما شما می توانيد با يک آزمايش ساده از نصب و اجرای آن بر روی سيستم خود اطمينان حاصل نماييد . به اين منظور يک مرورگر وب مانند Netscape يا Konqueror را اجرا نموده و آدرس زير را در قسمت آدرس آن تايپ کنيد :

http://localhost

حال در صورتيکه Apache بر روی سيستم شما نصب و اجرا شده باشد ، شما صفحه تستی را که حاوی مطالبی در مورد Apache و احيانا اطلاعاتی درباره ناشر نسخه لينوکس نصب شده بر روی سيستمتان است مشاهده خواهيد کرد . لازم به ذکر است که وب سرور در حالت عادی ، بصورت خودکار ، حين بوت شدن سيستم اجرا می گردد .

خب پس از توضيحات مختصر در مورد Apache ، بد نيست کمی هم به بحث درباره تنظيمات آن بپردازيم . مسير قرار گرفتن فايل های مربوط به تنظيمات Apache با توجه به نسخه آن می تواند بسيار متفاوت باشد . اما به صورت معمول آنها فايل های مربوط به تنظيمات را در ServerRoot و تمام اسناد HTML را در DocumentRoot نگهداری می کنند . فايل های مربوط به تنظيمات وب سرور Apache نيز به صورت پيش فرض در دايرکتوری /usr/local/apache/conf قرار گرفته اند ، که البته اين مورد نيز بر اساس نسخه لينوکس متفاوت می باشد . اگر از نزديک نگاهی به داخل اين دايرکتوری بياندازيد ، فايل های مختلفی را می بينيد که جنبه های متفاوتی از رفتار و اعمال وب سرور را کنترل می کنند. دايرکتوری اصلی برای فايل های تنظيمی در فايل httpd.conf مشخص می گردد . يعنی هنگامی که وب سرور اجرا می گردد ، مسير فايل httpd.conf مشخص شده و مسير مربوط به مکان قرارگيری ساير فايل های تنظيمات از آن استخراج می شود . درون دايرکتوری تنظيمات پنج فايل اصلی قابل مشاهده است :

1.      فايل httpd.conf که همانجور گفته شد حاوی تنظيمات عمومی سرور می باشد .

2.   فايل srm.conf که ساختار درختی اسنادی را که برای دنيای خارج قابل مشاهده هستند و همچنين چگونگی انتقال اطلاعات از اين ساختار به کلاينت ها را تعريف مينمايد.

3.   فايل access.conf که تنظيمات مربوط به ميزان دسترسی به هر دايرکتوری در آن نگهداری می شود .

4.      فايل mime.type که حاوی تعريف انواع مختلف فايل بر اساس پسوندهای متفاوت آنهاست .

5.      فايل magic که حاوی تعريف انواع مختلف فايل بر اساس محتويات فايل ها می باشد .

البته لازم به ذکر است که امروزه فايل httpd.conf خود به تنهايی با در بر گرفتن تمامی تنظيمات مربوط به وب سرور، نياز به فايل های srm.conf و access.conf را از بين برده است . به هر حال وب سرور توانايی تفسير هر کدام از سه فايل فوق ( با پسوند .conf ) را دارا می باشد . هر چند که امروزه به منظور کاهش ميزان اشتباه و پيچيدگی کار، تمامی تنظيمات مربوط به خود را در فايل اصلی httpd.conf جستجو و تفسير می کند ، اما در صورتيکه دو فايل ديگری که در بالا ذکر شد با پسوند .conf روی سيستم ما وجود داشته باشند ، Apache آنها را بر اساس ترتيب زير پردازش می کند :

ابتدا فايل httpd.conf ، سپس فايل srm.conf و در نهايت هم فايل access.conf تفسير و پردازش می شوند .

خب به همين توضيحات درباره وب سرور Apache و تنظيمات آن بسنده کرده و به بحث اصلی خود يعنی ميزبانی مجازی بر روی اين وب سرور می پردازيم .

امروزه با وجود علاقه شديد و روزافزون نسبت به اينترنت و در نتيجه افزايش تعداد وب سايت های موجود ، مشاهده يک سرور که به عنوان ميزبان چندين وب سايت ايفای نقش می نمايد به يک امر عادی تبديل گشته است . به زبان ساده می توان گفت منظور از ميزبانی مجازی ، ميزبانی بيشتر از يک وب سايت توسط يک سيستم می باشد . اما روش های متفاوتی برای ميزبانی چندين وب سايت توسط يک ماشين وجود دارد. يکی از اين روش ها ، اجرای چندين کپی از وب سرور (برای هر سايت يک کپی) است . که البته در اين روش به احتمال زياد ، بدليل محدوديت منابع ، با موانعی روبرو خواهيم شد . اما خوشبختانه وب سرور Apache که موضوع بحث ما می باشد ، امکان سرويس دادن به چندين وب سايت از روی يک سرور را به ما می دهد . امکان مزبور از طريق دايرکتيو virtualhost در اختيار ما قرار می گيرد . اين عمل به دو روش صورت می پذيرد :

يکی بر اساس استفاده از چندين آدرس IP (برای هر وب سايت يک آدرس) و ديگری براساس پشتيبانی از چندين نام ميزبان روی يک آدرس IP ، که روش اول را مبتنی بر IP يا IP-based و روش دوم را مبتنی بر نام يا Name-based می گويند . البته يک نوع از ميزبانی مجازی نوع مبتنی بر IP موسوم به روش مبتنی بر پورت يا Port-based نيز وجود دارد که در آن فقط قسمت پورت مربوط به آدرس ( در ميان ميزبانهای مجازی ) متفاوت است .

خب حال که با انواع روش های ميزبانی مجازی آشنا شديم اين سوال پيش می آيد که ما بايد بر اساس چه معياری به انتخاب نوع ميزبانی بپردازيم ؟ موارد زير به نظر معيارهای مناسبی جهت انتخاب روش ميزبانی مجازی می باشند :

 

● آيا سيستم شما دارای چندين نام ميزبان است ؟

  اگر شما بر روی سيستم خود چندين نام داريد که به يک آدرس IP نسبت داده شده اند، پس بايستی از ميزبانی مجازی نوع مبتنی بر نام استفاده کنيد . و اين يعنی اينکه شما نيازمند اعمال کنترل کامل بر روی سرور DNS برای دامنه تان هستيد .

 

● تعداد وب سايت هايی که قصد ميزبانی آنها را داريد ، چندتاست ؟

در صورتيکه قصد پشتيبانی از دو يا سه سايت را بر روی يک سيستم داشته باشيد، به کار بردن دو يا سه آدرس IP برای ميزبانی نوع مبتنی بر IP به نظر راه حل مناسبی می آيد . در حاليکه برای ميزبانی تعداد زيادی وب سايت استفاده از روش ميزبانی مجازی مبتنی بر نام مناسب به نظر می رسد .

 

● آيا تمامی وب سايت هايی که آنها را ميزبانی می کنيد از يک پورت استفاده می کنند ؟

در صورتيکه شما ميزبانی سايت هايی را بر عهده داريد که داخلی هستند يا سايتهايی هستند که هيچگونه لينکی به دنيای بيرون ندارند، آنگاه می توانيد از يک آدرس IP جهت پياده سازی ميزبانی مجازی استفاده کنيد اما با پورت های متفاوت . اين وضعيت از لحاظ پياده سازی نيز ساده تر می باشد .

 

● آيا ماشين شما بيشتر از يک آدرس IP دارد ؟

در صورتيکه سيستم شما دارای چندين آدرس IP می باشد، و خصوصا اگر ماشينتان از قبل برای هر وب سايت که قصد تنظيم آن را داريد يک آدرس IP اختصاص داده است ، بهتر است که از ميزبانی مجازی مبتنی بر IP استفاده کنيد . در غير اين صورت امکان اضافه نمودن آدرس های IP را به سيستم خود بررسی کنيد . درست است که تنظيم چندين آدرس IP بر روی يک ماشين کار سختی نيست اما شما بايستی اين موضوع را نيز مدنظر قرار دهيد که آيا تعداد آدرس های کافی جهت ميزبانی سايت های مورد نظرتان در اختيار هست يا نه .

 

● آيا تمامی کلاينت های شما قادر به استفاده از ميزبانی مجازی مبتنی بر نام می باشند ؟

گاهی وضعيت هايی وجود دارد که در آن تعدادی از کلاينت های قديمی با ميزبانی مجازی مبتنی بر نام همخوانی ندارند . در اين حالت نيز بايستی از ميزبانی مجازی مبتنی بر IP استفاده کرد .

 

● آيا قصد استفاده از SSL را داريد ؟

در صورت استفاده از پروتکل SSL (Secure Sockets Layer) بايستی به اين موضوع توجه داشته باشيد که ميزبانی مجازی مبتنی بر نام قابل استفاده با سرورهای امن SSL نيست و اين موضوع به دليل طبيعت پروتکل SSL می باشد .

 

● از چه نوع سيستم عامل ها و تجهيزات شبکه ای استفاده می کنيد ؟

در توضيح اين گزينه بايد گفت که برخی سيستم عامل ها و تجهيزات شبکه از تکنيک های مديريتی پهنای باندی استفاده می کنند که قادر به شناسايی ميزبان ها نيستند مگر اينکه ميزبان های مزبور بر روی آدرس های IP متفاوت قرار داشته باشند . پس در اين حالت بايستی از ميزبانی مجازی مبتنی بر IP استفاده نمود .

 

● آيا در وضعيتی هستيد که بايد وب سايت ها را بصورت دقيق از يکديگر مجزا نماييد ؟

وضعيتی را تصور کنيد که نيازهای امنيتی يا مديريتی وب سايت هايتان متفاوت از يکديگر است ، در اينصورت شما ناچاريد از ميزبانی مجازی با چندين وب سرور مجزا بهره ببريد.

 

خب ، پس از انتخاب روش ميزبانی حال نوبت به پياده سازی آن می رسد . در اين قسمت به بررسی نحوه پياده سازی هر کدام از انواع ذکرشده می پردازيم :

 

1. استفاده از چندين آدرس IP بر روی يک سرور

همانطور که قبلا نيز گفته شد ، يکی از راه های ميزبانی چندين وب سايت توسط يک سيستم ، استفاده از يک آدرس IP متفاوت برای هر وب سايت است که ميزبانی مجازی مبتنی بر IP يا IP-based و گاهی اوقات نيز Address-based ناميده می شود که به صورت کلی دو روش متفاوت برای پياده سازی آن وجود دارد. اگر سيستم شما دارای چندين کارت شبکه باشد ، هر کارت آدرس IP مربوط به خودش را دارد. اما کار ديگری که می توان انجام داد نسبت دادن بيش از يک آدرس IP به يک کارت شبکه هست که اين عمل توسط يکی از امکانات لينوکس بنام IP aliasing انجام پذير است . به منظور تنظيم وب سرور برای گوش فرا دادن به چندين آدرس و پاسخ دادن به هر کدام به صورت مجزا از دايرکتيو virtualhost استفاده می گردد . يک مثال برای تنظيم ميزبانی مجازی بر روی ماشينی با آدرس های 194.42.56.1 و 194.42.56.2 در زير آورده شده است . اين آدرس ها به ترتيب به server.site1.com و www.site2.com اشاره دارند. نام ميزبان www.site1.com يک نام مستعار (Cname) برای server.site1.com است که به عنوان سرور اصلی شناخته ميشود .

 

Port          80

DocumentRoot          /www/site1

ServerName          www.site1.com

 

<VirtualHost          194.42.56.2>

DocumentRoot          /www/site2

ServerName          www.site2.com

</VirtualHost> 

 

 

مثال 1 – ميزبانی مجازی نوع IP-based

 

با توجه به مطالب گفته شده ، به سادگی در می يابيد که در مثال 1 ، www.site2.com تنها از طريق آدرس 194.42.56.2 و www.site1.com فقط توسط آدرس 194.42.56.1 قابل دستيابی هستند . در اين مثال سرور به پورت 80 مقيد شده است . يعنی در اين حالت سرور برای تمام آدرس های IP موجود بر روی ماشين ، درخواست های TCP را از پورت 80 دريافت می کند. پس از دريافت يک درخواست توسط سرور، بايستی آدرس مقصد شناسايی گردد . اگر آدرس مقصد 194.42.56.1 بود، سرور به وسيله يکی از اسناد موجود در زير شاخه /www/site1 به درخواست پاسخ می دهد و در غير اينصورت يعنی هنگاميکه آدرس مقصد 194.42.56.2 باشد، سرور بوسيله يکی از اسناد موجود در زيرشاخه /www/site2 به درخواست رسيده پاسخ می دهد. پس همانگونه که در مثال 1 مشخص است، کلاينت ها به دو وب سايت مختلف يعنی http://www.site1.com و http://www.site2.com دسترسی دارند . اما شما می توانيد از دايرکتيو های ديگری نيز به منظور کنترل جنبه های ديگری از سروری که ميزبانی سايت را بر عهده دارد استفاده کنيد . به مثال 2 توجه نماييد. در اين مثال سرور ما دارای دو آدرس IP بصورت 194.42.56.1 و 194.42.56.2 می باشد که به ترتيب به نام های server.site.com و www-cache.site.com اختصاص داده شده اند . نام ميزبان www.site.com يک نام مستعار برای server.site.com است و به عنوان سرور اصلی شناخته می شود. www-cache.site.com نيز حافظه نهان متعلق به پروکسی ما خواهد بود که بر روی پورت 8080 گوش فرا می دهد در حاليکه وب سرور از پورت پيش فرض 80 استفاده می کند.

 

 

port          80

listen          194.42.56.1:80

listen          194.42.56.2:8080

ServerName          server.site.com

 

<VirtualHost          194.42.56.1:80>

DocumentRoot          /www/site

ServerName          www.site.com

</VirtualHost>

 

<VirtualHost          194.42.56.2:8080>

ServerName          www-cache.site.com

<Directory          proxy:>

Order Deny, Allow

Deny From All

Allow From 194.42.56

</Directory>

</VirtualHost>

 

 

مثال 2 – ميزبان مجازی مبتنی بر IP که از آدرس دهی پيچيده استفاده می کند .

 

همانطور که در مثال 2 مشاهده می کنيد ، آدرس IP برای يک ميزبان مجازی درون خود دايرکتيو <VirtualHost> اختصاص داده می شود . که آدرس مزبور می تواند شامل يک شماره پورت نيز که بوسيله علامت " : " از آدرس IP جدا شده است ، باشد . در حالتی که مثال 2 نشان می دهد ، وب سرور فقط به وسيله آدرس اولی و از طريق پورت 80 و پروکسی نيز فقط از طريق آدرس دوم و بوسيله پورت 8080 قابل دستيابی خواهند بود .

 

يکی ديگر از شرايطی که امکان وقوع آن وجود دارد اين است که يک کلاينت درخواست دسترسی به مقصدی را نمايد که آدرس آن با آدرس ميزبان مجازی ما مطابقت نمی کند . برای چنين شرايطی بايستی يک وب سايت جايگزين تعريف گردد . اين عمل به کمک کلمه کليدی _Default_ که به جای آدرس IP در يک دايرکتيو <VirtualHost> استفاده می شود امکان پذير است . اين مطلب می تواند در مورد تنظيمات مربوط به ميزبان های مجازی پيچيده مهم باشد . نحوه پياده سازی اين حالت را می توانيد در مثال 3 مشاهده نماييد .

 

 

<VirtualHost          _Default_  : *>

<DocumentRoot          /www/Default

</VirtualHost>

 

 

مثال 3 – دريافت درخواست هايی که آدرس IP و پورت آنها نامعين است .

 

 

و اما همانگونه که در ابتدا نيز اشاره شد ، نوع ديگری از ميزبانی مجازی مبتنی بر IP وجود دارد که به ميزبانی مجازی مبتنی بر پورت مشهور است . شما می توانيد نحوه استفاده و پياده سازی اين نوع ميزبانی را در مثال 4 ببينيد .

 

 

listen          80

listen          8080

ServerName          www.site1.com

DocumentRoot          /www/site1

 

<VirtualHost          194.42.56.1:8080>

DocumentRoot          /www/site2

</VirtualHost>

 

 

مثال 4 – ميزبانی مجازی مبتنی بر پورت

 

 

 در مثال 4 ، سرور دارای يک آدرس IP به شکل 194.42.56.1 می باشد  که به نام www.site1.com اختصاص يافته است . اگر ما قادر به اختصاص يک آدرس IP ديگر يا يک نام مستعار به سرور نباشيم و از طرفی نياز به يک ميزبان با تنظيمات متفاوت داشته باشيم ، می توان از اين حالت يعنی ميزبانی مجازی مبتنی بر پورت استفاده نمود . در اين حالت (مثال 4) درخواست های ارسال شده اگر بر روی پورت 80 باشند توسط سرور اصلی و اگر بر روی پورت 8080 باشند توسط ميزبان مجازی پاسخ داده می شوند .

 

2. استفاده از چندين نام DNS بر روی يک سرور

همانگونه که در ابتدای بحث مطرح شد ، شرايطی وجود دارد که در صورت بروز آنها ما امکان استفاده از ميزبانی مجازی مبتنی بر آدرس را نخواهيم داشت . در اين حالت می توان از ميزبانی مجازی مبتنی بر نام استفاده کرد که هنوز هم ساده ترين روش ميزبانی مجازی به شمار می رود . قواعد کلی موجود در مورد ميزبانی مجازی مبتنی بر نام ، اساسا همان قواعد ميزبانی مجازی مبتنی بر IP هستند. در اين حالت نيز سرور از نام ميزبان که درون درخواست کلاينت قرار دارد برای تعيين ميزبان استفاده می کند . لازم به ذکر است که ميزبانی مجازی مبتنی بر نام هم به وسيله يک آدرس IP و هم به کمک چند آدرس IP قابل پياده سازی است . برای تنظيم اين نوع از ميزبانی وب ، بايستی از دايرکتيو NameVirtualHost ( به منظور تعيين اينکه کدام آدرس ها برای ميزبان های مجازی مبتنی بر نام بکار برده شده اند ) استفاده کرد . همانند حالت های قبلی  ، در مواردی که تمام آدرس های IP موجود بر روی سرور بايد مورد استفاده قرار گيرند، شما می توانيد از علامت " * " به عنوان آرگومان در دايرکتيو NameVirtualHost استفاده کنيد . البته شما بايد به اين نکته توجه داشته باشيد که ذکر يک آدرس IP در دايرکتيو NameVirtualHost به تنهايی و به صورت خودکار سرور را قادر به گوش فرا دادن به آن آدرس نمی کند . قدم بعدی ، ايجاد يک بلوک <VirtualHost> برای هر ميزبانی است که شما قصد ارائه سرويس به آن را داريد . توجه به اين نکته ضروری است که آرگومان بکار رفته در دايرکتيو <VirtualHost> بايستی همان آرگومان استفاده شده در دايرکتيو NameVirtualHost باشد . درون هر بلوک <VirtualHost> شما حداقل به يک دايرکتيو ServerName (برای تعيين اينکه کدام ميزبان سرويس دهی شده است) و يک دايرکتيو DocumentRoot (برای نشان دادن مکانی که محتوای مورد نياز آن ميزبان در آنجا قرار گرفته است ) نياز خواهيد داشت .

 

 

listen          194.42.56.1:80

NameVirtualHost          194.42.56.1:80

<VirtualHost          194.42.56.1:80>

DocumentRoot          /www/site1

ServerName          www.site1.com

ServerAlias          www         www.site1.com

</VirtualHost>

 

<VirtualHost          194.42.56.1:80>

DocumentRoot          /www/site2

ServerName          www.site2.com

</VirtualHost>

 

 

مثال 5 – ميزبانی مجازی مبتنی بر نام

 

 به نحوه استفاده از دايرکتيو ServerAlias در تعريف ميزبان مجازی اول در مثال 5 توجه نماييد . در اين حالت ، اگر درخواست يک کلاينت شامل نام www.site1.com و يا فقط شامل www باشد ، آنگاه اولين ميزبان بکار برده خواهد شد .

نتيجه آنکه در ميزبانی نوع مبتنی بر نام با استفاده از ServerAlias می توان به کلاينت هايی که در شبکه محلی قرار دارند اين امکان را داد که بجای استفاده از اسامی طولانی FQDN (Fully Qualified Domain Names ) از اسامی کوتاه مستعار يا Alias استفاده کنند.

نکته ديگری که در مورد مثال 5 حائز اهميت می باشد اين است که چون در اينجا www.site1.com در ابتدای فايل تنظيمات قرار گرفته ، پس دارای بالاترين اولويت می باشد و به عنوان سرور پيش فرض يا اصلی شناخته می شود.

 

استفاده از بيش از يک وب سرور بر روی يک ماشين

همانگونه که در آغاز بحث گفتيم ،  راه ديگر ميزبانی بيش از يک وب سايت بر روی يک ماشين ، نصب و اجرای چندين نسخه از وب سرور روی يک سيستم است . در اين صورت به جای استفاده از دايرکتيو های <VirtualHost> شما هر سرور را با فايل های تنظيمی مربوط به خودش تنظيم می نماييد . البته در اين حالت بايد اطمينان حاصل کرد که سرورهای نصب شده هيچگونه تداخلی با يکديگر ندارند که اين مطلب خود بحث ايجاد مجموعه ای از فايل های تنظيمی را برای هر سرور مطرح می کند . در اين روش هر سرور نيازمند تنظيم فايل های تنظيمی و راه انداز خاص خود است . اسکريپت مربوط به فايل راه انداز برای لينوکس Redhat و نسخه های مشابه در مسير /etc/rc.d/init.d/httpd قرار دارد . برای اينکه سرور ها بدون تداخل با يکديگر اجرا گردند ، بايستی از آدرس های متفاوت يا حداقل از پورت های متفاوت استفاده نمود . جهت تعيين و راه اندازی آدرس IP و پورت TCP که بوسيله يک سرور استفاده می شود، بايستی از دايرکتيو های BindAddress ، Port و Listen موجود در فايل httpd.conf متعلق به هر سرور استفاده کرد .