آموزش بهینه‌سازی وب سرور آپاچی (Apache webserver) برای افزایش سرعت



وب‌سرور آپاچی (Apache) یکی از محبوب‌ترین و قدرتمندترین وب‌سرورهای جهان است، اما تنظیمات پیش‌فرض آن برای مدیریت ترافیک بالا بهینه نیستند. اگر با مصرف بیش از حد RAM و CPU یا کندی در پاسخگویی وب‌سایت خود مواجه هستید، به احتمال زیاد وب‌سرور شما نیاز به یک کانفیگ حرفه‌ای دارد.

این مقاله یک راهنمای جامع و قدم‌به‌قدم برای بهینه‌سازی و tuning وب‌سرور آپاچی است. ما به شما نشان می‌دهیم چگونه با درک معماری آپاچی و تنظیم صحیح پارامترهای کلیدی، عملکرد سرور خود را به حداکثر برسانید. این تنظیمات زمانی بهترین نتیجه را می‌دهند که روی یک زیرساخت قدرتمند مانند یک سرور مجازی (VPS) پیاده‌سازی شوند.

 

قدم اول: انتخاب MPM مناسب، مهم‌ترین تصمیم شما

 

قبل از دستکاری هر عددی، باید مهم‌ترین بخش معماری آپاچی یعنی MPM (Multi-Processing Module) را بشناسید. MPM نحوه مدیریت درخواست‌ها، پروسه‌ها و حافظه را تعیین می‌کند. آپاچی سه MPM اصلی دارد:

 

  • Prefork: مدل قدیمی که برای هر درخواست یک پروسه جداگانه ایجاد می‌کند. این مدل بسیار پایدار و سازگار با ماژول‌های قدیمی (مانند mod_php) است، اما حافظه بسیار زیادی مصرف می‌کند و برای سایت‌های پربازدید توصیه نمی‌شود.
  • Worker: مدلی چند رشته‌ای که هر پروسه آن می‌تواند چندین درخواست را به صورت همزمان مدیریت کند. مصرف حافظه آن بسیار کمتر از Prefork است.
  • Event: مدل مدرن و بهترین انتخاب برای اکثر سرورها. این مدل بر پایه Worker ساخته شده و برای مدیریت اتصالات طولانی (Keep-Alive) بهینه‌سازی شده است. این MPM بالاترین عملکرد و کمترین مصرف منابع را دارد.

 

 

چگونه MPM فعلی را بررسی و تغییر دهیم؟

اول فعال بودن بودن MPM را با دستور زیر در ترمینال SSH بررسی میکنیم.

apachectl -V | grep -i "Server MPM"

 

اگر MPM فعال نبود، در سیستم عامل های اوبونتو یا دبیان با دستور میتوانید آن را عوض کنید و به مد event تغییر بدید.

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2

توصیه ما: حتما از MPM Event استفاده کنید، مگر اینکه به دلیل نیاز به ماژول‌های قدیمی مجبور به استفاده از Prefork باشید.

 

 

قدم دوم: محاسبه و تنظیم پارامترهای MPM

حالا که روی بهترین MPM (یعنی Event) هستیم، باید پارامترهای آن را بر اساس منابع سرور خود (به‌خصوص RAM) تنظیم کنیم. این تنظیمات معمولا در فایل /etc/apache2/mods-available/mpm_event.conf (در سیستم‌های مبتنی بر دبیان/اوبونتو) قرار دارند.

 

روش اول (سریع و آسان): استفاده از Apache2Buddy

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

 

اجرای اسکریپت Apache2Buddy:

curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | sudo perl

این اسکریپت اطلاعاتی در مورد مصرف حافظه به شما داده و مقادیر پیشنهادی را اعلام می‌کند.

 

 

روش دوم (دقیق و حرفه‌ای): محاسبه دستی

MaxRequestWorkers (مهم‌ترین پارامتر)

این عدد مشخص می‌کند که آپاچی حداکثر چند درخواست را می‌تواند به صورت همزمان پردازش کند. این پارامتر مستقیما بر مصرف حافظه سرور شما تأثیر می‌گذارد.

  • اگر مقدار آن خیلی کم باشد: درخواست‌های کاربران در صف قرار گرفته و وب‌سایت شما کند می‌شود یا کاربران با خطای Time-out مواجه می‌شوند.
  • اگر مقدار آن خیلی زیاد باشد: مصرف RAM سرور شما از حد مجاز فراتر رفته، سیستم به شدت کند می‌شود و در نهایت وب‌سرور یا کل سرور Crash می‌کند.

 

