مبانی وب: فایل hosts و نکاتی راجع به DNS و Virtual hosting در apache2

مطلب خیلی ساده ای است، ولی خیلی ها از آن بی خبرند!

مقدمات

هر وب سایتی، بر روی یک سرور قرار گرفته است. (سرور یک کامپیوتر است که دسترسی به اینترنت دارد و IP ی معتبر دارد و خدمات اینترنتی ارائه می دهد.)
در ضمن، ممکن است بر روی یک سرور، چند تا وبسایت وجود داشته باشد.
همچنین ممکن است یک سرور، چند تا آدرس IP داشته باشد. اصطلاحا می گوییم چند تا Network interface دارد.
هر وب سایتی، معمولا داری یک نام دامنه است (مثلا www.example.com)

هنگامی که شما آدرس یک سایت را در مرورگر تایپ می کنید و وارد سایت می شوید، اتفاقات زیر می افتد:

1 - ابتدا باید آدرس سایت به آدرس IP تبدیل شود. زیرا بدون داشتن IP ، هرگز نمی توان به کامپیوتری در شبکه دسترسی داشت. قبل از هر چیز باید مشخص شود که آدرس IP ی کامپیوتر مورد نظر شما چیست.
برای این منظور، از DNS Server استفاده می شود. کامپیوتر شما به DNS Server متصل می شود و آدرس سایت را (مثلا www.example.com را) به آن ارسال می کند. DNS Server هم موظف است که آدرس IP ی آن را برگرداند.
به این ترتیب، آدرس IP ی سایت مورد نظر شما به دست می آید.
اما، قبل از این که کامپیوتر شما به DNS Server متصل شود، ابتدا بررسی می کند که آیا آدرس مورد نظر و IP ی معادل آن، قبلا Cache شده است یا خیر.
در صورتی که پیش از این ، یک بار آدرس IP ی آن سایت مشخص شده باشد و در سیستم شما Cache شده باشد، دیگر مزاحم DNS Server نمی شود. بلکه مستقیما از درون Cache آن را بازیابی می کند.
در ویندوز، برای این که Cache مربوط به DNS را پاک کنید و سیستم را مجبور کنید مجددا به DNS Server متصل شود، کافی است در خط فرمان CMD دستور زیر را وارد کنید:
ipconfig /flushdns
------
کامپیوتر شما همچنین، قبل از این که به DNS Server متصل شود، فایلی به نام فایل hosts را بررسی می کند. در فایل hosts نام دامنه ی سایت ها و IP ی معادل آن ها نوشته شده است. در صورتی که Ip ی سایت مورد نظر در آن موجود بود، دیگر به DNS متصل نمی شود و آدرس IP را مستقیما از درون فایل hosts استفاده می کند.

فایل hosts

در ویندوز 7 آدرس فایل hosts این است:

C:\Windows\System32\drivers\etc\hosts

در لینوکس هم آدرس آن به این صورت است:

/etc/hosts

برای ویرایش فایل hosts در ویندوز 7 کافی است در منوی Start برنامه ی Notepad را پیدا کنید. روی آن راست کلیک کنید و Run as administrator را انتخاب کنید. سپس در پنجره ی Notepad کلید Ctrl + O را بزنید و در پنجره ی Browse که باز می شود، فایل hosts را با توجه به مسیر فوق الذکر انتخاب کنید.

در لینوکس هم کافی است از دستور زیر استفاده کنید:

sudo vim /etc/hosts

در درون فایل hosts می توانید خیلی کار ها انجام دهید که بعضا می تواند جذاب باشد!

فرمت فایل hosts به این صورت است که خطوطی که با # شروع می شوند، Comment محصوب می شوند و اثری ندارند.
سایر خطوط از دو قسمت تشکیل شده اند که با یک فضای خالی مثل space یا tab از هم جدا شده اند: آدرس IP و نام دامنه. مثلا:

192.168.10.10 www.test.com

خط فوق به این معنی است که سایت www.test.com دارای آدرس Ip ی 192.168.10.10 می باشد.

به این ترتیب، هرگاه شما آدرس www.test.com را باز کنید، سیستم کاری به DNS نخواهد داشت و مستقیما آدرس IP ی 192.168.10.10 را باز خواهد کرد.

برخی از فوایدی که این کار دارد عبارتند از:

  1. ممکن است شما دوست نداشته باشید یا نخواهید پول بدهید تا یک Domain را ثبت کنید. (زیرا ثبت دامنه های .com چیزی حدود 18 هزار تومان و دامنه های IR حدود 6 هزار تومان است)
    در این صورت، خیلی راحت، دامنه ی دلخواهتان را در فایل hosts تنظیم می کنید و درست مانند این است که آن را ثبت کرده اید! (فقط با این تفاوت که فقط بر روی سیستم شما قابل استفاده است)
  2. ممکن است بخواهید IP ی سایتی را عوض کنید. مثلا از سایت پیوند ها متنفرید (مثل من) و می خواهید که این سایت را نبینید (زیرا برای اعصاب انسان مضر است!)
    کافی است که آدرس آن را با یک IP ی دلخواه که وجود ندارد و یا هر IP ی دیگری مثل 127.0.0.1 در درون فایل hosts ذخیره کنید. [البته برای این که کاملا از شر پیوندها خلاص شوید، بهتر است از درون فایروال سیستم تان Ip ی آن را بن کنید. مثل من!]
  3. برای کرک کردن نرم افزار ها مفید است. برخی نرم افزار ها، به صورت دوره ای به سایت شرکت سازنده شان متصل می شوند و آخرین Update ها را دریافت می کنند و به این ترتیب کرک نرم افزار خراب می شود و Expire می شود و نرم افزار قابل استفاده نخواهد بود.
    Cracker هم معمولا، آدرس سایت سازنده و آدرسی که نرم افزار برای Update به آن مراجعه می کند را به درون فایل hosts اضافه می کنند و IP  ی 127.0.0.1 را به آن اختصاص می دهند. به این ترتیب دسترسی نرم افزار به آن سایت مسدود می شود و نمی تواند خودش را Update کند و لذا کرک آن خراب نمی شود.
  4. برای مدیران سرور، ممکن است که سایتی داشته باشید که بر روی یک سرور موجود باشد. سپس آن را به یک سرور جدید منتقل می کنید یا به هر دلیل آدرس IP ی سایت تغییر می کند.
    مدیران سرور اطلاع دارند که در حالت، باید تنظیمات DNS را تغییر دهند و آدرس IP ی جدید را به دامنه ی مورد نظر انتساب دهند. اما وقتی این کار را می کنید، گاهی تا 72 ساعت طول می کشد تا تغییرات اعمال شود.
    این یک مدت طولانی است که ممکن است خیلی طاقت فرسا باشد. خصوصا که عجله داشته باشید!
    در این شرایط خیلی ساده می توانید از درون فایل hosts تنظیم کنیدتا فورا به سایت جدیدتان دسترسی پیدا کنید و بتوانید ادامه ی کار را پیگیری کنید.
  5. هکر ها گاهی از این روش برای ایجاد fake page استفاده می کنند. یک ویروس می تواند فایل hosts را بر روی سیستم شما تغییر دهد طوری که مثلا وقتی شما صفحه ی لاگین gmail را باز می کنید، به جای این که به IP ی gmail متصل شوید، به آدرس یک سرور دیگر که متعلق به hacker است متصل می شوید و اطلاعات لاگین مانند نام کاربری و پسورد را خیلی راحت در اختیار هکر قرار می دهید. این خیلی خطرناک است. هوشیار باشید.
  6. و ... .

در صورتی که آدرس مورد نظر در فایل  hosts موجود نبود، آن گاه از DNS Server استفاده می شود.

2 - هنگامی که آدرس IP ی سایت مورد نظر شما (که در مرورگر وارد کرده اید) مشخص شد، مرورگر می تواند به سایت متصل شود و محتویات آن را دریافت کند.

اما، نکته این جاست که ممکن است یک سرور، با یک آدرس IP چند تا سایت را میزبانی کند. به این معنی که چند تا سایت بر روی همان سرور و با همان IP وجود داشته باشد. به عبارت دیگر، ممکن است که آدرس Ip ی چندین سایت یکسان باشد.
به این ویژگی، Shared hosting می گویند. هاستینگ اشتراکی و یا Virtual hosting میزبانی مجازی

