وردپرس و ووکامرس

لایت اسپید یا آپاچی برای وردپرس: تفاوت ها و تنظیم LSCache

لایت اسپید یا آپاچی برای هاست وردپرس؟ مهم ترین فرق دو وب سرور برای وردپرس جایی است که کش صفحه اجرا می شود: روی LiteSpeed داخل خود وب سرور و روی آپاچی داخل یک افزونه وردپرس.

نوشته تیم فنی پیکوهاستبه روزرسانی: ۲۳ شهریور ۱۴۰۵۱۶ دقیقه مطالعه

روی هاست اشتراکی، وب سرور را شرکت هاستینگ انتخاب کرده و شما با خرید پلن آن را هم می خرید. همین انتخاب در سایت وردپرسی دو اثر مستقیم دارد: کش صفحه داخل وب سرور اجرا می شود یا داخل افزونه، و سایت زیر درخواست های هم زمان چطور رفتار می کند. روی بسیاری از هاست های سی پنل، CloudLinux هم کنار وب سرور نصب است و با سقفی که برای منابع هر اکانت می گذارد، در رفتار سایت زیر بار سهم دارد.

آپاچی درخواست ها را چطور جواب می دهد

آپاچی (Apache httpd) مدیریت اتصال ها را به ماژولی به نام MPM می سپارد و در هر لحظه فقط یک MPM می تواند بارگذاری شده باشد. طبق مستندات MPM آپاچی، روی سیستمی که از ترد و epoll یا kqueue پشتیبانی می کند MPM پیش فرض event است، که در عمل یعنی همه توزیع های امروزی لینوکس. سه MPM اصلی روی لینوکس:

  • prefork فقط با پروسس کار می کند؛ هر پروسس فرزند در هر لحظه یک اتصال را جواب می دهد.
  • worker داخل هر پروسس چند ترد دارد و درخواست ها را با تردها جواب می دهد.
  • event هم چندتردی است، ولی اتصال های keep-alive بی کار را به یک ترد شنونده می سپارد تا تردهای کاری برای درخواست های تازه آزاد بمانند.

نحوه اجرای PHP هم به MPM بستگی دارد. طبق مستندات php.net، ماژول mod_php اگر PHP با Zend Thread Safety کامپایل نشده باشد فقط با prefork کار می کند. php.net برای نصب های جدید PHP-FPM را پیشنهاد می دهد که آپاچی از طریق mod_proxy_fcgi به آن وصل می شود و با MPM event هم کار می کند.

هزینه فایل .htaccess

وردپرس پیوندهای یکتا را با قوانین rewrite در فایل .htaccess می سازد و روی هاست اشتراکی تنها جایی که می توانید رفتار وب سرور را تغییر دهید همین فایل است. مستندات آپاچی درباره .htaccess می گوید وقتی AllowOverride استفاده از این فایل را مجاز کرده باشد، httpd در هر درخواست همه پوشه های مسیر را برای .htaccess می گردد، چه فایلی آنجا باشد چه نباشد. در مثال خود مستندات، درخواست فایلی در /www/htdocs/example چهار بار دسترسی اضافه به فایل سیستم لازم دارد. آپاچی توصیه می کند اگر به فایل پیکربندی اصلی دسترسی دارید تنظیمات را آنجا بگذارید، که روی هاست اشتراکی ممکن نیست.

LiteSpeed چیست و چه فرقی با آپاچی دارد

LiteSpeed Web Server وب سروری از شرکت LiteSpeed Technologies است که سازنده اش آن را جایگزین مستقیم آپاچی معرفی می کند. فرق اصلی در معماری است. LiteSpeed رویدادمحور (event-driven) است: تعداد کمی پروسس اتصال های زیادی را هم زمان با رویدادهای سیستم عامل مدیریت می کنند و برای هر اتصال پروسس یا ترد جدا ساخته نمی شود.

طبق صفحه مقایسه نسخه های LiteSpeed، نسخه Enterprise فایل های پیکربندی آپاچی را مستقیم می خواند، قوانین rewrite و بیشتر دستورهای آپاچی را پشتیبانی می کند و تغییرات .htaccess را بدون ری استارت تشخیص می دهد. LiteSpeed فایل های .htaccess را کش هم می کند تا مثل آپاچی مجبور نباشد در هر درخواست همه پوشه ها را بگردد. به همین دلیل .htaccess وردپرس و قوانین افزونه های امنیتی معمولاً بدون تغییر کار می کنند.

PHP روی LiteSpeed معمولاً از طریق LSAPI اجرا می شود، رابطی که خود LiteSpeed برای ارتباط وب سرور با PHP ساخته است و نسخه PHP مخصوص آن LSPHP نام دارد. برای مقایسه سرعت دو وب سرور به عددهای تبلیغاتی تکیه نکنید. سرعت سایت شما به قالب، افزونه ها و تنظیم کش بستگی دارد و باید روی همان سایت اندازه گرفته شود؛ روش تست با curl پایین تر آمده است.

OpenLiteSpeed و LiteSpeed Enterprise

LiteSpeed دو نسخه دارد. OpenLiteSpeed رایگان و متن باز با مجوز GPLv3 است و Enterprise تجاری. هر دو رویدادمحورند، موتور کش دارند و افزونه LiteSpeed Cache روی هر دو کار می کند.

فرق اصلی در سازگاری با آپاچی است. OpenLiteSpeed از .htaccess فقط قوانین rewrite را می پذیرد و دستورهای دیگر را نادیده می گیرد، و طبق مستندات OpenLiteSpeed بعد از هر تغییر در این قوانین باید سرور را ری استارت کرد. ESI هم در OpenLiteSpeed نیست، پس بخش های شخصی صفحه مثل سبد خرید را نمی شود جدا از بقیه صفحه کش کرد.

در فهرست کنترل پنل هایی که OpenLiteSpeed پشتیبانی می کند سی پنل نیامده، ولی Enterprise برای cPanel/WHM افزونه دارد. روی هاست اشتراکی که کاربرها هر لحظه ممکن است .htaccess خود را تغییر دهند، ری استارت برای هر تغییر عملی نیست و LiteSpeed تشخیص خودکار تغییرات .htaccess در نسخه Enterprise را برای همین محیط مناسب می داند.

کش سطح سرور LSCache چه فرقی با افزونه کش دارد

LSCache صفحه کش شده را از داخل خود وب سرور تحویل می دهد و درخواست به PHP نمی رسد. افزونه های کش روی آپاچی صفحه را به شکل فایل HTML ذخیره می کنند و اینکه آن فایل چطور تحویل داده شود به تنظیم افزونه و قوانین rewrite بستگی دارد.

بدون کش، وردپرس صفحه را در هر درخواست از نو می سازد: PHP اجرا می شود، قالب و افزونه ها بارگذاری می شوند و چند کوئری به دیتابیس می رود. کش صفحه نتیجه نهایی، یعنی HTML، را نگه می دارد و به درخواست های بعدی همان را تحویل می دهد.

روی LiteSpeed ذخیره و تحویل کش کار وب سرور است و افزونه LiteSpeed Cache (LSCWP) قاعده ها را تعیین می کند: چه صفحه ای قابل کش است، کاربر واردشده نسخه خصوصی بگیرد یا نه، و بعد از ویرایش یک نوشته کدام صفحه ها پاک شوند. طبق مستندات بخش Cache افزونه LSCWP، ESI اجازه می دهد صفحه ای که هم بخش عمومی دارد و هم بخش شخصی، مثل صفحه های فروشگاه ووکامرس، باز هم کش شود. ESI به LiteSpeed Enterprise یا QUIC.cloud نیاز دارد.

روی آپاچی، افزونه هایی مثل WP Super Cache یا W3 Total Cache صفحه را به شکل فایل HTML ذخیره می کنند. بسته به تنظیم، یا PHP آن فایل را تحویل می دهد یا قوانین rewrite در .htaccess درخواست را مستقیم به فایل می فرستند. این روش هم زمان پاسخ را کم می کند. LSCWP روی آپاچی هم نصب می شود، ولی بدون وب سرور LiteSpeed فقط قابلیت های بهینه سازی آن مثل کوچک سازی CSS و JS، کش اشیا و بهینه سازی دیتابیس کار می کند و کش صفحه نمی سازد.

تنظیم افزونه LiteSpeed Cache قدم به قدم

قبل از شروع از هاست بپرسید وب سرور LiteSpeed است و ماژول کش برای اکانت شما فعال است؛ بدون آن تنظیمات بخش کش اثری ندارد. اگر افزونه کش دیگری مثل WP Rocket، W3 Total Cache یا WP Super Cache نصب است، اول آن را غیرفعال و حذف کنید. مستندات LiteSpeed می گوید افزونه ای که کش و بهینه سازی تکراری دارد به احتمال زیاد با LiteSpeed Cache تداخل پیدا می کند.

روشن کردن کش صفحه

  1. در پیشخوان وردپرس از «افزونه ها > افزودن» افزونه LiteSpeed Cache را نصب و فعال کنید.
  2. به منوی LiteSpeed Cache و بخش Cache بروید و گزینه Enable Cache را روی ON بگذارید.
  3. بقیه تنظیمات تب Cache را برای شروع دست نزنید. Cache Logged-in Users به طور پیش فرض روشن است و برای کاربر واردشده نسخه خصوصی می سازد. Cache Mobile خاموش است و فقط وقتی لازم می شود که قالب شما برای موبایل HTML متفاوتی بسازد.
  4. در تب TTL مدت پیش فرض کش عمومی ۶۰۴۸۰۰ ثانیه (یک هفته) است. افزونه بعد از انتشار یا ویرایش نوشته صفحه های مرتبط را پاک می کند، پس معمولاً لازم نیست این عدد را کم کنید.
  5. تغییرات را ذخیره کنید.

کش اشیا (Object Cache)

پیشخوان وردپرس، سبد خرید و تسویه حساب از کش عمومی صفحه نمی آیند و هر بار کوئری می زنند. کش اشیا نتیجه کوئری های تکراری را در Redis یا Memcached نگه می دارد تا همین صفحه ها سبک تر شوند. این بخش افزونه به وب سرور LiteSpeed وابسته نیست.

گزینه فقط وقتی کار می کند که Redis یا Memcached روی سرور در دسترس و افزونه PHP مربوط به آن فعال باشد. در تب Object گزینه Object Cache را روشن کنید، Method را Redis یا Memcached بگذارید و Host و Port یا مسیر سوکت را طبق اطلاعاتی که هاست داده وارد کنید. همان صفحه وضعیت اتصال را نشان می دهد و اگر اتصال برقرار نشد، گزینه را خاموش بگذارید. صفحه هاست ووکامرس پیکوهاست از کش اشیای Redis نام برده است؛ اطلاعات اتصال پلن خودتان را از پشتیبانی بپرسید.

بهینه سازی CSS و JS با احتیاط

بخش Page Optimization گزینه های زیادی دارد، از کوچک سازی و ترکیب CSS و JS تا بارگذاری با تأخیر جاوااسکریپت و lazy load تصاویر. ترکیب فایل ها یا عقب انداختن اجرای جاوااسکریپت ممکن است ترتیب اجرای اسکریپت ها را به هم بزند و منو، اسلایدر یا فرم از کار بیفتد. مستندات LiteSpeed هم می خواهد این گزینه ها را قبل از فعال کردن روی سایت اصلی کامل تست کنید و بعد از هر تغییر Purge All بزنید. روشی که کمتر دردسر دارد:

  • هر بار فقط یک گزینه را روشن کنید.
  • Purge All بزنید و صفحه را در پنجره ناشناس مرورگر باز کنید.
  • منو، فرم تماس و جستجو را امتحان کنید و اگر فروشگاه دارید، افزودن به سبد و تسویه حساب را هم.
  • کنسول مرورگر (F12) را برای خطای جاوااسکریپت نگاه کنید.
  • اگر چیزی خراب شد، همان گزینه را خاموش کنید و دوباره Purge All بزنید.

گزینه های Generate UCSS و Load CSS Asynchronously برای ساختن CSS از سرویس QUIC.cloud استفاده می کنند و طبق مستندات ممکن است هزینه داشته باشند. درباره CSS Combine هم مستندات هشدار می دهد که اگر فضای دیسک بعد از روشن کردنش سریع پر شد، احتمالاً قالب شما رشته تصادفی به CSS اضافه می کند. روی هاستی که سقف فضا و inode دارد، این را زیر نظر داشته باشید.

کش سبد خرید و تسویه حساب ووکامرس

طبق مستندات LSCWP، صفحه های Cart، Checkout و My Account ووکامرس به طور خودکار از کش خارج می شوند. همان مستندات روشن کردن ESI (تب ESI در تنظیمات Cache) را هنگام استفاده از ووکامرس به شدت توصیه می کند؛ روی OpenLiteSpeed این گزینه در دسترس نیست. دو جا را خودتان چک کنید:

  1. در تنظیمات ووکامرس، تب Advanced، صفحه های سبد خرید، تسویه حساب و حساب کاربری درست انتخاب شده باشند. مستندات می گوید اشتباه در این انتخاب ممکن است باعث شود صفحه ای به اشتباه کش شود یا کش نشود.
  2. اگر قالب شما سبد کوچک بالای صفحه (mini cart) دارد، گزینه Vary for Mini Cart در تب WooCommerce را ببینید. این گزینه وقتی سبد خالی نیست نسخه کش جدایی برای mini cart می سازد. بعد از روشن کردنش، در پنجره ناشناس محصولی به سبد اضافه کنید و ببینید سبد کوچک درست نمایش داده می شود.

آدرس صفحه های اختصاصی دیگر، مثل پیگیری سفارش، را هم می توانید در تب Excludes و فیلد Do Not Cache URIs اضافه کنید. تنظیمات بیشتر برای سرعت فروشگاه را در آموزش بهینه سازی سرعت ووکامرس ببینید.

کراولر (Crawler)

کراولر صفحه هایی را که کششان منقضی شده دوباره باز می کند تا بازدیدکننده بعدی نسخه آماده ببیند. طبق مستندات، کراولر باید در سطح سرور یا virtual host فعال شده باشد و تنظیم Delay تعیین می کند هر چند وقت یک درخواست تازه به سرور برود. روی هاست اشتراکی اگر گزینه اش غیرفعال بود، از هاست بپرسید. اگر فعال بود، Delay را کم نکنید و مصرف منابع اکانت را زیر نظر داشته باشید. سایت کوچک با تعداد صفحه کم معمولاً به کراولر نیازی ندارد.

چطور ببینیم LSCache کار می کند

هدرهای پاسخ را با curl ببینید: وقتی صفحه از کش LiteSpeed آمده باشد، هدر x-litespeed-cache: hit در پاسخ هست. curl کوکی ورود شما را ندارد و همان پاسخی را می گیرد که بازدیدکننده ناشناس می گیرد:

curl -sI https://example.com/ | grep -i -E "server|x-litespeed"

در PowerShell ویندوز:

curl.exe -sI https://example.com/ | findstr /i "server litespeed"

دستور را دو بار پشت سر هم اجرا کنید. اولین درخواست بعد از پاک شدن کش معمولاً miss است؛ طبق مستندات، miss یعنی صفحه این بار از کش نیامده ولی ساختن نسخه کش شروع شده است. خروجی بار دوم روی سایتی که کش درست کار می کند چیزی شبیه این است:

server: LiteSpeed
x-litespeed-cache: hit
چه می بینیدیعنی چهچه کنید
x-litespeed-cache: hitصفحه از کش سرور آمده استکاری لازم نیست
x-litespeed-cache: miss در همه دفعاتصفحه هر بار ساخته می شود و هیچ وقت از کش نمی آیدExcludes را چک کنید؛ اگر CDN جلوی سایت است، کش CDN را موقتاً خاموش کنید و دوباره تست کنید
x-litespeed-cache-control: no-cacheصفحه عمداً کش نمی شودآدرس، کوکی یا نقش کاربر را در Excludes پیدا کنید یا لاگ دیباگ را ببینید
هدر x-litespeed-cache وجود ندارددرخواست از LSCache عبور نکردهوب سرور LiteSpeed است؟ Enable Cache روشن است؟ ماژول کش برای اکانت فعال است؟

صفحه سبد خرید را هم تست کنید؛ آنجا نباید hit ببینید. برای پیدا کردن دلیل no-cache، لاگ دیباگ را در بخش Toolbox و تب Debug Settings موقتاً روشن کنید، مشکل را دوباره ایجاد کنید و علت را در لاگ های پوشه wp-content/litespeed/debug بگردید. بعد خاموشش کنید، چون طبق مستندات این لاگ ها سریع فضای دیسک را پر می کنند.

چه چیزهایی با LSCache تداخل دارند

دو افزونه کش هم زمان

کنار WP Rocket، W3 Total Cache، WP Super Cache یا Cache Enabler، دو لایه کش و بهینه سازی روی هم کار می کنند. بعد از غیرفعال کردن افزونه قبلی، فایل wp-content/advanced-cache.php را چک کنید، چون بعضی افزونه ها این فایل را باقی می گذارند. اگر افزونه دیگری را برای کوچک سازی یا ترکیب CSS و JS نگه داشته اید، همان گزینه ها را در LiteSpeed Cache روشن نکنید.

Cloudflare

طبق مستندات کش Cloudflare، این CDN به طور پیش فرض HTML را کش نمی کند و فایل هایی با پسوندهای مشخص مثل تصویر، CSS و JS را نگه می دارد. در این حالت با LSCache تداخلی ندارد. مشکل وقتی شروع می شود که با Cache Rules همه چیز، از جمله HTML، را در Cloudflare کش کنید: بعد از ویرایش نوشته، LSCache نسخه خودش را پاک می کند ولی Cloudflare ممکن است تا تمام شدن مدت کش یا پاک کردن دستی، نسخه قدیمی را نشان بدهد. APO کلادفلر را هم روشن نکنید؛ مستندات LiteSpeed می گوید APO خودش کش صفحه است و باید خاموش باشد تا LiteSpeed Cache درست کار کند.

کاربران واردشده و تست سرعت

تست سرعت در همان مرورگری که با آن وارد پیشخوان شده اید تصویر درستی نمی دهد. کاربر واردشده کش عمومی نمی گیرد و نوار مدیریت و افزونه هایی مثل Query Monitor هم بار اضافه دارند. تست را در پنجره ناشناس یا با curl انجام دهید.

بازنویسی .htaccess

LSCWP قوانین خودش را در .htaccess می نویسد. اگر افزونه امنیتی یا خودتان این فایل را بازنویسی کنید و بخش مربوط به LiteSpeed پاک شود، بخشی از رفتار کش به هم می خورد. قبل از ویرایش دستی از .htaccess کپی بگیرید.

CloudLinux روی هاست اشتراکی چه می کند

CloudLinux سیستم عاملی برای سرورهای هاست اشتراکی است و دو بخش آن، LVE و CageFS، مستقیم به سایت وردپرسی شما مربوط می شوند.

LVE و خطای 508

LVE هر اکانت را در محیطی با سقف CPU، رم، I/O و تعداد پروسس اجرا می کند. طبق مستندات CloudLinux، وقتی تعداد پروسس های ورودی (Entry Processes) پر شود خطای 508 برمی گردد، پر شدن رم یا تعداد کل پروسس ها معمولاً به خطای 500 یا 503 می رسد و رسیدن به سقف CPU یا I/O سایت را کند می کند. جدول کامل این سقف ها و راه خواندن عددهای پلن در بخش سقف منابع چک لیست خرید هاست وردپرس آمده است.