فرمول محاسبه MaxRequestWorkers:

۱- میانگین مصرف رم هر پروسه آپاچی را پیدا کنید:

ps -ylC apache2 --sort:rss | awk '{sum+=$8;_NR++}END{print "Average RAM usage per process: "sum/_NR/1024" MB"}'

این دستور میانگین مصرف رم هر پروسه apache2 را به مگابایت به شما می‌دهد. (برای مثال، فرض کنیم نتیجه 25MB باشد).

۲- میزان رم قابل تخصیص به آپاچی را مشخص کنید: مقدار RAM که می‌خواهید به آپاچی اختصاص دهید را مشخص کنید. (برای مثال، در یک سرور 4 گیگابایتی که سرویس دیتابیس هم روی آن قرار دارد، 3 گیگابایت را به آپاچی اختصاص می‌دهیم).

۳- مقدار بهینه را محاسبه کنید:

MaxRequestWorkers = (کل رم اختصاصی به آپاچی بر حسب مگابایت) / (میانگین مصرف رم هر پروسه)

MaxRequestWorkers = 3000MB / 25MB = 120

پس مقدار بهینه برای MaxRequestWorkers در این مثال 120 است.

 

 

ServerLimit و ThreadLimit

این دو پارامتر، سقف سخت‌افزاری را برای تعداد کل پروسه‌ها و رشته‌ها (Threads) در کل عمر پروسه آپاچی تعیین می‌کنند.

  • ServerLimit: این مقدار باید همیشه برابر یا کمی بیشتر از MaxRequestWorkers / ThreadsPerChild باشد. به زبان ساده، این عدد حداکثر تعداد پروسه‌های فرزندی (Child Processes) را که آپاچی می‌تواند ایجاد کند، مشخص می‌کند.
  • ThreadLimit: این مقدار حداکثر تعداد رشته‌هایی را که هر پروسه فرزند می‌تواند داشته باشد، مشخص می‌کند و باید از ThreadsPerChild بزرگتر یا مساوی باشد. معمولا مقدار پیش‌فرض 64 کافی است.

 

 

ThreadsPerChild

این پارامتر تعداد رشته‌های فعال در هر پروسه فرزند را تعیین می‌کند. مقدار پیش‌فرض آن 25 است که برای اکثر کاربردها یک نقطه شروع خوب محسوب می‌شود. تمام رشته‌های یک پروسه، حافظه را به اشتراک می‌گذارند که این امر باعث بهینگی در مصرف منابع می‌شود.

 

 

StartServers

این پارامتر تعداد پروسه‌های فرزندی را که در لحظه استارت شدن وب‌سرور آپاچی ایجاد می‌شوند، مشخص می‌کند. داشتن تعدادی پروسه آماده به محض شروع کار، باعث می‌شود اولین درخواست‌ها بدون تاخیر پاسخ داده شوند. مقدار پیش‌فرض 3 برای اکثر سرورها کاملا مناسب است.

 

 

MinSpareThreads و MaxSpareThreads

این دو پارامتر برای مدیریت جهش‌های ناگهانی در ترافیک سایت بسیار مهم هستند.

 

  • MinSpareThreads (حداقل رشته‌های یدکی): آپاچی همیشه تلاش می‌کند حداقل این تعداد رشته را به صورت بیکار (Idle) و آماده به کار نگه دارد. اگر تعداد رشته‌های آماده کمتر از این مقدار شود، آپاچی پروسه‌ها و رشته‌های جدیدی ایجاد می‌کند تا به این حداقل برسد.
  • MaxSpareThreads (حداکثر رشته‌های یدکی): اگر تعداد رشته‌های بیکار از این مقدار بیشتر شود، آپاچی شروع به از بین بردن آن‌ها می‌کند تا منابع سرور بیهوده اشغال نشوند.

یک تنظیم خوب برای زمانی است که MaxSpareThreads را به طور قابل توجهی بیشتر از MinSpareThreads قرار دهید تا آپاچی فضای کافی برای مدیریت نوسانات ترافیک را داشته باشد.

 

 

