وب سرورانجنیکس

آموزش تنظیم Virtual Hosts برای Nginx در CentOS

مقدمه

Nginx یکی از معروف ترین وب سرور ها در بین متخصصین حوزه IT می باشد. همانطور که در پست های پیشین نیز این وب سرور معرفی شد. انجین ایکس در بسیاری از سایت ها و کمپانی ها در حال استفاده می باشد. این وب سرور در بسیاری از نقاط سبکتر و بهتر از وب سرور آپاچی بوده و میتوانید بصورت Reverse Proxy نیز مورد استفاده قرار بگیرد. Nginx برای مدیریت دامنه و سایت ها از Server Block استفاده می کند. بلاک سرور با استفاده از سیستم تطابق (Matching System) جهت میزبانی دامنه استفاده می شود.

هر دامنه می تواند طوری تنظیم شود تا بازدید کننده را به دایرکتوری مورد نظر هدایت کند. این متد می تواند برای تعداد نامحدودی وابسته به میزان قدرت سرور شما دامنه را میزبانی کند. با این روش شما می توانید تنظیمات مورد نظر خود را روی هر دامنه بطور مجزا پیاده سازی نمایید.در این مقاله در مورد ایجاد Server Blocks در پلتفرم لینوکس توضیع CentOS بحث خواهد شد که علاوه بر این نحوه ارائه محتوای مختلف به کاربران مختلف با توجه به نوع دامنه را خواهید آموخت.

پیش نیازها

در ابتدا یک سرور مجازی با IP استاتیک و یا لوکال با سیستم عامل CentOS ایجاد نمایید. قبل از شروع آموزش باید چند مرحله را جهت آماده سازی سرور برای ایجاد تغییرات انجام دهید. در ابتدا نیاز است تا به سرور خود از طریق یک کاربر غیر root با دسترسی sudo داشته باشید. در صورت نصب نبودن Nginx باید آن را نصب نمایید. هرچند نصب این وب سرور در ادامه مقاله بصورت Short Referance آموزش داده می شود اما در مقالات پیشین نیز نصب Nginx بطور کامل آموزش داده شده است.

بیشتر بخوانید: آموزش نصب nginx در CentOS

برای نصب از طریق SSH به سرور خود متصل شوید. در ابتدا باید مخزن NGINX را به لیست نرم افزاری CentOS اضافه نمایید:

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

سپس به راحتی با دستور زیر این وب سرور نصب خواهد شد:

sudo yum install nginx

پس از پایان نصب به یوزر ایجاد شده که دسترسی های sudo به آن داده شده است وارد شده و ادامه آموزش را با استفاده از Sudo User خود انجام دهید.

توجه: در این آموزش از دامنه domain1.com و domain2.com جهت پیاده سازی مثال ها استفاده می کند. این دامنه ها فقط برای پیاده سازی مثال ها در آموزش استفاده می شود و برای یک سناریو واقعی باید دامنه خود را جایگرین دامنه ها نمایید. برای داشتن تنظیمات DNS استندارد باید سرویس Bind در سرور شما نصب و کانفیگ شود تا دامنه شما NS های اختصاصی خود را جهت اتصال به سرور داشته باشد. پس از راه اندازی سرویس Bind دامنه شما به سرور متصل و از طریق Virtual Host یا همان Server blocks به دایرکتوری دلخواه دسترسی خواهند داشت. البته بدون راه اندازی سروی bind نیز می توانید این عملیات را انجام دهید هرچند کیفیت کار و قابلیت آن کمتر خواهد بود.

مرحله اول – ایجاد دایرکتوری محتوا برای دامنه

در ابتدا نیاز است تا دایرکتوری های مورد نیاز برای قرار دادن محتوای دو سایت مورد نظر ما ساخته شود. شاخه مربوط به ریشه را (Root Document) در سطح بالای دایرکتوری محتوا یعنی در ادرس var/www/ قرار می دهیم. ما برای هر بلاک سرور در داخل دایرکتوری ذکر شده یک دایرکتوری محتوا خواهیم ساخت. در داخل دایرکتوری هر دامنه یک دایرکتوری html نیز خواهیم ساخت تا فایل ها در آن قرار داده شود. این عمل در صورت ایجاد میزبانی قابلیت های دیگری نیز در اعمال سیاست های امنیتی و دسترسی در اختیار ما قرار خواهد شد.

