آموزش PHP جلسه هفتم: مروری بر DNS و معرفی Virtual Host

برای شروع این جلسه، ابتدا مروری بر DNS داشته باشیم.
تمام سیستم ها در فضای اینترنتی با یک آیپی قابل شناسایی هستند. بنابراین درخواست ها و پاسخ هایی که بین سیستم های مختلف رد و بدل میشوند، از طریق آیپی همدیگرو شناسایی میکنند. فرض کنید، درخواستی از کامپیوتر شما با آیپی x.x.x.x به کامپیوتر دوم با شماره ی آیپی y.y.y.y ارسال شود. کامپیوتر دوم(مقصد) درخواست را تحویل گرفته و به بسته ی ارسالی نگاه میکند که از کدام کامپیوتر این درخواست ارسال شده است و در نتیجه کامپیوتر مقصد، پاسخ را به کامپیوتر مبدأ با شماره آیپی x.x.x.x ارسال میکند.
اما ازآنجایی که این روال در پشت پرده ی شبکه اتفاق می افتد، برای کاربران اینترنتی قابل لمس نبوده است.

حالا فرض کنید، میخواهیم سایت گوگل را باز کنیم. پس باید آیپی سرور آن یعنی 216.58.212.14 را در مرورگر وارد کنید. ولی حفط کردن این آیپی و تمام سایت های دیگر کمی سخت است. برای مثال میتوانید دفترچه ی موبایل خود را در نظر بگیرید. شما نمیتوانید، تمام شماره ی مخاطبین خود را حفط کنید، برای همین، شماره را با نام مخاطبش در موبایل ذخیره میکنید.
Domain Name System یا به اختصار DNS به همین منظور شکل گرفته است. پایگاه داده هایی در نقاط مختلفی ایجاد شده اند تا نام سایت ها را به آیپی آن ترجمه کنند.
بنابراین زمانی که شما در مرورگر خود نام google.com را وارد میکنید، مرورگر ابتدا دنبال آدرس آیپی آن میگردد. پس درخواستی به DNS Server ها ارسال میکند و از روی این بانک های اطلاعاتی، آیپی سایت google.com پیدا میشود و آن آیپی به مرورگر برمیگردد. حالا که مرورگر آیپی سایت گوگل را دارد، پس یک درخواست HTTP به آیپی 216.58.212.14 ارسال میکند و بقیه ی ماجرا.(در جلسه ی اول اشاره کردیم.)

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

برای مثال میتوانید آدرس chrome://net-internals/#dns را در مرورگر کروم وارد کنید و DNS های کش شده را ببینید. البته DNS ها بعد از چند دقیقه Expired میشوند.
اگر میخواهید DNS های cache شده در ویندوز را ببینید، در cmd دستور ipconfig /displaydns را وارد کنید.
اگر میخواهید DNS های cache شده از روی سیستم حذف شوند تا مجددا از طریق پرس و جو از DNS Server ها آپدیت شوند، دستور ipconfig /flushdns را برای حذف DNS ها، وارد کنید. 
c:\>ipconfig /displaydns

Windows IP Configuration

    bithub.ir
    ----------------------------------------
    Record Name . . . . . : bithub.ir
    Record Type . . . . . : 1
    Time To Live  . . . . : 7319
    Data Length . . . . . : 4
    Section . . . . . . . : Answer
    A (Host) Record . . . : 185.94.97.202
    

    www.google.com
    ----------------------------------------
    Record Name . . . . . : www.google.com
    Record Type . . . . . : 1
    Time To Live  . . . . : 279
    Data Length . . . . . : 4
    Section . . . . . . . : Answer
    A (Host) Record . . . : 216.58.212.4

###################################################

c:\>ipconfig /flushdns

Windows IP Configuration
Successfully flushed the DNS Resolver Cache.


c:\>ipconfig /displaydns

Windows IP Configuration
Could not display the DNS Resolver Cache.

در سیستم عامل فایلی بنام Hosts وجود دارد که توسط این فایل میتوانید عمل ترجمه ی آدرس سایت به آیپی را خودتان انجام دهید.
یعنی بجای اینکه آیپی یک سایت، در DNS Server ها جستجو شود، میتوانید لیستی از آیپی ها بهمراه نام سایت ایجاد کنید تا از داخل DNS خود سیستم عامل خوانده شود.

فایل hosts در ویندوز داخل مسیر C:\Windows\System32\drivers\etc قرار دارد.

برای ویرایش فایل hosts، میبایست دسترسی administrator داشته باشید.
میتوانید منوی استارت را باز کنید و عبارت notepad را تایپ کنید. روی notepad راست کلیک کنید و گزینه ی Run as administrator را کلیک کنید و در نهایت فایل hosts را از قسمت File > open باز کنید.
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#   127.0.0.1       localhost
#   ::1             localhost
تمام خطوط این فایل با علامت # شروع شده اند و کامنت هستند.

 به این دو خط توجه کنید:

# 127.0.0.1       localhost
#   ::1             localhost

خط اول میگه اگر آدرس localhost وارد شد، آیپی آن 127.0.0.1 میباشد و در خط دوم IPv6 آن آمده است.
آیپی 127.0.0.1 را اصطلاحا loopback address میگویند و یک آیپی رزرو شده است. وقتی درخواستی به این آیپی ارسال میشود، آن درخواست به خود سیستم برمیگردد. بنابراین انتظار نداشته باشید که در موبایلتان آدرس localhost را وارد کنید و ومپ داخل کامپیوتر سرور باز شود. چون localhost به آیپی 127.0.0.1 اشاره میکند، بنابراین درخواست به 127.0.0.1 ارسال میشود و ازآنجایی که این آدرس loopback است، پس درخواست به خود موبایل برمیکردد.

localhost از ویندوز 7 به بعد، توسط DNS ویندوز شناسایی میشود و نیازی نیست آنرا در فایل hosts تعریف کنیم. بهمین علت این خط کامنت شده است.

چند تست هم ما انجام دهیم.
مبخوهام وقتی کلمه ی my را در مرورگر وارد کردم، صفحه ای مانند localhost باز شود.خط زیر را در فایل hosts اضافه میکنم و فایل را سیو میکنم:

127.0.0.1 my
بعد ازینکه فایل را save کردید، میتوانید داخل cmd دستور ipconfig /displaydns را وارد کنید و ببینید my اضافه شده است.

حالا کافیست داخل مرورگر آدرس my/ یا http//my را وارد کنید. دلیل / آخر آدرس یا http:// در اول آدرس اینست که مرورگر کلمه ی my را در گوگل جستجو نکند و به مرورگر بگوییم که این یک آدرس است.

حالا اگر بخواهم با وارد کردن آدرس stackoverflow.com وارد local شود:

127.0.0.1 stackoverflow.com

خط بالا را به انتهای فایل hosts اضافه میکنم و فایل را save میکنم. حالا اگر در مرورگر آدرس stackoverflow.com را وارد کنم، صفحه ی local باز میشود.

برای برگرداندن تغییرات، کافیه خطوطی که اضافه کردید را پاک کنید و مجدداً فایل hosts را ذخیره کنید.

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

سؤال: میتوانم سایت google را با نام دلخواه باز کنم؟ مثلا خط 216.58.212.14 my.com را به hosts اضافه کردم.
پاسخ: خیر. شما میتوانید آیپی یک دامنه را داخل hosts معرفی کنید ولی نباید دامنه ی آنرا تغییر دهید. دلیلش اینه که، باتوجه به خط اضافه شده، درخواست به آیپی 216.58.212.14 ارسال میشه و وب سرور google درخواست رو بررسی میکنه میبینه آدرسی به نام my.com روی سرور وجود نداره، بنابراین خطای The requested URL / was not found on this server. به مرورگر شما ارسال میکنه و به شما نمایش داده میشه.

 

با توضیحاتی که تا اینجا داده شد، میخواهم پوشه ی پروژه هایم را آدرس دهی کنم.
الان در پوشه ی www، پوشه ای بنام project1 دارم. پس اگر میخواهم این پروژه را باز کنم، باید localhost/project1 را در مرورگر وارد کنم.
حالا میخوام با توضیحاتی که در بالا گفته شد، برای این پوشه، آدرسی روی سیستمم درست کنم. مثلا وقتی آدرس project1.com یا project1.local یا p1.localhost و ...(نام فرقی نمیکنه که چی باشه) را در مرورگر وارد کردم، پروژه ی داخل پوشه ی project1 باز شود.

میخواهم آدرس p1.local را set کنم.
وقتی آدرس p1.local را در مرورگر وارد میکنم، باید درخواست به سیستم خودم برگرده:

127.0.0.1 p1.local

خط بالا را به انتهای فایل hosts اضافه میکنم و فایل را save میکنم. حالا ping میگیرم:

c:\>ping p1.local

Pinging p1.local [127.0.0.1] with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

حالا اگر آدرس p1.local/ را در مرورگر، وارد کنم، صفحه ی لوکال، باز میشود. ولی ما میخواهیم، صفحه ی project1 باز شود.
برای اینکار، باید با تنظیمات Virtual Host در آپاچی آشنا شویم.
زمانی که در سرور، میخواهید چندین سایت روی یک آیپی داشته باشید، میتوانید با استفاده از چندین VirtualHost، سایت ها را از هم تفکیک کنید.

 فایل httpd-vhosts.conf را از مسیر c:\wamp64\bin\apache\apache2.4.18\conf\extra باز کنید.

<VirtualHost *:80>
    ServerName p1.local
    DocumentRoot c:/wamp64/www/project1
</VirtualHost>

بلاک VirtualHost را به انتهای فایل، اضافه کنید. فایل httpd-vhosts.conf را save کرده و آپاچی را restart کنید.
حالا اگر در مرورگر، آدرس p1.local/ را وارد کنم، project1 باز خواهد شد.

البته میتوانید این بلاک را به فایل httpd.conf اضافه کنید ولی فرقی نمیکند چون فایل httpd-vhosts.conf در داخل فایل httpd.conf اینکلود شده است.
# Virtual hosts
Include conf/extra/httpd-vhosts.conf

حالا بلاک VirtualHost را بررسی کنیم:
خط اول:

<VirtualHost *:80>

آدرس را وارد مرورگر میکنید، مرورگر درخواست را به آیپی 127.0.0.1:80 ارسال میکند، درخواست به وب سرور میرسد، حالا در تنظیمات آپاچی، بلاک VirtualHost وجود دارد که در این بلاک گفته شده *:80 به معنی تمام آدرس های روی سرور که توسط پورت 80 گوش میدهند.(این آیپی ها قبلا در قسمت Listen پورت هایشان معرفی شده.)
بنابراین درخواست به آیپی 127.0.0.1 آمده است و این آیپی با * و پورت 80 مطابقت دارد، پس وارد بلاک میشود.

خط دوم:

ServerName p1.local

مرورگر، درخواستی را به آیپی 127.0.0.1 ارسال کرده، و در هدر آن درخواست، به آدرس p1.local اشاره شده، بنابراین چون آدرس p1.local با دستور ServerName p1.local مطابقت دارد، در نتیجه با توجه به DocumentRoot پروژه باز خواهد شد.

خط سوم:

DocumentRoot c:/wamp64/www/project1

در دستور بالا، پوشه ی پروژه را مشخص کرده ایم.

فایل httpd-vhosts.conf بعد از افزودن VirtualHost جدید، به شکل زیر درامده است:

#
# Virtual Hosts
#

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot c:/wamp64/www
    <Directory  "c:/wamp64/www/">
        Options +Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName p1.local
    DocumentRoot c:/wamp64/www/project1
</VirtualHost>

ازآنجایی که در بلاک های VirtualHost علامت * آمده و تمام آیپی های روی سرور با این بلاک ها مطابقت خواهند داشت، بنابراین اولین VirtualHost اولویت بالاتری دارد و بعنوان تنظیمات Default شناخته میشود. پس مثلا اگر انتهای فایل hosts خط 127.0.0.1 p1.com را وارد کنیم و آدرس p1.com را در مرورگر وارد کنیم، کدام VirtualHost اجرا خواهد شد؟ با توجه به اینکه هیچ VirtualHost ای برای آدرس p1.com تعریف نشده است، بنابراین VirtualHost اول که  اولویت بالاتری دارد و بعنوان Default شناخته میشود، اجرا خواهد شد.

سؤال: اگر 127.0.0.1 در مرورگر وارد شود، کدام VirtualHost اجرا خواهد شد؟
پاسخ: بازهم VirtualHost اول، اجرا خواهد شد.

سؤال: بعد از تنظیمات بالا، اگر در لپتاپ یا سیستمی دیگر که با این کامپیوتر در یک شبکه قرار دارد، آدرس http://p1.local را وارد کنم، آیا به پوشه ی project1 دسترسی خواهم داشت؟
پاسخ: خیر، آدرس p1.loca اصلا وجود خارجی ندارد و در فایل hosts همان کامپیوتر تعریف شده است. بنابراین وقتی شما در مرورگر سیستمی دیگر http://p1.local را وارد میکنید، مرورگر دنبال آیپی این آدرس میگردد و آدرسی پیدا نمیشود.
همانطور که در جلسه ی قبل گفتم، اگر میخواهید از سیستمی دیگر که در یک شبکه با کامپیوتر سرور قرار دارد، به پروژه دسترسی پیدا کنید، باید آدرس آیپی کامپیوتر سرور را در مرورگر وارد کنید. فرضا اگر کامپیوتر سرور 192.168.1.2 هست، برای باز کردن project1 میبایست 192.168.1.2/project1 را در مرورگر آن سیستم وارد کنید. 
یااینکه میتوانید فایل hosts آن سیستم را باز کنید و خط 192.168.1.2 p1.local را وارد کنید. در نتیجه اگر در آن لپتاپ آدرس http://p1.local را وارد کنید، خواهید دید که project1 در کامپیوتر سرور، باز خواهد شد.

با توجه به تنظیمات VirtualHost که در بالا آوردیم، زمانیکه 192.168.1.2/project1 را وارد میکنیم، VirtualHost اول اجرا میشود.

سؤال: آیا ایجاد VirtualHost روی پروژه های local در سیستم، ضروری است؟
پاسخ: خیر، مثال های بالا برای آموزش مفاهیم VirtualHosts و مدیریت DNS ها بوده. در نتیجه برای تست پروژه هایتان، میتوانید مثل سابق از آدرس های localhost/project-name استفاده کنید.انتخاب با خودتان است.
اما اگر خودتان مدیر سرور بودید، با این آموزش، میتوانید با استفاده از مفاهیم VirtualHost، چندین سایت را روی سرورتان ایجاد کنید و اصطلاحا یک هاست اشتراکی را مدیریت کنید.

یک سری از مطالب و توضیحات بیشتر در مورد تنظیمات وب سرور خواهد ماند، تا در وقت مناسب، آنها را بررسی کنیم.

مطالب سایت را بدون ذکر منبع (http://bithub.ir) در جایی منتشر نکنید. با تیشکر.


مطالب مرتبط

برای ارسال نظر، باید عضو سایت شوید.