آموزش Bind کردن دامنه و IP در Nginx

Nginx (Engine-X) یک وب‌سرور سبک، قدرتمند و پرسرعت است که به دلیل کارایی بالا و قابلیت‌های گسترده، به عنوان یکی از محبوب‌ترین وب‌سرورها در جهان شناخته می‌شود. این وب‌سرور نه تنها برای سرویس‌دهی به محتوای استاتیک، بلکه به عنوان پروکسی معکوس، لود بالانسر (Load Balancer) و پراکسی HTTP کش نیز کاربرد فراوانی دارد. یکی از مهم‌ترین قابلیت‌های Nginx، توانایی **Bind کردن دامنه‌ها به آدرس‌های IP** است که انعطاف‌پذیری بالایی را در مدیریت هاستینگ و مسیریابی درخواست‌ها فراهم می‌کند.

در این مقاله، به بررسی جامع روش‌های مختلف Bind کردن دامنه و IP در Nginx می‌پردازیم. این روش‌ها شامل **IP اشتراکی (Shared IP)**، **IP اختصاصی (Dedicated IP)**، استفاده از **SNI (Server Name Indication)** و **Bind کردن دامنه‌ها به یک پورت مشخص (IP-Port Bind)** هستند. در هر بخش، پیکربندی دقیق و مثال‌های عملی برای هر سناریو ارائه خواهد شد تا بتوانید به بهترین شکل از این قابلیت‌ها در سرور خود بهره‌برداری کنید.


۱. Bind کردن دامنه‌ها با استفاده از Shared IP

در این روش، چندین دامنه از یک آدرس IP مشترک برای میزبانی وب‌سایت‌های خود استفاده می‌کنند. Nginx با بهره‌گیری از دستور server_name در بلاک‌های سرور (Server Blocks)، درخواست‌های ورودی را بر اساس نام دامنه دریافتی از کلاینت، به دایرکتوری و پیکربندی مناسب هدایت می‌کند. این روش برای محیط‌های هاستینگ اشتراکی بسیار رایج و کاربردی است.

server {
    listen 80; # گوش دادن روی پورت 80 برای HTTP
    server_name example1.com www.example1.com; # دامنه‌های مرتبط با این بلاک

    root /var/www/example1; # مسیر ریشه فایل‌های وب‌سایت
    index index.html index.htm; # فایل‌های پیش‌فرض
}

server {
    listen 80;
    server_name example2.com www.example2.com;

    root /var/www/example2;
    index index.html index.htm;
}

نکات مهم:


۲. Bind کردن دامنه به یک IP اختصاصی (Dedicated IP)

در این سناریو، یک آدرس IP منحصر به فرد به یک دامنه خاص اختصاص داده می‌شود. این روش اغلب برای وب‌سایت‌های با ترافیک بسیار بالا، سرویس‌های حیاتی، یا مواردی که نیاز به گواهینامه‌های SSL قدیمی‌تر (که از SNI پشتیبانی نمی‌کردند) دارند، مورد استفاده قرار می‌گیرد. با مشخص کردن آدرس IP در دستور listen، Nginx تنها به درخواست‌هایی که به آن IP خاص ارسال می‌شوند، پاسخ می‌دهد.

server {
    listen 192.168.1.100:80; # گوش دادن روی IP و پورت اختصاصی
    server_name mywebsite.com www.mywebsite.com;

    root /var/www/mywebsite;
    index index.html index.htm;
}

مزایای این روش:


۳. استفاده از SNI (Server Name Indication) برای چندین دامنه با SSL

**SNI** یک افزونه پروتکل TLS است که امکان می‌دهد چندین دامنه با گواهینامه‌های SSL/TLS مختلف روی یک آدرس IP واحد میزبانی شوند. قبل از SNI، هر دامنه با SSL نیاز به یک IP اختصاصی داشت. با SNI، مرورگر نام دامنه مورد نظر را در مرحله دست‌دهی SSL (TLS Handshake) به سرور ارسال می‌کند و Nginx بر اساس آن گواهینامه SSL صحیح را ارائه می‌دهد. این قابلیت به شدت هزینه‌ها و پیچیدگی‌های مرتبط با مدیریت گواهینامه‌ها را کاهش داده است.

server {
    listen 443 ssl http2; # گوش دادن روی پورت 443 برای HTTPS و فعال‌سازی HTTP/2
    server_name example1.com www.example1.com;

    ssl_certificate /etc/nginx/ssl/example1/fullchain.pem; # مسیر گواهینامه SSL
    ssl_certificate_key /etc/nginx/ssl/example1/privkey.pem; # مسیر کلید خصوصی

    root /var/www/example1;
    index index.html index.htm;
}

server {
    listen 443 ssl http2;
    server_name example2.com www.example2.com;

    ssl_certificate /etc/nginx/ssl/example2/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example2/privkey.pem;

    root /var/www/example2;
    index index.html index.htm;
}

نکات کلیدی:


۴. Bind کردن دامنه‌ها به یک IP و پورت مشخص (IP-Port Bind)

در برخی سناریوهای خاص، لازم است که یک دامنه به یک آدرس IP خاص و یک پورت مشخص متصل شود. این روش معمولاً زمانی کاربرد دارد که چندین سرویس یا اپلیکیشن مختلف روی پورت‌های متفاوت یک سرور اجرا می‌شوند و شما می‌خواهید Nginx به عنوان یک پروکسی معکوس، ترافیک را از یک دامنه خاص به یکی از این پورت‌ها هدایت کند.

server {
    listen 192.168.1.100:8080; # گوش دادن روی IP و پورت 8080
    server_name example.com;

    location / {
        proxy_pass http://localhost:3000; # هدایت درخواست‌ها به اپلیکیشن در حال اجرا روی پورت 3000
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

کاربردها:


۵. Bind کردن بی‌نهایت دامنه (Wildcard) به یک IP یکتا

برای سناریوهایی که نیاز به مدیریت تعداد زیادی ساب‌دامین دارید (مانند سرویس‌های SaaS که برای هر کاربر یک ساب‌دامین ایجاد می‌کنند) یا زمانی که می‌خواهید تمامی ساب‌دامین‌های یک دامنه اصلی به یک نقطه خاص هدایت شوند، می‌توانید از Wildcard (*) در دستور server_name استفاده کنید. این قابلیت به Nginx امکان می‌دهد تا هر درخواستی برای ساب‌دامنه‌های یک دامنه خاص را مدیریت کند.

server {
    listen 80;
    server_name *.example.com; # مدیریت تمامی ساب‌دامین‌های example.com

    root /var/www/wildcard_example;
    index index.html index.htm;
}

کاربردهای این روش:


۶. استفاده از یک سرور پیش‌فرض (Default Server) برای درخواست‌های نامشخص

یک سرور پیش‌فرض در Nginx، بلاکی است که تمامی درخواست‌هایی را که با هیچ یک از server_name های تعریف شده در سایر بلاک‌ها مطابقت ندارند، مدیریت می‌کند. این تنظیم برای جلوگیری از نمایش خطاهای ناخواسته به کاربران یا هدایت درخواست‌های مربوط به دامنه‌های ناشناس به یک صفحه خاص (مانند صفحه خطا یا صفحه اصلی سایت) بسیار مفید است. برای تعریف یک سرور پیش‌فرض، از دستور default_server در کنار listen استفاده می‌شود.

server {
    listen 80 default_server; # این بلاک به عنوان سرور پیش‌فرض عمل می‌کند
    server_name _; # نام دامنه "_" به معنای مطابقت با هر نامی است که تعریف نشده

    root /var/www/default_site; # مسیر ریشه برای درخواست‌های پیش‌فرض
    index index.html index.htm;

    # می‌توانید درخواست‌ها را به یک صفحه خاص یا دامنه دیگر هدایت کنید
    # return 444; # بستن اتصال برای درخواست‌های نامشخص
    # return 301 http://www.your-main-site.com; # هدایت به سایت اصلی
}

مزایای سرور پیش‌فرض:


۷. نتیجه‌گیری

Nginx با ارائه قابلیت‌های متنوع و قدرتمند برای Bind کردن دامنه‌ها و IPها، انعطاف‌پذیری بی‌نظیری را در مدیریت وب‌سرورها فراهم می‌کند. با درک صحیح و استفاده مناسب از روش‌های **Shared IP, Dedicated IP, SNI, IP-Port Binding, Wildcard Domains و Default Server**، می‌توانید ساختارهای پیچیده هاستینگ را پیاده‌سازی کرده، عملکرد سرور خود را بهینه‌سازی کنید و امنیت کلی سیستم‌های وب خود را به طور چشمگیری افزایش دهید.

این قابلیت‌ها، Nginx را به ابزاری ضروری برای مدیران سیستم، توسعه‌دهندگان وب و متخصصان امنیت سایبری تبدیل کرده است. با پیکربندی دقیق و منطبق بر نیازهای پروژه، می‌توان به بهترین نتیجه دست یافت.


آموزش تنظیمات Server Block در Nginx

**Server Block**ها (که در Apache با عنوان Virtual Hosts شناخته می‌شوند) فایل‌های پیکربندی در Nginx هستند که به شما امکان می‌دهند چندین وب‌سایت یا دامنه را روی یک سرور واحد مدیریت کنید. هر Server Block شامل دستورالعمل‌هایی است که Nginx را راهنمایی می‌کند تا چگونه درخواست‌های HTTP را برای یک دامنه یا IP خاص پردازش کند.

1. ساخت یک Server Block پایه

برای شروع، یک فایل پیکربندی جدید برای دامنه خود ایجاد کنید. مسیر استاندارد برای این فایل‌ها /etc/nginx/sites-available/ است. نام فایل را معمولاً با نام دامنه مورد نظر (مثلاً example.com) انتخاب می‌کنند.

sudo nano /etc/nginx/sites-available/example.com

سپس، پیکربندی زیر را در فایل وارد کنید. این یک Server Block پایه برای یک وب‌سایت استاتیک است:

server {
    listen 80; # Nginx روی پورت 80 گوش می‌دهد
    listen [::]:80; # پشتیبانی از IPv6

    server_name example.com www.example.com; # نام دامنه‌هایی که این بلاک مدیریت می‌کند

    root /var/www/example.com; # مسیر ریشه فایل‌های وب‌سایت شما
    index index.html index.htm index.php; # ترتیب فایل‌های پیش‌فرض برای نمایش

    location / {
        try_files $uri $uri/ =404; # تلاش برای یافتن فایل یا دایرکتوری، در غیر این صورت 404
    }

    # بلاک برای مدیریت فایل‌های PHP (در صورت نیاز)
    # location ~ \.php$ {
    #    include snippets/fastcgi-php.conf;
    #    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # مسیر سوکت PHP-FPM
    # }

    # بلاک برای جلوگیری از دسترسی به فایل‌های مخفی (مانند .htaccess)
    location ~ /\.ht {
        deny all;
    }
}

**توضیح دستورات:**

2. فعال‌سازی Server Block

پس از ذخیره فایل پیکربندی، برای فعال‌سازی آن، باید یک لینک نمادین (symbolic link) از فایل موجود در sites-available به پوشه sites-enabled ایجاد کنید. Nginx تنها فایل‌های موجود در sites-enabled را بارگذاری می‌کند.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

سپس، برای اطمینان از صحت پیکربندی، Nginx را تست کنید و در صورت عدم وجود خطا، آن را ری‌استارت کنید تا تغییرات اعمال شوند:

sudo nginx -t # بررسی صحت پیکربندی
sudo systemctl restart nginx # ری‌استارت سرویس Nginx

3. تنظیمات برای چندین دامنه (Virtual Hosting)

برای میزبانی چندین دامنه روی یک سرور، کافی است برای هر دامنه یک Server Block جداگانه ایجاد کنید. این کار به Nginx اجازه می‌دهد تا هر دامنه را به ریشه وب‌سایت مربوط به خودش هدایت کند.

# فایل /etc/nginx/sites-available/domain1.com
server {
    listen 80;
    server_name domain1.com www.domain1.com;
    root /var/www/domain1.com;
    index index.html;
}

# فایل /etc/nginx/sites-available/domain2.com
server {
    listen 80;
    server_name domain2.com www.domain2.com;
    root /var/www/domain2.com;
    index index.html;
}

پس از ایجاد هر فایل، لینک نمادین آن را در sites-enabled ایجاد کرده و Nginx را ری‌استارت کنید.

4. استفاده از SSL و HTTPS (Secure Server Block)

برای فعال‌سازی HTTPS و استفاده از گواهینامه‌های SSL، باید یک Server Block جدید برای پورت 443 (HTTPS) ایجاد کرده و مسیر گواهینامه‌ها را مشخص کنید. همچنین، بهتر است تمام ترافیک HTTP را به HTTPS هدایت کنید.

# هدایت HTTP به HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri; # هدایت دائمی به HTTPS
}

# Server Block برای HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # مسیر fullchain گواهینامه
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # مسیر کلید خصوصی

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2 TLSv1.3; # پروتکل‌های SSL توصیه شده
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; # الگوریتم‌های رمزنگاری امن

    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

**نکات SSL:**

5. تنظیمات پیشرفته با Load Balancing (توزیع بار)

Nginx می‌تواند به عنوان یک Load Balancer عمل کند و ترافیک ورودی را بین چندین سرور بک‌اند توزیع کند. این کار باعث افزایش قابلیت اطمینان، مقیاس‌پذیری و عملکرد سرویس شما می‌شود.

upstream backend_servers {
    server 192.168.1.101 weight=5; # سرور با وزن 5 (دریافت 5 برابر ترافیک بیشتر)
    server 192.168.1.102;
    server 192.168.1.103 backup; # سرور پشتیبان
    server 192.168.1.104 down; # سرور غیرفعال
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers; # هدایت درخواست‌ها به گروه سرورهای تعریف شده
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

**توضیحات Load Balancing:**

نتیجه‌گیری

Server Blockها قلب تپنده پیکربندی Nginx هستند و درک کامل آن‌ها برای هر مدیر سیستم یا توسعه‌دهنده‌ای که با Nginx کار می‌کند، ضروری است. با استفاده صحیح از Server Blockها، می‌توانید به راحتی چندین دامنه را مدیریت کرده، امنیت وب‌سایت‌های خود را با HTTPS افزایش داده، و با پیاده‌سازی Load Balancing، عملکرد و پایداری سرویس‌های خود را بهینه‌سازی کنید. همواره پس از هر تغییر در پیکربندی، از دستور sudo nginx -t برای بررسی خطاها استفاده کرده و سپس سرویس Nginx را ری‌استارت کنید.