با استفاده از دستور mkdir می توانید دایرکتوری های مورد نیاز خود را ایجاد نمایید.(سوییچ p- آدرس ساخت دایرکتوری را بررسی کرده و در صورت عدم وجود پوشه آن را ایجاد خواهد کرد. این قابلت امکان ساخت دایرکتوری های تودرتو را فراهم می کند) برای ساخت دایرکتوری برای دامنه های مورد نظر دستورات زیر را در محیط ترمینال ssh وارد نمایید:

sudo mkdir -p /var/www/domain1.com/html
sudo mkdir -p /var/www/domain2.com/html

در خاطر داشته باشید نام های domain1.com و domain2.com نام دامنه هایی است که میخوایم در سرور میزبانی شود. این نام ها می تواند به سلیقه شما نیز انتخاب شود و فقط بخاطر خوانایی به این شکل انتخاب شود.

تغییر مالکیت فایل و پوشه های دایرکتوری var/html/

پس از ایجاد دایرکتوری باید به پوشه های ایجاد شده دسترسی کاربر مورد نظر را بدهیم. دایرکتوری var/www/ چون توسط یوزر root ایجاد شده است در مالکیت کاربر root می باشد. برای ایجاد دسترسی باید مالکیت فایل ها تغییر یابد در غیر این صورت با ارور ۴۰۳ یا عدم داشتن مجوز دسترسی رو به رو خواهد شد. با استفاده از دستور chown مالکیت فایل ها را با دستور زیر تغییر میدهم:

sudo chown -R USER:USER /var/www/domain1.com/html
sudo chown -R USER:USER /var/www/domain2.com/html

بجای متغییر USER در دستورات بالا نام کاربر sudo که از قبل ایجاد کرده اید و هم اکنون نیز در آن وارد شده اید را وارد نمایید. با اجرای دستورات بالا نام کاربری مورد نظر ما مالک تمامی دایرکتوری public_html خواهد شد. دسترسی استاندارد برای پوشه ها در هاستینگ ۷۵۵ می باشد. برای تغییر دسترسی پوشه ریشه و ساب دایرکتوری ها دستور زیر را وارد نمایید:

sudo chmod -R 755 /var/www

وب سرور باید برای ارائه محتوا به بازدیدکننده و یوزر شما باید جهت ایجاد و یا تغییر محتوا دسترسی های لازم را داشته باشد که با وارد کردن دستورات بالا این مجوز صادر خواهد شد.

مرحله دوم – ایجاد صفحه دمو برای هر سایت

پس ایجاد دایرکتوری بیاید تا صفحاتی را برای ارائه ایجاد نماییم، البته صفحات برای تست بوده و از کد ساده برای ایجاد این page ها استفاده می کنیم. برای domain1.com یک فایل index.html ایجاد نمایید. برای این منظور دستور زیر را در ssh وارد نمایید:

vi /var/www/domain1.com/html/index.html

پس از باز کردن یک فایل جدید حرف i را بزنید تا ادیتور به حالت insert وارد شود تا بتوانید کد را در آن وارد نمایید (میتوانید کد را copy و در آن paste کنید) سپس کد Html زیر را در آن وارد نمایید تا دامنه domain1.com را نمایش دهید:`

<html>
  <head>
    <title>Welcome to Domain1.com!</title>
  </head>
  <body>
    <h1>Success! The domain1.com server block is working!</h1>
  </body>
</html>

پس از وارد کردن کد کلید esc و : را وارد کرده سپس حرف x را زده و کلید Enter را بزنید تا تغییرات ذخیره گردد. برای سایت domain2.com نیز می توانید به راحتی فایل ایجاد شده را در آن کپی کرده و آن را ویرایش نمایید. برای کپی فایل ایجاد شده دستور زیر را در محیط شل وارد نمایید:

سپس فایل html مربوط به domain2.com را باز کرده:

vi /var/www/domain2.com/html/index.html

و با استفاده از راهنمای بالا فایل را ویرایش و domain1.com را به domain2.com تبدیل نمایید تا مانند کد زیر گردد:

<html>
  <head>
    <title>Welcome to Domain2.com!</title>
  </head>
  <body>
    <h1>Success! The domain2.com server block is working!</h1>
  </body>
</html>

توجه داشته باشید برای ویرایش فایل در لینوکس می توانید از ادیتور های متنی دلخواه مانند nano نیز استفاده نمایید. پس از ویرایش فایل html را ذخیره نمایید.

مرحله سوم – ایجاد Server Block یا همان بلاک سرور جدید

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

برای شروع باید دایرکتوری که بلاک های سرور در آن ساخته می شود را ایجاد نماییم. دایرکتوری sites-available فایل های بلاک سرور را نگه داری کرده و دایرکتوری sites-enabled نیز لینک بلاک های سرور که قرار است منتشر شود را نگهداری می کند. جهت ایجاد دایرکتوری های مورد نیاز کافیست دستورات زیر را خط به خط در محیط shell اجرا نمایید:

sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled

توجه: در نظر داشته باشید این معماری در نظر گرفته شده برای ایجاد دایرکتوری در توضیع های Debian استفاده می شود که به دلیل Maintenance و نگهداری آسانتر ما نیز در این مقاله از این روش استفاده می کنیم.

در قدم بعدی باید به nginx بگویید تا برای فراخوانی سرور بلاک ها دایرکتوری site-enabled را جستجو کنید. برای این منظور باید فایل تنظیمات اصلی nginx را باز کرده:

sudo vi /etc/nginx/nginx.conf

و خطوط زیر را به انتهای بلاک {} http اضافه کنید:

include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;

خط اول مشخص می کند که nginx باید برای بلاک سرور دایرکتوری site-enabled را جستجو کند و خط دوم نیز میزان فضای حافظه جهت parse کردن دامنه را افزایش می دهد. پس از انجام تغییرات بالا فایل تنظیمات را ذخیره نمایید. حالا وب سرور اماده شده و زمان ان است تا فایل سرور بلاک را ایجاد نماییم.

ایحاد فایل بلاک سرور

بصورت پیشفرض nginx از بلاک سرور پیشفرض به نام default.conf استفاده می کند که میتوانیم به عنوان بلاک نمونه ما نیز از آن استفاده نماییم. برای ایجاد اولین فایل بلاک سرور فایل default.conf را به دایرکتوری site-available کپی می کنیم:

sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/sites-available/domain1.com.conf

تذکر: تمامی فایل های تنظیمات باید پسوند conf. داشته باشد.

با صرف نظر از خطوطی که غیر فعال یا اصطلاحا Comment شده بلاک ایجاد شده شامل خطوط زیر است:

server {
    listen  80;
    server_name localhost;
 
    location / {
        root  /usr/share/nginx/html;
        index  index.html index.htm;
    }
 
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root  /usr/share/nginx/html;
    }
}

در ابتدا یک نگاه کوتاه به کد کانفیگ بالا داشته باشید. اولین چیزی که باید تغییر داده شود متغیر server_name می باشد که به nginx می گوید کدام درخواست های سمت سرور به دامنه مشخص شده هدایت شود. برای دامنه مورد نظر ما باید ادرس را هم بصورت domain1.com و هم www.domain1.com را برای server_name مشخص کنیم تا درخواست های ارسال شده از این دامنه هم با www و هم بدون www به بلاک این دامنه ارسال شود، بنا بر این localhost را برداشته و آن را بصورت زیر ویرایش می کنیم:

server_name domain1.com www.domain1.com;

تذکر: هر دستور در nginx باید تا ; تمام شود، پس اگر زمانی با مشکل مواجه شدید کد های خود را برسی کنید تا با ; تمام شده باشد.

پس از تنظیم server_name باید به سراغ تنظیم root document برویم! (مفهوم root document با یوزر root در لینوکس متفاوت است) root document یا همان ریشه محتوا مسیری است که دامنه زمان فراخوانی شدن توسط کاربر آن را به کاربر نمایش می دهد. در کد بلاک سرور نام این متغییر که باید آدرس بگیرد root می باشد. برای این منظور ما آدرس مورد نظر خود را برای دامنه domain1.com مشخص می کنیم. متغیر root را بصورت زیر ویرایش کنید:

root /var/www/domain1.com/html;

متغیر try_files مانند متغیر های بالا در کد بصورت پیشفرض وجود ندارد و به این دلیل به کد اضافه می شود تا زمانی که کاربر درخواست فایل و یا صفحه ای که وجود ندارد را به دامنه فرستاد این درخواست را با ارور ۴۰۴ پاسخ دهید. برای این منظور کد زیر را نیز به فایل کانفیگ بلاک سرور اضافه می کنیم:

try_files $uri $uri/ =404;

در انتها کد فایل کانفیگ ما بصورت زیر خواهد بود:

server {
    listen  80;
 
    server_name domain1.com www.domain1.com;
 
    location / {
        root  /var/www/domain1.com/html;
        index  index.html index.htm;
        try_files $uri $uri/ =404;
    }
 
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root  /usr/share/nginx/html;
    }
}

پس از ویرایش و ایجاد تغییرات لازم فایل کانفیگ را ذخیره و از ادیتور خارج شود. برای ایجاد دومین فایل کانفیگ نیز می توانید فایل ایجاد شده را کپی کرده و مغییر دامنه و root document را ویرایش نمایید:

sudo cp /etc/nginx/sites-available/domain1.com.conf /etc/nginx/sites-available/domain2.com.conf

فایل کپی شده را با ویرایشگر باز کنید:

sudo vi /etc/nginx/sites-available/domain2.com.conf

سپس تغییرات لازم را در آن ایجاد کنید، فایل domain2.com.conf نیز بصورت زیر خواهد شد:

server {
    listen  80;
 
    server_name domain2.com www.domain2.com;
 
    location / {
        root  /var/www/domain2.com/html;
        index  index.html index.htm;
        try_files $uri $uri/ =404;
    }
 
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root  /usr/share/nginx/html;
    }
}

زمانی که تغییرات لازم را ایجاد کردید فایل را ذخیره و از آن خارج شود.

مرحله چهارم – فعال کردن بلاک های سرور ایجاد شده

برای فعال کردن بلاک های سرور ایجاد شده باید ان را فعال کنید تا nginx ان را به بازدید کننده نمایش دهد. برای فعال سازی بلاک سرور کافیست تا با دستور ln یک لینک دسترسی در دایرکتوری sites-enabled ایجاد نمایید. برای ایجاد لینک برای هر سرور بلاک دستورات زیر را وارد نمایید:

sudo ln -s /etc/nginx/sites-available/domain1.com.conf /etc/nginx/sites-enabled/domain1.com.conf
sudo ln -s /etc/nginx/sites-available/domain2.com.conf /etc/nginx/sites-enabled/domain2.com.conf

دستور بالا یک soft link برای هر سرور بلاک در دایرکتوری sites-enabled ایجاد میکند. زمانی که تغییرات را اعمال کردید باید وب سرور را ریستارت کنید تا تغییرات اعمال شود:

sudo systemctl restart nginx

مرحله پنجم – تنظیم فایل Local Hosts

انجام این مرحله دلخواه می باشد! اگر از دامنه های غیر معتبر استفاده می کنید و فقط برای یادگیری و تست این عملیات را انجام می دهید می توانید از دامنه های دلخواه استفاده نمایید، اما باید این مرحله را نیز انجام دهید تا دامنه های انتخابی شما بصورت Local فراخوانی شود. برای این منظور باید فایل hosts را ویرایش کرده و مشخص کنید دامنه های مورد نظر شما از IP سرور شما لود شود(این راه فقط برای تست و تمرین کارآمد می باشد و دامنه های مشخص شده به شکل زیر فقط بصورت لوکال در دسترس می باشد). برای این منظور فایل hosts را با ویرایشگر متنی باز می کنیم:

sudo vi /etc/hosts

پس از باز کردن فایل مورد نظر تغییرات زیر را در آن اعمال نمایید:

۱۲۷.۰.۰.۱   localhost
۱۲۷.۰.۱.۱   guest-desktop
server_ip_address domain1.com
server_ip_address domain2.com

توجه داشته باشید باید server_ip_address را حذف و IP سرور خود را وارد نمایید. اگر از VM در VMware و یا یک VPS با IP معتبر استفاده می کنید می توانید IP خود را با وارد کردن دستور ifconfig ببینید. برای نمونه فایل hosts پس از ویرایش بصورت زیر خواهد بود:

۱۲۷.۰.۰.۱   localhost
۱۲۷.۰.۱.۱   guest-desktop
۱۹۲.۱۶۸.۰.۵ domain1.com
۱۹۲.۱۶۸.۰.۶ domain2.com

همانطور که گفته شد این تنظیمات درخواست های دامنه domain1.com و domain2.com را به IP لوکال جهت برسی ارسال می کند.

مرحله ششم – تست

در این مرحله تمامی تنظیمات مورد نظر ما انجام داده شده و برای تست کافیست نام دامنه های ایجاد شده را در مرورگر وارد نمایید اگر با متن زیر مواجه شدید یعنی تمامی مراحل به درستی انجام شده است:

پس از تست دامنه domain1.com دامنه domain2.com را نیز تست کنید اگر این آدرس نیز درست بود شما مراحل را به درستی انجام داده اید.

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

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

سعید یاوری

فعال در حوزه شبکه و امنیت DevSecOps

دیدگاهتان را بنویسید

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

نوشته های مشابه

دکمه بازگشت به بالا