4 بهینهسازی 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 کنید.
