DevOps and Infrastructure

تسلط بر Nginx: راهنمای جامع پیکربندی برای زیرساخت‌های مدرن

در منظر زیرساخت وب مدرن، Nginx به عنوان یک غول ایستاده است. این سرور که در ابتدا برای حل مشکل C10K ایجاد شد، اکنون به یک سرور HTTP با عملکرد بالا، پروکسی معکوس و تعادل‌دهنده بار تبدیل شده است که توسط برخی از بزرگ‌ترین وب‌سایت‌های اینترنت مورد اعتماد قرار دارد. برای مهندسان DevOps و مدیران سیستم، تسلط بر Nginx تنها به معنای روشن نگه داشتن یک سرویس نیست؛ بلکه بهینه‌سازی پهنای باند، تضمین امنیت و مدیریت کارآمد منطق مسیریابی پیچیده است. این راهنما به عمق اجزای اصلی یک پیکربندی Nginx مستحکم می‌پردازد و فراتر از مقدمات، بینش‌های عملیاتی را برای کاربران متوسط تا پیشرفته ارائه می‌دهد.

ساختاردهی پیکربندی شما: فایل‌ها در مقابل بلوک‌ها

یک اشتباه رایج برای مبتدیان، نگهداری یک فایل nginx.conf تکی و بزرگ است. با مقیاس‌پذیر شدن زیرساخت شما، این روش غیرقابل مدیریت می‌شود. رویکرد توصیه شده این است که فایل اصلی nginx.conf را به حداقل و ماژولار نگه دارید. از دستور include برای جداسازی بلوک‌های سرور، انواع MIME و سربرگ‌های امنیتی در فایل‌های جداگانه استفاده کنید. این جداسازی نگرانی‌ها، اشکال‌زدایی را ساده کرده و کنترل نسخه برای زیرساخت به عنوان کد (IaC) را بسیار تمیزتر می‌کند.

برای مثال، در پیکربندی اصلی خود، ممکن است فایل‌های میزبان مجازی خود را به سادگی شامل کنید:


# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # تنظیمات اصلی لاگ و عملکرد
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # شامل پیکربندی‌های خاص سرور
    include /etc/nginx/conf.d/*.conf;
}

بلوک‌های سرور و میزبان‌های مجازی

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

یک پیکربندی معمول برای یک برنامه Node.js که پشت یک پروکسی معکوس اجرا می‌شود را در نظر بگیرید:


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

server {
    listen 443 ssl http2;
    server_name example.com;
    
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    
    root /var/www/html;
    index index.html;

    location / {
        proxy_pass http://localhost: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;
    }
}

اهمیت سربرگ‌های پروکسی را در نظر بگیرید. هنگامی که به عنوان یک پروکسی معکوس عمل می‌کند، Nginx بیشتر سربرگ‌های HTTP را حذف می‌کند. ارسال X-Real-IP و X-Forwarded-For تضمین می‌کند که برنامه بک‌اند شما می‌تواند آدرس IP اصلی مشتری را شناسایی کند که برای لاگ‌نویسی و هدف‌گیری جغرافیایی حیاتی است.

بهینه‌سازی عملکرد: کش و فشرده‌سازی

بهینه‌سازی عملکرد در Nginx عمدتاً حول کاهش اندازه پیکربندی و حداقل‌سازی سفرهای رفت و برگشت به بک‌اند می‌چرخد. فعال‌سازی فشرده‌سازی gzip یا Brotli برای محتوای مبتنی بر متن مانند HTML، CSS و JavaScript ضروری است. علاوه بر این، پیاده‌سازی کش پروکسی می‌تواند بار را بر روی سرورهای بالادستی به طور چشمگیری کاهش دهد.


# فعال‌سازی فشرده‌سازی gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml;

# تعریف یک منطقه کش
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;

location /api/ {
    proxy_cache my_cache;
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
    proxy_pass http://backend_servers;
}

نتیجه‌گیری

Nginx یک ابزار قدرتمند است که هنگام پیکربندی صحیح، می‌تواند دارایی‌های استاتیک را با سرعتی خیره‌کننده سرو کند و همزمان درخواست‌های محتوای پویا را به هوشمندی مدیریت نماید. با اتخاذ یک ساختار پیکربندی ماژولار، پیاده‌سازی تنظیمات امنیتی SSL/TLS و تنظیم پارامترهای عملکردی مانند کش و فشرده‌سازی، می‌توانید یک زیرساخت وب مقاوم و کارآمد بسازید. به یاد داشته باشید که همیشه قبل از بارگذاری مجدد، پیکربندی خود را با nginx -t آزمایش کنید و در طول استقرارهای اولیه، لاگ‌های خود را به دقت نظارت کنید تا هرگونه ناهنجاری را در مراحل اولیه شناسایی نمایید.

Share: