
راهنمای انتخاب بین Apache و Nginx برای اجرای وردپرس روی VPS بلوسرور
وردپرس بهعنوان محبوبترین سیستم مدیریت محتوا (CMS) دنیا بیش از ۴۳٪ کل وبسایتهای اینترنتی را در اختیار دارد. یکی از مهترین چیزها در زیرساخت هر سایت وردپرسی، وبسرور است؛ زیرا وبسرور وظیفه دریافت درخواستهای بازدیدکنندگان و پاسخدهی به آنها را بر عهده دارد. انتخاب بین Apache و Nginx، بهویژه زمانی که قصد دارید وردپرس را روی یک VPS (مانند بلوسرور) نصب کنید، مستقیما بر سرعت بارگذاری صفحات، مصرف منابع (مخصوصا حافظه رم) و مقیاسپذیری سایت تاثیر میگذارد. با الهام از نتایج مقایسه اجرای Apache و Nginx روی VPS ارزان بلوسرور، ابتدا تفاوتهای معماری و نحوه مدیریت منابع توسط هرکدام را توضیح میدهیم، سپس نحوه بهینهسازی وردپرس در هر دو محیط را بررسی میکنیم و در نهایت با مرور نتایج بنچمارکهای واقعی، پیشنهادهایی عملی ارائه خواهیم داد.
معماری وبسرورها و تاثیر آن بر عملکرد وردپرس
معماری پردازش محور Apache
Apache بهعنوان یکی از قدیمیترین وبسرورهای متنباز، از معماری پردازش محور (process-based) یا ترکیبی پردازش-نخ (process/thread-based) استفاده میکند. در تنظیمات پیشفرض با MPM Prefork، برای هر اتصال جدید یک پروسه مجزا ایجاد میشود که میتواند کدهای PHP (از طریق ماژول mod_php) را در همان پروسه تفسیر کند. این رویکرد در پروژههای کوچک یا میزبانی وب اشتراکی که تعداد درخواست همزمان پایین است، آسان و سریع نصب میشود، اما به محض افزایش تعداد بازدیدکنندگان مصرف حافظه و CPU بهسرعت بالا میرود. در آزمونهای انجامشده روی VPS ارزان بلوسرور با 1 گیگابایت رم و یک هسته پردازش، مشخص شد زمانی که تعداد درخواست همزمان به بیش از ۵۰ میرسد، هر پروسه Apache میتواند تا ۲۰ مگابایت رم مصرف کند و در نهایت حافظه سرور کاملا اشغال شود.
معماری رویداد محور Nginx و مزایای آن
در نقطه مقابل، Nginx از معماری رویدادمحور (event-driven) استفاده میکند که مبتنی بر حلقه رویدادها (event loop) و واکشی غیرهمزمان I/O است. در این حالت چند کارگر (worker) ثابت، وظیفه رسیدگی به هزاران اتصال همزمان را بر عهده دارند بدون اینکه برای هر اتصال، پروسه یا نخ جدید بسازند. نتایج آزمایشهای مشابه روی همان سرور نشان داد در شرایطی که ۱۰۰ درخواست همزمان ارسال میشود، Nginx بهطور متوسط تنها حدود ۲۰۰ مگابایت رم مصرف میکند و تاخیر پاسخدهی (Time To First Byte) به حدود ۸۰ میلیثانیه میرسد. این در حالی است که Apache با تنظیم MPM Worker (نسبتا بهینهتر از Prefork) در همان شرایط حدود ۴۰۰ مگابایت رم مصرف کرد و TTFB بین ۱۵۰ تا ۱۸۰ میلیثانیه متغیر بود. این تفاوت چشمگیر به دلیل نحوه مدیریت اتصالات و مصرف بهینه منابع توسط Nginx رخ میدهد.
پیکربندی PHP-FPM و بهینهسازی اجرای PHP در وردپرس
تاثیر PHP-FPM در بهبود عملکرد
وردپرس برای تولید صفحات داینامیک خود به PHP و پایگاه داده نیاز دارد. در گذشته، بسیاری از سرورها بهصورت مستقیم از ماژول mod_php در Apache استفاده میکردند، اما این شیوه باعث میشد در ترافیکهای بالا، همه منابع سرور درون همان پروسه Apache بلوکه شوند. PHP-FPM (FastCGI Process Manager) اجازه میدهد اجرای فایلهای PHP به یک سرویس جداگانه محول شود و وبسرور (چه Apache و چه Nginx) تنها نقش یک پروکسی برای ارسال درخواست به PHP-FPM را داشته باشد.
در Apache، بجای mod_php، با ماژولهای proxy_fcgi و setenvif، درخواستهای فایلهای PHP به سوکت یا پورت PHP-FPM ارسال میشوند. این جداسازی باعث میشود اگر مشکلاتی در پردازش PHP رخ دهد، کل سرویس Apache دچار اشکال نشود و افزون بر آن، در صورت نیاز میتوانید تنظیمات poolهای PHP-FPM را بسته به حجم ترافیک و منابع در دسترس (مثلا pm.max_children، pm.start_servers و pm.max_requests) بهدلخواه تغییر داده و عملکرد بهینهتری داشته باشید.
در Nginx، بهصورت پیشفرض توانایی پردازش PHP را ندارد و همیشه باید از PHP-FPM یا هر کارگزار FastCGI دیگر استفاده کرد. پیکربندی PHP-FPM در Nginx بسیار ساده است: کافی است در بلوکهای مرتبط با فایلهای PHP، مسیر ساکت یا IP:پورت PHP-FPM را مشخص کنید.
تاثیر پیکربندی نامناسب در ترافیک بالا
در مقاله مقایسه Apache و Nginx روی VPS ارزان بلوسرور مشخص شده که اگر در PHP-FPM پارامترهای pool بهدرستی تنظیم نشوند (برای مثال pm.max_children را بیش از دو برابر ظرفیت رم قرار دهید)، در حالتی که ترافیک رکوردشکن میشود، پروسههای PHP پاسخگو نیستند و درخواستها روی صف (Queue) منتظر میمانند. نتیجه این تاخیرها زمانی قابلتوجه است که ۲۰۰ تا ۳۰۰ درخواست همزمان ثبت میشود؛ در این شرایط Nginx با مصرف موقع کمتر رم میتواند درخواستها را سریعتر به PHP-FPM ارسال کند، در حالی که Apache گاهی خود در صف انتظار میماند تا سوکت PHP-FPM آزاد شود. این موضوع باعث میشود در شرایط بحرانی، Nginx بتواند چندین ثانیه قبل از Apache به درخواستهای جدید پاسخ دهد.
Cache وردپرس، تاثیر مستقیم روی سرعت و بارگذاری سرور
وردپرس بهطور پیشفرض بر اساس هر درخواست، چندین کوئری به پایگاه داده ارسال و پس از اجرای منطق PHP، نتیجه را رندر میکند. این کار ممکن است در هر صفحه بین ۱۵۰ تا ۵۰۰ میلیثانیه طول بکشد. هنگامی که حجم بازدیدکنندگان زیاد شود، بار اجرای مکرر PHP و پایگاه داده به معضل اصلی سرورهای کمظرفیت تبدیل میشود. راهحل اصلی، استفاده از کشینگ صفحات (Full-page Cache) است که نسخه کاملا HTML یک صفحه را برای مدت معینی ذخیره میکند و در دفعات بعدی درخواست، وبسرور همان فایل HTML را بدون نیاز به PHP و MySQL به کاربر ارائه میدهد.
مهم نیست وبسرورتان Apache باشد یا Nginx؛ بدون افزونه cache مناسب، نمیتوانید به پیکربندی بهینه VPS بلوسرور برای وردپرس دست پیدا کنید.
WP Super Cache: نسخه HTML کلیه صفحات را ذخیره کرده و از طریق بازنویسی (rewrite) در Apache یا استفاده از بلاک try_files در Nginx، فایل کش شده را به کاربر میدهد.
W3 Total Cache: علاوه بر کش صفحات، قابلیت کش دیتابیس، شی (Object Cache) و Minify کردن CSS/JS را نیز دارد. در تستهای Blueserver.ir مشخص شد وقتی W3 Total Cache به همراه Memcached یا Redis تنظیم شود، سرعت لود صفحه تا ۳۰٪ بیش از حالت بدون کش افزایش مییابد و تعداد درخواستهای همزمان قابل پاسخدهی با حافظهٔ محدود نیز بالا میرود.
WP Rocket: افزونه تجاری که خودکار فایلهای CSS/JS را Minify و Combine میکند و رابط تنظیماتی سادهتری دارد. برای سرورهای Nginx لازم نیست بهدنبال بلوکهای پیچیده کانفیگ باشید؛ کافی است پس از نصب WP Rocket، دستورالعملهای موجود را در قالب فایل Nginx include کنید تا کش صفحات و فشردهسازی فعال شود.
کش استاتیک در سطح وبسرور
همزمان با افزونههای کشینگ وردپرس باید در سطح وبسرور نیز برای فایلهای استاتیک (تصاویر، CSS، JS) کش تعیین کنید. در Apache با استفاده از ماژول mod_expires میتوانید برای انواع MIME Type تاریخ انقضای کش یا فرمت Cache-Control تعریف کنید تا مرورگر کاربر تا مدتی مشخص نیازی به درخواست دوباره آن فایل نداشته باشد. در Nginx نیز با تنظیم پارامتر expires در بلوکهای مرتبط با فایلهای ایستا، همین عملکرد را خواهید داشت. نتایج این تنظیمات در آزمون بلوسرور نشان داد بیش از ۶۰٪ درخواستهای ورودی برای منابع ایستا (CSS/JS/تصاویر) توسط مرورگر خود کاربر کش میشود؛ در نتیجه فشار روی شبکه و دیسک سرور تا حد زیادی کاهش یافت.
بهینهسازی عمومی و ماژولهای مکمل برای هر وبسرور
ماژولهای Apache برای فشردهسازی و امنیت
علاوه بر PHP-FPM و کشینگ، فعال کردن ماژول mod_deflate یا mod_gzip در Apache تأثیر قابلتوجهی روی کاهش حجم دادهٔ ارسالی دارد. فشردهسازی فعال باعث میشود در حالت کدگذاری gzip، برخی صفحات تا ۷۰٪ حجم کمتری داشته باشند. همچنین با فعالسازی mod_headers و تعریف هدرهای امنیتی (مانند X-Frame-Options, X-Content-Type-Options و Strict-Transport-Security) هم بر امنیت و هم بر تجربه کاربری (مثلاً جلوگیری از بارگذاری مجدد منابع ناایمن) تأثیر مثبت بگذارید.
از طرفی باید حتما KeepAlive را فعال کنید، اما با احتیاط: اگر مقدار KeepAliveTimeout را بیش از حد زیاد در نظر بگیرید (مثلاً بالای ۵ ثانیه برای VPS )، پروسههای Apache میتوانند تا زمان بیشتری بلوکه بمانند و همین موضوع مصرف رم را افزایش میدهد. بهصورت تجربی در بلوسرور مشاهده شد مقدار بین ۱ تا ۳ ثانیه برای KeepAliveTimeout توازن خوبی بین مصرف منابع و کاهش تأخیر ایجاد میکند.
ترفندهای Nginx برای حداکثر کردن کارایی
Nginx در بسیاری از توزیعها بهصورت پیشفرض ماژول gzip فعال دارد؛ اما حتما پارامتر gzip_min_length را بررسی کنید تا فایلهای زیر یک کیلوبایت فشرده نشوند. علاوه بر این، فعال کردن sendfile، tcp_nopush و tcp_nodelay باعث بهبود سرعت ارسال فایلهای استاتیک میشود. پارامترهای مهم دیگری مانند worker_processes auto; باعث میشود Nginx بهطور خودکار تعداد worker را بر اساس هستههای CPU تنظیم کند و فرضا در VPS دو هستهای، دو worker اختصاص دهد که کارایی را بهبود میبخشد. در بلوسرور متوجه شدیم با همین تنظیمات پیشفرض و یک افزونه کشینگ ساده، Nginx توانست در آزمایشهای استرس تا ۵۰۰ درخواست همزمان را بدون دخالت بیش از حد در رم (کمتر از ۷۰۰ مگابایت) مدیریت کند.
جمع بندی :
برای نصب و اجرای وردپرس روی یک VPS ارزان (مانند بلوسرور) که معمولا با محدودیتهای حافظه و پردازش مواجه است، توجه به نکات زیر باعث میشود تجربه کاربری بهتری دریافت کنید و هزینهٔ نهایی میزبانی را تا حد امکان کاهش دهید:
انتخاب Nginx در اولویت باشد: در آزمونهای عملی، Nginx در مقایسه با Apache در VPSهای کمرم و کمهسته بهتر عمل کرد و توانست تعداد درخواست همزمان بیشتری پاسخ دهد.
از PHP-FPM استفاده کنید: چه در Apache و چه در Nginx، ماژول mod_php را کنار بگذارید و PHP-FPM را جایگزین کنید تا پردازش PHP به صورت مستقل انجام شود و بتوانید تنظیمات pool را بر اساس منابع سختافزاری محدود سرور بهینه کنید.
از cache صفحات استفاده کنید: افزونههایی مانند WP Super Cache یا W3 Total Cache تاثیر قابلتوجهی بر کاهش زمان پاسخدهی و مصرف پایگاه داده دارند. در نظر داشته باشید پس از نصب افزونه، حتما در وبسرور (Apache یا Nginx) دستوراتی را فعال کنید تا فایلهای کش شده مستقیما به عنوان HTML استاتیک سرویس داده شوند.
فشردهسازی و کش استاتیک را جدی بگیرید: فعال کردن gzip در Nginx یا mod_deflate در Apache و تعریف headerهای کش برای فایلهای استاتیک (CSS/JS/تصاویر) باعث میشود تا مرورگرها منابع را در خود ذخیره کنند و دفعات بعدی درخواست، نیازی به بارگذاری از سرور نباشد.
پارامترهای KeepAlive و worker/process را متناسب تنظیم کنید: در Apache مقدار KeepAliveTimeout را در حد ۱ تا ۳ ثانیه نگه دارید تا از بلوکه شدن پروسهها جلوگیری شود. در Nginx نیز اجازه دهید با دستور worker_processes auto; بهطور خودکار تعداد کارگر بر اساس هستههای CPU مشخص شود و worker_connections را متناسب با رم تنظیم کنید (مثلا ۱۰۲۴ برای VPS کمظرفیت مناسب است).
نظرات