MaxConnectionsPerChild

این پارامتر تعداد کل درخواست‌هایی را که یک پروسه فرزند، قبل از «Kill» و جایگزین شدن با یک پروسه کاملا جدید، پردازش می‌کند، محدود می‌نماید.

  • چرا این کار مفید است؟ گاهی اوقات ماژول‌های آپاچی یا کدهای PHP دچار نشت حافظه (Memory Leak) جزئی می‌شوند. با جایگزین کردن دوره‌ای پروسه‌ها، هرگونه حافظه اشغال شده‌ای که آزاد نشده، به سیستم بازگردانده می‌شود.
  • مقدار پیشنهادی: تنظیم این مقدار روی 0 (نامحدود) توصیه نمی‌شود. یک عدد بزرگ مانند 3000 یا 5000 یک تعادل خوب بین پایداری و سربار ناشی از ایجاد پروسه‌های جدید است.

 

 

نمونه یک کانفیگ بهینه برای mpm_event.conf:

 

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit              64
    ThreadsPerChild          25
    ServerLimit              6   # محاسبه شده از 150/25
    MaxRequestWorkers        150 # مقدار محاسبه شده برای سرور شما
    MaxConnectionsPerChild   3000
</IfModule>

 

(نکته: ServerLimit باید بر اساس MaxRequestWorkers و ThreadsPerChild محاسبه شود: Ceiling(MaxRequestWorkers / ThreadsPerChild))

 

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

این ویژگی به مرورگر کاربر اجازه می‌دهد تا برای دریافت چندین فایل (مانند CSS، JS، تصاویر) از یک اتصال TCP استفاده کند، به جای اینکه برای هر فایل یک اتصال جدید باز کند.

  • توصیه: حتما (KeepAlive On) آن را فعال کنید. این کار زمان بارگذاری صفحه را به شدت کاهش می‌دهد.
  • KeepAliveTimeout: مدت زمانی که سرور منتظر درخواست بعدی روی همان اتصال می‌ماند. مقدار «5» ثانیه یک تعادل خوب بین عملکرد و آزاد نگه داشتن پروسه‌هاست.
  • MaxKeepAliveRequests: حداکثر تعداد درخواست روی یک اتصال. مقدار «100» مناسب است.

 

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

دو ماژول مهم آپاچی که فعال‌سازی آن‌ها سرعت سایت شما را متحول خواهد کرد:

  • mod_expires (کش سمت مرورگر): به مرورگر می‌گوید که فایل‌های استاتیک (CSS, JS, تصاویر) را برای مدتی در حافظه خود نگه دارد و برای بازدیدهای بعدی، مجدداً آن‌ها را از سرور شما درخواست نکند.
  • mod_deflate (فشرده‌سازی Gzip): فایل‌های متنی (HTML, CSS, JS) را قبل از ارسال برای کاربر فشرده می‌کند. این کار حجم آن‌ها را به شدت کاهش داده و سرعت دانلود را بالا می‌برد.

فعال‌سازی این دو ماژول با دستورهای a2enmod expires و a2enmod deflate و سپس restart کردن آپاچی انجام می‌شود.

 

جمع‌بندی نهایی و چک‌لیست بهینه‌سازی

بهینه‌سازی آپاچی یک فرآیند فنی اما بسیار پربازده است. مسیر درست به این شکل است:

  1. انتخاب MPM درست: از Event MPM استفاده کنید.
  2. محاسبه دقیق MaxRequestWorkers: با استفاده از ابزار یا محاسبه دستی.
  3. فعال‌سازی KeepAlive: برای بهبود افزایش سرعت بارگذاری سایت.
  4. فعال‌سازی کش و فشرده‌سازی: با mod_expires و mod_deflate.

 

این تنظیمات، زمانی بهترین نتیجه را می‌دهند که روی یک زیرساخت سخت‌افزاری قدرتمند پیاده‌سازی شوند. اگر به دنبال راه‌اندازی یک وب‌سایت پرسرعت هستید، سرور مجازی آلمان به دلیل پایداری بالا و پینگ مناسب به ایران، یکی از بهترین گزینه‌ها برای میزبانی وب‌سایت شماست. برای سایر نیازها و مشاهده پلن‌های متنوع، می‌توانید به صفحه اصلی خرید سرور مجازی در بلوسرور مراجعه کنید.