بهینه‌سازی Nginx برای سایت‌های پرترافیک

بهینه‌سازی Nginx برای سایت‌های پرترافیک (High Traffic)

Nginx یک وب‌سرور قدرتمند و High-Performance است که به‌خاطر مدیریت عالی اتصال‌های هم‌زمان (Concurrent Connections) انتخاب محبوبی برای سایت‌های پرترافیک محسوب می‌شود.
اگر Nginx را درست تنظیم کنید، زمان پاسخ کاهش پیدا می‌کند، مصرف منابع منطقی‌تر می‌شود و سایت در ترافیک بالا پایدارتر می‌ماند.

پیشنهاد پارس آپتایم:
اگر روی هاست اشتراکی هستید و ترافیک شما رشد کرده، مهاجرت به سرور مجازی معمولاً بیشترین اثر را روی پایداری و سرعت دارد.
برای شروع، صفحه سرور مجازی لینوکس ایران را هم ببینید.

پیش‌نیازها

  • یک سیستم‌عامل Linux روی سرور اختصاصی یا KVM VPS (مثلاً Ubuntu/Debian یا AlmaLinux/Rocky).
  • آشنایی پایه با دستورات Linux.
  • دسترسی sudo برای اعمال تغییرات.

اگر به هاست نیاز دارید، صفحه هاست لینوکس ایران یا راهنمای هاست لینوکس چیست؟ می‌تواند انتخاب را ساده‌تر کند.

گام 1) آپدیت‌کردن Nginx به آخرین نسخه

آپدیت نگه‌داشتن Nginx یعنی استفاده از بهبودهای Performance، قابلیت‌های جدید و Security Patchها.
(نکته فنی: در بعضی توزیع‌ها، مخزن پیش‌فرض همیشه «آخرین Mainline» نیست؛ اما برای اکثر سناریوها کافی است.)

# Ubuntu/Debian
sudo apt update
sudo apt install nginx

# RHEL/AlmaLinux/Rocky Linux
sudo dnf update
sudo dnf install nginx

# بررسی نسخه
nginx -v

گام 2) تنظیم Workerها و تعداد Connectionها

Nginx برای مدیریت اتصال‌های ورودی از worker process استفاده می‌کند.

یک قاعده مهم: سقف اتصال‌های هم‌زمان تقریباً برابر است با worker_processes × worker_connections (به‌شرط کافی بودن ulimit و منابع سیستم).

فایل کانفیگ اصلی را باز کنید:

/etc/nginx/nginx.conf

sudo nano /etc/nginx/nginx.conf

نمونه تنظیم پیشنهادی (قابل تنظیم بر اساس منابع و ترافیک):

# بهتر است روی auto باشد
worker_processes auto;

# اگر ترافیک بالاست، 1024 معمولاً کم است (بسته به RAM/CPU/نوع اپ)
events {
    worker_connections 4096;
    multi_accept on;
}

# (پیشنهاد تکمیلی برای ترافیک بالا)
worker_rlimit_nofile 200000;
اصلاح فنی مهم:
بالا بردن worker_connections بدون افزایش Limit فایل‌ها، اثر کامل ندارد.
معمولاً باید Limit بازبودن فایل‌ها/سوکت‌ها را هم افزایش دهید (مثلاً ulimit یا systemd LimitNOFILE) که در گام تکمیلی پایین‌تر آمده است.

گام 3) فعال‌سازی Gzip برای کاهش حجم پاسخ‌ها

Gzip حجم داده ارسالی را کم می‌کند و معمولاً باعث کاهش زمان Load و مصرف Bandwidth می‌شود.
تنظیمات را داخل بلاک http قرار دهید:

http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_min_length 256;
    gzip_comp_level 5;

    gzip_types
      text/plain
      text/css
      application/json
      application/javascript
      text/xml
      application/xml
      application/xml+rss
      text/javascript;
}

نکته: gzip_comp_level بین 1 تا 9 است؛ عدد بالاتر Compression بهتر ولی CPU بیشتر.

گام 4) Cache مرورگر برای فایل‌های استاتیک

برای فایل‌های استاتیک مثل CSS/JS و تصاویر، Cache مرورگر باعث کاهش فشار روی سرور و سریع‌تر شدن لود صفحات می‌شود.
این تنظیم را داخل server { … } بگذارید:

location ~* \.(?:jpg|jpeg|png|gif|ico|css|js|webp|svg|woff|woff2|ttf)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    access_log off;
}

گام 5) بهینه‌سازی Bufferها و Timeoutها

