با افزایش ترافیک وبسایت، نیاز به زیرساختی قدرتمند و بهینه برای میزبانی آن بیش از پیش احساس میشود. Nginx به عنوان یک وب سرور با کارایی بالا و PHP-FPM (FastCGI Process Manager) به عنوان یک پردازشگر سریع و مقیاسپذیر PHP، ترکیبی ایدهآل برای مدیریت حجم بالای درخواستها هستند. در این آموزش جامع، به صورت گام به گام، نحوه کانفیگ تخصصی Nginx و PHP-FPM برای دستیابی به حداکثر سرعت و پایداری در وبسایتهای پرترافیک را تشریح خواهیم کرد. این راهنما برای مدیران سرور، توسعهدهندگان و هر کسی که به دنبال بهبود عملکرد زیرساخت وب خود است، تدوین شده است.
عملکرد سریع و پایدار وبسایت، نه تنها تجربه کاربری را بهبود میبخشد، بلکه تاثیر مستقیمی بر سئو و نرخ تبدیل دارد. نادیده گرفتن بهینهسازی سرور در مواجهه با ترافیک بالا میتواند منجر به کندی، از دسترس خارج شدن سایت و از دست دادن مشتریان شود. با درک عمیق از مکانیزمهای Nginx و PHP-FPM و اعمال تنظیمات صحیح، میتوانیم زیرساختی انعطافپذیر و سریع ایجاد کنیم که پاسخگوی نیازهای رو به رشد وبسایت شما باشد.
چرا Nginx و PHP-FPM برای ترافیک بالا؟
Nginx به دلیل معماری مبتنی بر رویداد (Event-driven) و Non-blocking I/O، در مدیریت اتصالات همزمان بسیار کارآمد عمل میکند. این برخلاف مدل Process-based یا Thread-based است که منابع بیشتری مصرف میکند. PHP-FPM نیز با مدیریت Poolهای فرایند PHP، امکان مقیاسپذیری و تنظیم دقیق مصرف منابع را فراهم میآورد و از سربار ناشی از راهاندازی مکرر PHP جلوگیری میکند.
مراحل کانفیگ Nginx
نصب Nginx
قبل از هر چیز، از نصب بودن آخرین نسخه پایدار Nginx بر روی سرور خود اطمینان حاصل کنید. این کار معمولاً از طریق مدیر بسته سیستم عامل انجام میشود.
1 2 | sudo apt update sudo apt install nginx |
کانفیگ اصلی Nginx
فایل کانفیگ اصلی Nginx معمولاً در /etc/nginx/nginx.conf قرار دارد. تنظیمات مربوط به worker_processes و worker_connections در این بخش اهمیت ویژهای دارند.
worker_processes: تعداد فرایندهای کاری Nginx. معمولاً برابر با تعداد هستههای CPU سرور تنظیم میشود.worker_connections: حداکثر تعداد اتصالات همزمان که هر فرایند کاری میتواند مدیریت کند. این مقدار باید با توجه به RAM سرور و محدودیتهای سیستم عامل تنظیم شود.
کانفیگ Virtual Host (Server Blocks)
برای هر وبسایت یا دامنه، یک Server Block مجزا تعریف میشود. این فایلها معمولاً در /etc/nginx/sites-available/ قرار گرفته و سپس لینک سمبلیک آنها به /etc/nginx/sites-enabled/ ایجاد میشود.
نمونهای از یک Server Block برای یک دامنه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | server { listen 80; server_name yourdomain.com www.yourdomain.com; root /var/www/yourdomain.com/public_html; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # آدرس سوکت PHP-FPM fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } access_log /var/log/nginx/yourdomain.com.access.log; error_log /var/log/nginx/yourdomain.com.error.log; } |
بهینهسازی کش Nginx
استفاده از ماژولهای کش مانند proxy_cache میتواند بار پردازشی را به شدت کاهش دهد.
برای فعالسازی و کانفیگ کش، ابتدا در بخش http فایل nginx.conf پارامترهای کش را تعریف کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 302 10m; # کش کردن پاسخهای 200 و 302 برای 10 دقیقه proxy_cache_valid 404 1m; # کش کردن پاسخ 404 برای 1 دقیقه add_header X-Cache-Status $upstream_cache_status; # ... } # ... } } |
مراحل کانفیگ PHP-FPM
نصب PHP-FPM
بسته PHP-FPM معمولاً همراه با نسخه PHP نصب میشود. برای مثال، برای PHP 7.4:
1 | sudo apt install php7.4-fpm |
کانفیگ PHP-FPM Pool
فایلهای کانفیگ Poolهای PHP-FPM در /etc/php/7.4/fpm/pool.d/ قرار دارند. شما میتوانید Poolهای متعددی با تنظیمات متفاوت برای وبسایتهای مختلف داشته باشید.
فایل www.conf (یا نام دلخواه) را ویرایش کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [yourdomain.com] user = www-data group = www-data listen = /var/run/php/php7.4-fpm-yourdomain.com.sock # سوکت اختصاصی listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = dynamic pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 pm.process_idle_timeout = 10s request_terminate_timeout = 120s rlimit_files = 2048 rlimit_nofile = 65535 |
در اینجا، پارامترهای کلیدی را بررسی میکنیم:
listen: آدرس سوکت برای ارتباط Nginx با PHP-FPM. استفاده از سوکت (Unix socket) معمولاً سریعتر از TCP/IP است.pm: استراتژی مدیریت فرایند PHP.dynamicبه معنی مدیریت پویا است.pm.max_children: حداکثر تعداد فرایندهای PHP که میتوانند همزمان فعال باشند. این مقدار باید با دقت تنظیم شود تا از مصرف بیش از حد RAM جلوگیری شود.pm.start_servers: تعداد فرایندهای PHP که در ابتدای کار ایجاد میشوند.pm.min_spare_serversوpm.max_spare_servers: تعداد فرایندهای آماده به کار که برای پاسخگویی سریع به درخواستها نگهداری میشوند.request_terminate_timeout: حداکثر زمان مجاز برای اجرای یک درخواست PHP.
مقایسه تنظیمات PHP-FPM
| پارامتر | توضیح | تنظیم برای ترافیک بالا (مثال) |
|---|---|---|
| pm | استراتژی مدیریت فرایند | dynamic |
| pm.max_children | حداکثر فرایندهای فعال | 50 – 150 (بسته به RAM) |
| pm.start_servers | فرایندهای اولیه | 10 – 30 |
| pm.min_spare_servers | حداقل فرایندهای آماده | 5 – 15 |
| pm.max_spare_servers | حداکثر فرایندهای آماده | 20 – 50 |
| pm.max_requests | حداکثر درخواست برای هر فرایند قبل از ریستارت | 500 – 1000 (برای جلوگیری از نشتی حافظه) |
تنظیمات امنیتی و بهینهسازی
استفاده از SSL/TLS
برای امنیت و اعتماد، استفاده از گواهی SSL الزامی است. Let’s Encrypt راهی رایگان برای دریافت و تمدید خودکار گواهی SSL ارائه میدهد. Nginx را برای ریدایرکت ترافیک HTTP به HTTPS کانفیگ کنید.
تنظیمات Gzip Compression
فشردهسازی Gzip پاسخهای HTTP میتواند حجم دادههای انتقالی را کاهش داده و سرعت بارگذاری صفحات را افزایش دهد. این تنظیمات در بخش http فایل nginx.conf انجام میشود.
1 2 3 4 5 6 7 8 9 | http { # ... gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # ... } |
بهینهسازی PHP.ini
تنظیمات مربوط به memory_limit، max_execution_time و upload_max_filesize در فایل php.ini (مربوط به نسخه PHP-FPM) را متناسب با نیاز وبسایت خود تنظیم کنید.
نکات کلیدی برای وبسایتهای پرترافیک
- مانیتورینگ مداوم: عملکرد سرور، مصرف RAM و CPU، و وضعیت فرایندهای PHP-FPM را به طور منظم رصد کنید. ابزارهایی مانند Zabbix, Prometheus, یا Grafana میتوانند مفید باشند.
- مقیاسپذیری: زیرساخت خود را به گونهای طراحی کنید که قابلیت مقیاسپذیری عمودی (افزایش منابع سرور) و افقی (اضافه کردن سرورهای بیشتر) را داشته باشد.
- استفاده از CDN: برای کاهش بار سرور و افزایش سرعت تحویل محتوا به کاربران در نقاط جغرافیایی مختلف، از شبکه توزیع محتوا (CDN) استفاده کنید.
- بهینهسازی پایگاه داده: اطمینان حاصل کنید که پایگاه داده شما بهینه شده و کوئریها بدون تاخیر اجرا میشوند.
نتیجهگیری
کانفیگ صحیح Nginx و PHP-FPM یک گام اساسی در جهت دستیابی به عملکرد مطلوب برای وبسایتهای پرترافیک است. با اعمال تنظیمات دقیق بر اساس منابع سرور و ماهیت وبسایت، میتوانید سرعت، پایداری و امنیت را به طور قابل توجهی افزایش دهید. به یاد داشته باشید که بهینهسازی یک فرآیند مداوم است و نیاز به رصد و تنظیمات مجدد دورهای دارد.
سوالات متداول
چگونه بفهمیم Nginx و PHP-FPM به درستی کار میکنند؟
با بررسی لاگهای Nginx (access.log و error.log) و لاگهای PHP-FPM (معمولاً در /var/log/php7.4-fpm.log) میتوانید از وضعیت عملکرد و خطاهای احتمالی مطلع شوید. همچنین، استفاده از ابزارهای مانیتورینگ به صورت زنده وضعیت را نمایش میدهد.
مقدار pm.max_children را چگونه تعیین کنم؟
این مقدار به شدت به RAM سرور شما بستگی دارد. یک راه عملی، شروع با مقداری معقول (مانند 50) و سپس افزایش تدریجی آن و رصد مصرف RAM است. هدف این است که تمام فرایندهای PHP بتوانند بدون پر شدن RAM، فعال باشند.
آیا استفاده از سوکت یا TCP/IP برای FastCGI بهتر است؟
در بیشتر موارد، استفاده از سوکت یونیکس (Unix Socket) که در مثالها نشان داده شد، به دلیل سربار کمتر، سریعتر از اتصال از طریق TCP/IP بر روی localhost است، به خصوص زمانی که Nginx و PHP-FPM بر روی یک سرور اجرا میشوند.
چگونه میتوانم Nginx را برای کش کردن محتوای استاتیک بهینه کنم؟
شما میتوانید از directive expires در فایل کانفیگ Nginx برای تعیین زمان انقضای کش برای فایلهای استاتیک (مانند CSS, JS, تصاویر) در مرورگر کاربر استفاده کنید. همچنین Nginx میتواند به صورت داخلی این فایلها را کش کند.
آیا بهینهسازی PHP-FPM برای سایتهای ایستا (Static Websites) نیز لازم است؟
اگرچه Nginx به تنهایی برای سرو کردن فایلهای استاتیک بسیار کارآمد است، اما اگر وبسایت شما دارای بخشهای داینامیک (مانند فرمها، بخش مدیریت) باشد، بهینهسازی PHP-FPM همچنان اهمیت دارد. در غیر این صورت، تمرکز اصلی باید بر روی کانفیگ بهینه Nginx باشد.
