وب سرور Apache چگونه درخواست ها را مدیریت میکند؟

۱۲ مهر ۱۳۹۸
Apache-http-server

آپاچی محبوب ترین وب سرور برای وب سرورهای لینوکسی است. بسیاری از مدیران سیستم (سیس ادمینیستریتور) های لینوکسی مراحل یادگیریشان را با استفاده از این وب سرور(httpd) شروع کرده اند. در مراحل اولیه همه آنها با این وب سرور کار کرده اند. خیلی از آنها از تنظیمات پیشفرض استفاده کرده اند ولی نمیدانند که آپاچی چگونه کار میکند و چگونه اتصالات ورودی و یا درخواست ها و همچنین پردازش های چندگانه را مدیریت میکند.

آپاچی از یکی از متدهای زیر که به MPM ها (Multi Process Module)  یا ماژول چندپردازش معروف هستند برای مدیریت کردن درخواست های ورودی و پردازش های آنها استفاده میکند. هر دوی این اعمال (مدیریت درخواست ها و  پردازش آنها) روش خود را  دارد. بیایید نگاهی کوتاه به این روش ها بیندازیم:

Prefork MPM:

این روش که به آن Process model نیز میگویند چندین پردازش فرزند ایجاد و اجرا میکند. با استفاده از این MPM  پردازش فرزند (‌child process) یک کانکشن را در یک زمان مدیریت میکند. چندنخی در این روش معنی ای ندارد و یک Thread وجود دارد که یک پردازش را مدیریت میکند و به همین دلیل این روش مصرف مموری بیشتری نسبت به MPMهای دیگر که در زیر معرفی میشوند دارد. روش پیشفرضی که توسط نسخه های Apache 2 انجام میشود این روش است. اگر هیچ MPMای انتخاب نشود این روش انتخاب و اجرا خواهد شد. این روش در صورتی که قرار باشد آپاچی از کتابخانه های ایمن بدون Thread مثل mod_php استفاده کند روش مناسبی است و همینطور اگر قرار باشد پردازش ها ایزوله شوند گزینه مناسبی است.

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

Worker MPM

این متد چندین پردازش فرزند مشابه با روش بالا ایجاد میکند. هر پردازش فرزند چند Thread را اجرا میکند. هر Thread یک کانکشن را در یک زمان مدیریت میکند. همانطور که میبینید برعکس متد بالا در اینجا هر پروسه فرزند میتواند چندین Thread داشته باشد. در حقیقت این MPM آپاچی را به یک وب سرور Multi Thread و Multi Process تبدیل میکند.

Worker MPM یک سرور چند نخی چند پروسسی ترکیبی را پیاده سازی میکند. در حقیقت چندین پروسس فرزند که چندین thread را در بر میگیرند به علاوه یک thread که در حال گوش دادن است (listening thread)  و Worker درخواست های بیشتری را با منابع کمتری نسبت به Prefork مدیریت میکند.

وظیفه thread گوش دهنده اینه که به کانکشن ها گوش میدهد و آنها را به محض ورود به یک  thread برای پردازش هدایت میکند. همانطور که در بالا گفته شد مصرف مموری کمتری نسبت به Prefork MPM دارد.

در حالت عمومی برای سرورهایی که ترافیک بالایی داشتند تا قبل از نسخه ۲.۴ این روش توصیه میشد. Worker ها با کتابخانه های non-thread امن سازگاری ندارند و اگر نیاز دارید برنامه ای اجرا کنید که thread safe نیست بهتر است از روش بالا یعنی Prefork استفاده کنید.

 

Event MPM

این روش که در نسخه ۲.۴ آپاچی معرفی شد خیلی شبیه به Worker MPM است با این تفاوت که هر Theread میتواند بیشتر از یک وطیفه را انجام دهد و آپاچی منابع خیلی کمتری در این روش مصرف میکند. متد Event MPM برای مدیریت بارهای سنگین (hight load) طراحی شده است و خب باید در نظر داشته باشید فقط در سرورهایی که آپاچی ۲.۴ دارند پشتیبانی میشود و برای استفاده از مزایای آن حتما باید نسخه آپاچی را به روز کنید. چون با نسخه های قبل ۲.۴ سازگاری ندارد.

این روش با محول کردن بعضی از کارهای پردازش به thread های پشتیبان به درخواست های بیشتری به صورت همزمان سرویس میدهد. این متد کانکشن های بزرگ و طولانی را به صورت موثرتری بر روی یک thread مدیریت میکند. با استفاده از این MPM آپاچی موضوع keep alive problem را که توسط متدهای دیگر به وجود آمده به این صورت که وقتی کلاینت اولین درخواست را کامل میکند بتواند کانکشن را باز نگه دارد و درخواست های بیشتری را از این سوکت ارسال کند حل میکند و این موضوع باعت کار کاهش اضافه بار میشود.

 

1
برچسب ها :
نویسنده مطلب علی فلاحتی

یک دیدگاه

  • سبحان
    ۰۷ آبان ۱۳۹۸

    خیلی جالب و مفید بود

لینک های مفید