این بخش کمک می‌کند اتصال‌های بیشتری را با مصرف RAM منطقی مدیریت کنید و جلوی گیرکردن Connectionهای کند را بگیرید.
نمونه تنظیم داخل بلاک http:

http {
    client_body_buffer_size 16k;
    client_max_body_size 8m;

    client_header_buffer_size 1k;
    large_client_header_buffers 4 16k;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 65;
    keepalive_requests 1000;

    client_header_timeout 10s;
    client_body_timeout 10s;
    send_timeout 10s;

    types_hash_max_size 2048;
}

گام 6) پیاده‌سازی Load Balancing

اگر چند سرور Backend دارید، Nginx می‌تواند ترافیک را بین آن‌ها توزیع کند تا هم Performance بهتر شود هم Redundancy داشته باشید.

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;

        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;
    }
}

گام 7) فعال‌سازی Cache سمت Nginx (Proxy Cache / FastCGI Cache)

اصلاح فنی:
متنی که معمولاً با عنوان «Connection Caching» نوشته می‌شود، در عمل اینجا «Response Caching» است (یعنی Cache پاسخ‌ها).
برای PHP-FPM بهتر است از fastcgi_cache استفاده شود؛ برای Reverse Proxy هم proxy_cache.

نمونه Proxy Cache (داخل http و سپس server/location):

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    server {
        location / {
            proxy_cache my_cache;
            proxy_cache_valid 200 1h;
            proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

            proxy_pass http://backend;
        }
    }
}

نمونه FastCGI Cache برای PHP-FPM (اگر سایت PHP دارید):

http {
    fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=phpcache:100m inactive=60m max_size=2g;

    server {
        location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass unix:/run/php/php-fpm.sock;

            fastcgi_cache phpcache;
            fastcgi_cache_valid 200 30m;
            fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;

            add_header X-FastCGI-Cache $upstream_cache_status;
        }
    }
}

گام 8) تنظیمات امنیتی برای کاهش فشار و مقابله با Abuse/DDoS

محدودسازی نرخ درخواست‌ها (Rate Limiting) و تعداد اتصال‌ها (Connection Limiting) می‌تواند جلوی فشار غیرعادی را بگیرد.
نمونه (داخل http و سپس server/location):

http {
    # Rate limiting
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    # Connection limiting
    limit_conn_zone $binary_remote_addr zone=connlimit:10m;

    server {
        location / {
            limit_req zone=one burst=20 nodelay;
            limit_conn connlimit 50;
        }
    }
}

نکته: اگر پشت CDN/Proxy هستید، باید Real IP را درست تنظیم کنید وگرنه همه کاربران یک IP دیده می‌شوند.

گام 9) تست کانفیگ و ری‌استارت Nginx

# تست کانفیگ
sudo nginx -t

# ری‌استارت
sudo systemctl restart nginx

# بررسی وضعیت
sudo systemctl status nginx --no-pager

گام تکمیلی (پیشنهادی برای ترافیک بالا): افزایش Limit فایل‌ها و بهینه‌سازی Kernel

برای High Traffic، افزایش open files و چند پارامتر شبکه Kernel می‌تواند تفاوت محسوسی ایجاد کند (به‌خصوص وقتی Connection زیاد دارید).

# نمایش Limit فعلی
ulimit -n

# نمونه sysctl (با احتیاط و تست)
sudo nano /etc/sysctl.d/99-nginx-tuning.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
# اعمال تغییرات sysctl
sudo sysctl --system
یادآوری:
مقادیر دقیق به نوع اپلیکیشن، RAM/CPU، تعداد کاربر هم‌زمان و الگوی ترافیک بستگی دارد.
بهترین کار این است که بعد از تغییرات، با مانیتورینگ (CPU/RAM/IO/Latency) تنظیمات را Fine-tune کنید.

جمع‌بندی

بهینه‌سازی Nginx برای سایت‌های پرترافیک ترکیبی از تنظیم workerها، فعال‌سازی Compression، Cache برای فایل‌های استاتیک و پاسخ‌ها، بهینه‌سازی Buffer/Timeout و اعمال محدودسازی‌های امنیتی است.
اگر زیرساخت فعلی جوابگو نیست، ارتقا به سرور مجازی از پارس آپتایم می‌تواند زیرساخت لازم برای رشد ترافیک را فراهم کند.

مطالعه این مطالب را هم توصیه میکنیم

خدمات مورد نیاز شما را با کیفیتی که انتظار دارید و قیمتی که انتظار ندارید.

آیا این مطلب برای شما مفید بود؟
پارس آپتایم | ارائه‌دهنده VPS و میزبانی وب