آموزش 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;
}
نکات مهم:
- این روش عمدتاً برای ترافیک HTTP (پورت 80) کاربرد دارد.
- برای استفاده از SSL (HTTPS) با IP اشتراکی، حتماً باید از قابلیت **SNI** استفاده شود.
- هر بلاک
serverمسئول مدیریت درخواستهای یک یا چند دامنه خاص است.
۲. 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;
}
مزایای این روش:
- **عملکرد بهتر:** در برخی موارد، میتواند منجر به عملکرد کمی بهتر شود زیرا Nginx نیازی به تحلیل
server_nameبرای مسیریابی اولیه ندارد. - **سازگاری با SSL قدیمی:** برای سیستمهایی که از SNI پشتیبانی نمیکنند (بسیار نادر در حال حاضر)، استفاده از IP اختصاصی برای هر گواهینامه SSL ضروری است.
- **کنترل بیشتر:** امکان تفکیک کامل ترافیک و منابع برای هر دامنه.
۳. استفاده از 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;
}
نکات کلیدی:
- اکثر مرورگرهای مدرن و سیستمعاملها از SNI پشتیبانی میکنند.
- امکان استفاده از یک IP واحد برای صدها وبسایت با SSL/TLS.
- ضروری برای پیادهسازی هاستینگ اشتراکی با HTTPS.
http2برای فعالسازی پروتکل HTTP/2 توصیه میشود.
۴. 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;
}
}
کاربردها:
- پروکسی کردن درخواستها به سرویسهای بکاند (مانند Node.js، Django، Spring Boot) که روی پورتهای غیر از 80 یا 443 اجرا میشوند.
- میزبانی چندین اپلیکیشن روی یک سرور با پورتهای متمایز.
۵. 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;
}
کاربردهای این روش:
- هاستینگ پلتفرمهای چندکاربره (Multi-tenant) با سابدامینهای دینامیک.
- سیستمهای مدیریت محتوا (CMS) که از سابدامینها برای سایتهای مختلف استفاده میکنند.
- کاهش پیچیدگی پیکربندی Nginx برای دامنههای متعدد.
۶. استفاده از یک سرور پیشفرض (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 را به ابزاری ضروری برای مدیران سیستم، توسعهدهندگان وب و متخصصان امنیت سایبری تبدیل کرده است. با پیکربندی دقیق و منطبق بر نیازهای پروژه، میتوان به بهترین نتیجه دست یافت.