با این سیستم، ترافیک ناگهانی یا اسکریپت خراب سایت دیگری روی همان سرور سهم همان اکانت را مصرف می کند و سایت خودتان هم سقف مشخصی دارد. کش سطح سرور اینجا اثرش را نشان می دهد: صفحه ای که LiteSpeed از کش برمی گرداند PHP اجرا نمی کند، پس همان پلن پیش از رسیدن به خطای 508 درخواست های هم زمان بیشتری را جواب می دهد.

در سی پنل صفحه Resource Usage نشان می دهد اکانت چند بار به هر سقف خورده است. سرعت I/O به نوع دیسک هم بستگی دارد؛ فرق NVMe با SSD معمولی را در مطلب اثر هارد NVMe و رم DDR4 روی سرعت سرور توضیح داده ایم.

CageFS و جدا بودن فایل های هر کاربر

CageFS برای هر کاربر یک فایل سیستم مجازی جدا می سازد. طبق مستندات CloudLinux، کاربر داخل این قفس کاربران دیگر سرور را نمی بیند و در /proc فقط پروسس های خودش را می بیند. CloudLinux می گوید CageFS جلوی بیشتر حمله های افزایش دسترسی و افشای اطلاعات را می گیرد.

برای سایت وردپرسی یعنی اگر سایت دیگری روی همان سرور هک شود، اسکریپت مهاجم به سادگی به فایل های شما، مثل wp-config.php که رمز دیتابیس در آن است، دسترسی پیدا نمی کند. به روز نگه داشتن وردپرس و افزونه ها و انتخاب رمزهای قوی همچنان کار خودتان است. صفحه درباره پیکوهاست می گوید روی سرورها CloudLinux نصب است و هر اکانت از بقیه جدا نگه داشته می شود.

جدول مقایسه Apache، LiteSpeed Enterprise و OpenLiteSpeed

موضوعApache httpdLiteSpeed EnterpriseOpenLiteSpeed
مدل پردازشپروسس یا ترد، بسته به MPMرویدادمحوررویدادمحور
فایل .htaccessدر هر درخواست در همه پوشه های مسیر جستجو می شودکش می شود و تغییرش بدون ری استارت اعمال می شودفقط قوانین rewrite؛ هر تغییر ری استارت لازم دارد
اجرای PHPmod_php با prefork، یا PHP-FPMLSAPILSAPI
کش صفحه وردپرسبا افزونه، مثل WP Super CacheLSCache داخل وب سرور، با ESILSCache داخل وب سرور، بدون ESI
سی پنلوب سرور پیش فرض سی پنل (EasyApache 4)افزونه cPanel/WHM دارددر فهرست کنترل پنل های پشتیبانی شده نیست
مجوزرایگان و متن بازتجاریرایگان و متن باز (GPLv3)

برای وردپرس لایت اسپید یا آپاچی بگیرید؟

روی هاست اشتراکی سی پنل، برای وردپرس هاستی را انتخاب کنید که وب سرور LiteSpeed با ماژول کش فعال دارد، چون صفحه کش شده بدون اجرای PHP تحویل داده می شود و .htaccess وردپرس معمولاً بدون تغییر کار می کند. بعد از خرید، افزونه LiteSpeed Cache را طبق مراحل بالا تنظیم و با curl تست کنید.

روی سرور مجازی که مدیریتش با خودتان است، دستتان بازتر است. آپاچی با MPM event و PHP-FPM همراه با یک افزونه کش خوب برای بسیاری از سایت های وردپرسی کافی است. OpenLiteSpeed هم گزینه رایگانی است که LSCache دارد، به شرطی که ری استارت بعد از تغییر .htaccess و نبودن ESI برایتان مشکلی نباشد.

پلن های هاست وردپرس اروپا و هاست وردپرس ایران پیکوهاست روی وب سرور LiteSpeed هستند. بقیه معیارهای خرید، از نسخه PHP و بکاپ تا لوکیشن سرور، در چک لیست انتخاب هاست وردپرس آمده است.