هنگامی که مرورگر آدرس Ip ی سایت را به دست می آورد و به سرور متصل می شود، باید به طریقی به سرور اطلاع دهد که کدام سایت را می خواهد.
برای این منظور، مرورگر شما، یک هدر HTTP به نام host را به سرور ارسال می کند.
آن چه که مرورگر به وب سرور ارسال می کند، چیزی شبیه زیر است:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0 AlexaToolbar/alxf-2.15
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: SESS0477099b084e7aee1ecf43e5dd4d9512=l0-O-lzs4ltRf3B6hJVVTh1DoyCFj1Qo3Cjs65L8Np0; SESSaee8cf9fa83d1d0bab0fa3a76622e624=sv0a23jp0moq5bmfjarbl6n127; doxygen_width=300; SESSf0c35bf116e5bf061605c1b3d4d5b6c3=zxtt9_ztYWRbKfH8TmznFtKiajQEDDTq2keYmXbFkX4; SESSf0eb9d8e4a8f983887cb2e810d8a056b=emml29jdirmu79qc3q0q9fipv6; DrupalAdminToolbar=expanded%3D1%26activeTab%3Dadmin-menu

خط اول عنوان تقاضا است که شامل 3 بخش می شود:

  1. متد تقاضا که در این جا GET است. می تواند POST و یا HEAD (و یا چند تا مورد دیگر) هم باشد. (قابل مقایسه است به خاصیت action در تگ form در HTML که مثلا action="get" یا action="post"
  2. آدرس فایل مورد تقاضا
  3. پروتکل و نسخه ی آن که در این جا HTTP نسخه ی 1.1 است.

خطوط بعدی Header ها هستند. به آن ها هدر های HTTP گفته می شود. هر هدر در یک سطر قرار می گیرد. هر هدر از یک نام و یک مقدار تشکیل شده است که با : از هم جدا شده اند.
من نام هدر ها را پررنگ کرده ام.

برخی از پرکاربرد ترین هدر های HTTP عبارتند از:

  1. Host هدر هاست در واقع همان هدری است که مورد بحث ما است. مرورگر، نام دامنه ی سایت مورد نظر را توسط این هدر به سرور ارسال می کند. در صورتی که بر روی وب سرور، چند تا سایت وجود داشته باشد، سرور از طریق این هدر، متوجه می شود که محتوای کدام سایت را باید به مرورگر ارسال کند.
  2. User-Agent : مرورگر، اطلاعاتی راجع به خود مرورگر و سیستم عامل کاربر را از طریق این هدر به سرور ارسال می کند. به این ترتیب سرئر می تواند که نوع مرورگر و سیستم عامل بازدید کنندگان را کشف کند. و صفحه را به صورت سفارشی برای وی ارسال کند. مثلا وقتی شما سایت Google را با موبایلتان بازدید می کنید، گوگل از روی هدر User-Agent متوجه می شود که شما دارید از موبایل استفاده می کنید و در نتیجه صفحه ی مخصوص موبایل را برای شما نمایش می دهد و ....
  3. و ....

این اتفاقاتی بود که بر روی Client یعنی کامپیوتر شما و مرورگرتان اتفاق می افتند.

 


اتفاقات سمت سرور

اما در مورد آن چه که بر روی سرور اتفاق می افتد. فرض من بر این است که سرور با سیستم عامل لینوکس Ubuntu و یا ویندوز کار می کند. گرچه سیستم عامل های دیگر هم مشابه هستند.
هم چنین فرض بر این است که وب سرور مورد استفاده، Apache است (در ویندوز، از XAMPP استفاده می کنم.)

در صورتی که از فایل hosts استفاده می کنید که هیچ، به قسمت بعد از "تنظیمات مربوط به DNS" بروید.
اما اگر قرار است که واقعا یک دامنه را ثبت کنید، باید DNS Server هم تنظیم باشد.

تنظیمات مربوط به DNS:

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

سپس به شما یک کنترل پنل دامنه (Domain Control Panel) داده می شود. اگر داده نشد، بدانید که سر شما کلاه گذاشته شده و هر طور شده کنترل پنل دامنه را بگیرید. (برخی شرکت ها نمی دهند!)

در کنترل پنل دامنه، یک جا دارد که آدرس DNS Server های دامنه را وارد کنید. (وقتی مرورگر می خواهد آن سایت را باز کند، به این DNS Server های متعلق به این دامنه، متصل می شود)

در این قسمت، باید آدرس DNS Server تان را بدهید. باید این آدرس از قبل قابل resolve باشد. یعنی بدون نیاز به این که DNS Server شما روشن باشد، باید آدرس آن قابل تبدیل به IP باشد! اگر چنین نیست، می توانید از Child DNS Server استفاده کنید. به این ترتیب که دو تا Child dns server به نام ns1 و ns2 درست می کنید و آدرس Ip ی سرورتان را به آن ها اختصاص می دهید. سپس در تنظیمات DNS در کنترل پنل دامنه، آدرس Child DNS Server های خودتان را وارد می کنید. (مثلا من برای سایت خودم به آدرس www.hejazee.com از DNS های ns1.hejazee.com و  ns2.hejazee.com استفاده کنم.) برخی از مردم، به این کار، استفاده از DNS اختصاصی هم می گویند. ولی من این اصطلاح را صحیح نمی دانم

قابل توجه است که برخی شرکت های کلاه بردار، کنترل پنل دامنه را به شما نمی دهند، و در عوض از شما پول می گیرند تا برایتان به قول خودشان DNS Server اختصاصی تنظیم کنند!! مواظب باشید گول نخورید! این کار اصلا ربطی به آن شرکت ندارد و نباید هم پولی برای آن به شرکت بدهید. خودتان باید بتوانید از کنترل پنل دامنه این کار را انجام دهید.

-----------------

پس از این که در کنترل پنل دامنه، DNS ها را تنظیم کردید (معمولا حداقل 2 تا DNS باید تنظیم کنید. اجباری نیست IP ی آن ها متفاوت باشد. گرچه در اصل باید IP ها متفاوت باشد. ولی اجباری نیست)

اکنون باید بر روی سرورتان DNS Server را نصب کنید. برای این منظور، پکیج bind9 را در Ubuntu نصب کنید. (جزییات کار و تنظیم DNS را در این جا نمی توانم بگویم. فقط مروری عرض می کنم زیرا می تواند خیلی بحث پیچیده و خیلی طولانی باشد)

سپس باید برای هر یک از دامنه هایی که میزبانی می کنید، یک Master zone ایجاد کنید و در درون آن، به ازای هر یک از Sub domain ها و خود دامنه، یک A Record ایجاد کنید. رکورد های مختلفی وجود دارد که اینجا جای بحث راجع به آن ها نیست.

خلاصه باید برای هر دامنه، یک Master zone داشته باشید.

پس از این که DNS هم پیکر بندی شد، اکنون اگر دامنه ی مورد نظر را در مرورگر باز کنید، آدرس IP ی سرور شما باز می شود و هدر Host هم توسط مرورگر به سرور ارسال می شود.

اکنون باید Apache را نصب و پیکربندی کنید.

تنظیمات مربوط به Apache

اگر سرور شما مبتنی بر Ubuntu است، نام پکیج آپاچی عبارت است از apache2
باید آن را نصب کنید:

 

sudo apt-get install apache2

پیکربندی Apache کار سختی نیست (گرچه می تواند سخت هم باشد!)
برای استارت و استپ کردن Apache هم دستورات زیر استفاده می شوند:

sudo service apache2 start
sudo service apache2 stop
sudo service apache2 restart
sudo service apache2 reload

اگر هم سرور شما ویندوزی است، می توانید XAMPP را نصب کنید. اگر XAMPP را بر روی ویندوز نصب کنید، مزیتی که برای شما دارد، این است که خیلی ساده و آسان است و همه موارد مورد نیازتان به یکباره نصب می شوند:

Apache, PHP, Mysql, perl, gd, ..., ...., All needed apache modules, All needed php modules, etc..., phpmyadmin, ...

آن چه در این جا برای ما مهم است و در همه ی سیستم عمال ها هم مشترک است، فایل پیکربندی Apache است.

در سیستم عامل Redhat و زیر مجموعه های آن، نام فایل httpd.conf است
در Debian و Ubuntu نام فایل apache2.conf است و آدرس آن هم /etc/apache2/apache2.conf می باشد.

در XAMPP بر روی ویندوز هم، فایل پیکربندی Apache در آدرس زیر واقع است:

C:\xampp\apache\conf\httpd.conf

نکته ای که حائز اهمیت است، این است که فایل پیکربندی Apache می تواند فایل های دیگری را هم Include کند. به این معنی که فایل پیکربندی Apache ممکن است بیش از یک فایل باشد و از چند قسمت تشکیل شده باشد. معمولا این کار را می کنند تا تنظیمات Apache تقسیم بندی و مرتب شود.

از آن جایی که به احتمال زیاد، مخاطبین این مطلب، اکثرا با ویندوز راحت تر هستند، پیکربندی Apache را در ویندوز و به کمک XAMPP توضیح می دهم. ولی در لینوکس هم مشابه همین است.

در فایل پیکربندی Apache خطوطی که به # شروع می شوند، Comment می باشند و اهمیتی ندارد (فقط راهنما هستند)

دستور Listen

 دستور Listen در فایل پیکربندی Apache مشخص می کند که آپاچی باید بر روی کدام IP (ها) و بر روی کدام پورت (ها) گوش دهد. ممکن است این دستور چند بار استفاده شود. مثال:

Listen 80

بر روی تمام IP ها (Network Interfaces) گوش می دهد و روی پورت 80 کار می کند.

Listen 127.0.0.1:80
Listen 127.0.0.1:443

فقط بر روی Loopback interface گوش می دهد (یعنی فقط بر وی localhost قابل دسترسی است و از بیرون قابل دسترسی نیست) و روی پورت 80 (http) و 443 (https) کار می کند.
(آدرس IP بیشتر هنگامی به کار می آید که سرور شما، چند تا IP داشته باشد)

دستور ServerName

نام سرور و آدرس IP را مشخص می کند. مثلا:

ServerName localhost:80

و یا

ServerName hejazee.com

در صورتی که سرور شما، فقط یک سایت را میزبانی کند، تنظیم این مقدار زیاد مهم نیست زیرا Apache به صورت خودکار آن را حدس می زند. اما اگر چند تا سایت را بر روی سرور میزبانی کنید، اهمیت این دستور مشخص می شود.

دستور DocumentRoot

مشخص می کند که هنگامی که شما نام دامنه را در مرورگر وارد می کنید، چه فایلی یا چه پوشه ای در سرور باید باز شود. معولا در لینوکس آدرس آن /var/www است:

DocumentRoot /var/www

در XAMPP ویندوز هم:

DocumentRoot "E:/xampp/htdocs"

(به جای \ از / استفاده کنید.)

Virtual hosting

در صورتی که می خواهید چند تا سایت را بر روی یک سرور میزبانی کنید، باید از Virtual host ها استفاده کنید.

در Ubuntu معمولا Virtual host ها را در پوشه ی /etc/apache2/sites-enabled/ تعریف می کنند.

در XAMPP ویندوز هم، Virtual host ها را باید در فایل زیر تعریف کنید:

E:\xampp\apache\conf\extra\httpd-vhosts.conf

فایل فوق را با Notepad باز کنید و آن را ویرایش کنید.

ساختار یک Virtual Host:

<VirtualHost *:80>
  DocumentRoot "E:/xampp/htdocs/www.test.com"
  ServerName test.com
  ServerAlias www.test.com
</VirtualHost>

*:80 آدرس IP و شماره پورتی است این VirtualHost بر روی آن کار می کند. * به این معنی است که بر روی تمام IP ها کار می کند.

ServerName مشخص می کند این VirtualHost برای سایت test.com است. یعنی اگر مرورگر هدر Host را با مقدار test.com ارسال کرد، این VirtualHost باید مورد استفاده قرار بگیرد.

ServerAlias مشخص می کند که به جز ServerName ، چه Host های دیگری هم به این VirtualHost تعلق دارند.

DocumentRoot هم مسیر ریشه ی سایت test.com را مشخص می کند.

در انتها فراموش نکنید که پس از ویرایش پیکربندی Apache باید Apache را restart و یا reload کنید تا تنظیمات اعمال شود.

به این ترتیب شما توانستید که یک سرور درست کنید که چندین سایت را میزبانی می کند. تشخیص سایت هم بر اساس هدر host می باشد و با VirtualHost ها Match می شود.

موفق باشید.

لطفا نظرات و سوالات و انتقادات و پیشنهادات خود را در همین صفحه به صورت دیدگاه برای من ارسال کنید.

متشکرم

نظرات شما

قسمت نظرات با استفاده از سرویس دیسکاس پیاده سازی شده است. متاسفانه این سرویس از داخل ایران قابل دسترس نیست. لطفا از آی پی خارجی استفاده کنید.