وب سرور یک نرمافزار یا سیستم سختافزاری است که صفحات وب (معمولا با استفاده از پروتکل HTTP یا HTTPS) را به کاربران ارائه میدهد. وقتی کاربران به یک وبسایت مراجعه میکنند، مرورگر وب آنها درخواستی به وب سرور میفرستد و وب سرور پاسخ را به صورت صفحهای از اطلاعات (معمولاً به صورت فایل HTML) ارسال میکند.
وب سرورها شامل قابلیتهایی مانند پردازش درخواستهای GET و POST، ارسال پاسخهایی به صورت فایلهای استاتیک (مانند HTML، CSS و JavaScript) یا پویا (مانند PHP، Python و Ruby) و ایجاد اتصالهای امن (با استفاده از پروتکل HTTPS) هستند.
برخی از وب سرورهای معروف عبارتاند از:
1. Apache HTTP Server
2. Nginx
3. Microsoft Internet Information Services (IIS)
4. LiteSpeed Web Server
وب سرورها همچنین میتوانند به عنوان بخشی از یک معماری سرویسدهی (مانند RESTful API) استفاده شوند که به برنامههای کاربردی امکان ارتباط با یکدیگر را میدهند.Apache و Nginx هر دو وب سرورهایی هستند که برای اجرای وبسایتها و برنامههای تحت وب استفاده میشوند. هر یک از این وب سرورها دارای ویژگیها و مزایای منحصربهفردی هستند. برای انتخاب وب سرور مورد نظر برای هر پروژه باید ویژگیها، مزایا و معایب هر کدام از وب سرورها را بررسی کنید و متناسب با نیاز خود یکی از آنها را انتخاب کنید. قبل از مقایسه وب سرورهای nginx و apache بهتر است ویژگیهای کلی هر کدام از آنها را به صورت جداگانه بررسی کنیم.
آنچه در این مقاله میخوانید:
محتوای استاتیک در مقابل محتوای پویا
پیکرهبندی متمرکز و توزیع شده (Centralized and distributed configuration)
فایل در مقابل تفسیر مبتنی بر URI
وب سرور Apache
آپاچی (Apache) یک وب سرور متن باز و رایگان است که برای ارائه صفحات وب به مرورگرها استفاده میشود. این وب سرور در سال 1995 توسط رابرت مککول روی سیستم عامل یونیکس ایجاد شد و در حال حاضر به عنوان یکی از محبوبترین وب سرورهای جهان شناخته میشود.
آپاچی قابلیت اجرا بر روی سیستم عاملهای مختلف از جمله یونیکس، لینوکس، ویندوز، مک و دیگر سیستم عاملها را داراست و با زبانهای برنامهنویسی مختلفی مانند PHP، Perl، Python و Ruby هماهنگی دارد. این وب سرور قابلیت پشتیبانی از پروتکلهای ارتباطی HTTP و HTTPS را داراست و از رمزنگاری SSL/TLS برای ارتقای امنیت ارتباط با کاربران استفاده میکند.
آپاچی به عنوان یک وب سرور قدرتمند، انعطافپذیر و قابل تنظیم شناخته میشود. از این وبسرور برای ارائه خدمات وب به شرکتها، سازمانها و نهادهای دولتی استفاده میشود. آپاچی همچنین برای ارائه صفحات وب شخصی و کوچک نیز مورد استفاده قرار میگیرد.
وبسرور Nginx
Nginx یک وب سرور متن باز و قدرتمند است که ابتدا در سال 2004 توسط Igor Sysoev منتشر شد. امروزه، Nginx یکی از محبوبترین وب سرورهای جهان است که بیشتر برای ارائه خدمات وب برای محیطهای ابری (cloud) و سایتهای با ترافیک بالا مورد استفاده قرار میگیرد.
Nginx از پروتکلهای ارتباطی HTTP و HTTPS پشتیبانی میکند و همچنین قابلیت پروکسیگذاری (proxy) برای برنامههای شبکه را داراست. علاوه بر این، Nginx از زبانهای برنامهنویسی مختلفی مانند PHP، Python، Ruby، Perl، و Java پشتیبانی میکند و به عنوان یک وب سرور معماری چندنخی (multi-threading) دارد که امکان پردازش همزمان بیشترین تعداد درخواستها را فراهم میکند.
Nginx همچنین به عنوان یک وب سرور قدرتمند، قابلیت پشتیبانی از توزیعهای بار (load balancing) و نگهداری از ارتباطهای SSL/TLS را داراست. از Nginx برای ارائه خدمات وب به شرکتها، سازمانها و محیطهای ابری استفاده میشود. این وبسرور برای ارائه صفحات وب شخصی و کوچک نیز مورد استفاده قرار میگیرد. در کل Nginx یک وب سرور سریع، انعطافپذیر، قابل تنظیم و با قابلیتهای پیشرفته است که به عنوان یکی از بهترین گزینههای وب سرور برای سایتهای با ترافیک بالا شناخته میشود.
برای مقایسه دقیق تر این دو وب سرور، لازم است در مورد نیازهای خاص پروژه خود و همچنین قابلیتهای هر یک از این وب سرورها بیشتر بدانید.
معماری Connection handling
یکی از تفاوتهای مهم بین وبسرورهای آپاچی و Nginx نحوه عملکرد آنها در مدیریت ترافیک و اتصال است. این تفاوت بیشتر در مواقعی که سرور تحت بار است به چشم میآید.
آپاچی
آپاچی با استفاده از ماژولهای چندپردازشی MPM نحوه رسیدگی به درخواستهای کاربران و اتصالات را مشخص میکند. MPM در آپاچی مخفف Multi-Processing Module است و برای مدیریت فرآیندهای همزمان در سرورهای وب استفاده میشود. هدف از استفاده از MPM در آپاچی، افزایش قابلیت اطمینان و عملکرد سرور وب است. در آپاچی، چندین MPM وجود دارد که هر کدام با روشهای مختلفی فرآیندها را مدیریت میکنند. در ادامه، به برخی از انواع MPM در آپاچی و نحوه کارکرد آنها اشاره میکنیم:
MPM Prefork
در این نوع MPM، هر درخواست فرد به یک فرایند جدید منتقل میشود. بدین ترتیب، هر فرایند به صورت مستقل از سایر فرایندها اجرا میشود و در صورت بروز مشکل در یکی از فرایندها، سایر فرایندها تحت تأثیر قرار نمیگیرند. این نوع MPM برای سرورهایی که از ماژولهای پردازش کننده CGI و mod_php استفاده میکنند، مناسب است.
MPM Worker
در این نوع MPM، هر فرایند شامل چند thred است که هر یک به صورت مستقل از سایر رشتهها اجرا میشود. هر رشته در این ماژول میتواند یک اتصال واحد را انجام دهد. در واقع این ماژول با مصرف منابع کمتر، به تعداد اتصالات بیشتری پاسخ میدهد. این نوع MPM برای سرورهایی که از ماژولهای پردازش کننده PHP-FPM، mod_wsgi و mod_perl استفاده میکنند، مناسب است.
MPM Event
این نوع MPM به صورت شبیه به MPM Worker عمل میکند؛ با این تفاوت که از مکانیزم Event برای مدیریت رویدادهای ورودی و خروجی استفاده میکند. این نوع MPM برای کاربردهای پرترافیک و بازدیدکنندگان همزمان بالا مناسب است؛ در واقع این ماژول برای مدیریت اتصالات زنده بهینه شده است. ماژول MPM Event با کنار گذاشتن رشتههای اختصاصی برای مدیریت اتصالات زنده و ارسال درخواستهای فعال به رشتههای دیگر، connection را زنده نگه میدارند.
در کل، استفاده از MPM در آپاچی به شما کمک میکند تا فرآیندهایی که همزمان روی سرور وب انجام می شود، بهبود یابد. با توجه به نیازهای خود، میتوانید MPM مناسب برای سرور خود را انتخاب کنید.
Nginx
Nginx پس از Apache و با آگاهی بیشتر از مشکلاتی که سایتها در مقیاس بزرگ با آن مواجه هستند، وارد بازار شد. به همین دلیل، Nginx از ابتدا برای استفاده از یک الگوریتم پردازش non-blocking connection، رویدادمحور و ناهمزمان طراحی شده است. Nginx فرآیندهای worker را ایجاد میکند که هر کدام از آنها میتوانند هزاران اتصال را اداره کنند. فرآیندهای worker این کار را با پیادهسازی یک مکانیزم حلقهای سریع انجام میدهند که بهصورت مستمر برای بررسی و پردازش رویدادها استفاده میشود. جداسازی کار واقعی از اتصالات به هر فرآیند worker این امکان را میدهد که فقط زمانی که یک رویداد جدید فعال شده است، به یک اتصال خاص مربوط شود.
هر یک از اتصالاتی که توسط کارگر پردازش میشود، درون حلقه رویداد قرار دارد. در این حلقه، رویدادها به صورت ناهمزمان پردازش میشوند که به آن امکان میدهد تا کار را به صورت non-blocking انجام دهد. هنگامی که یک اتصال بسته میشود، از حلقه حذف میگردد.
این نوع پردازش اتصالات، به Nginx امکان میدهد با منابع محدود مقیاس پذیر شود. از آنجایی که سرور تک-رشتهای است و فرآیندهایی برای پردازش هر اتصال جدید ایجاد نمیشود، مصرف حافظه و CPU معمولا در زمان بارگذاری سنگین به صورت نسبتا ثابت باقی میماند.
محتوای استاتیک در مقابل محتوای پویا
یکی از رایجترین مقایسهها بین وبسرور آپاچی و Nginx در زمینه ارائه محتوای استاتیک و پویا به کاربران است.
Apache
برای مدیریت محتوای استاتیک، آپاچی به صورت پیشفرض فایلهای مورد نیاز را به صورت مستقیم به مشتریها ارائه میدهد؛ اما برای مدیریت محتوای پویا، آپاچی با استفاده از ماژولهای مختلفی مانند mod_php، mod_perl و mod_python، امکان اجرای اسکریپتهای مختلف را فراهم میکند.
مدیریت محتوای استاتیک
برای مدیریت محتوای استاتیک، آپاچی به صورت پیش فرض، فایلهای HTML، CSS، تصاویر و فایلهای جاوااسکریپت را به صورت مستقیم به مشتریها ارائه میدهد. برای این کار، آپاچی از دو ماژول مهم استفاده میکند: ماژول mod_mime و ماژول mod_dir.
ماژول mod_mime به آپاچی اجازه میدهد تا بررسی کند که فایل مورد درخواست از چه نوعی است و به طور متناسب با آن، هدرهای MIME مربوطه را برای مرورگر ارسال کند. این ماژول برای ارائه محتوای استاتیک بسیار مهم است.
ماژول mod_dir نیز برای مدیریت دایرکتوریها و فایلهای فرعی آنها استفاده میشود. با استفاده از این ماژول، در صورتی که یک درخواست برای یک دایرکتوری خاص ارسال شود، آپاچی به صورت خودکار به دنبال فایل index.html یا index.php میگردد و اگر چنین فایلی در دایرکتوری مورد نظر وجود داشته باشد، آن را به صورت پیش فرض به مشتریها ارائه میدهد.
مدیریت محتوای پویا
برای مدیریت محتوای پویا نیز، آپاچی از ماژولهای مختلفی استفاده میکند. به عنوان مثال، ماژول mod_php به آپاچی اجازه میدهد تا اسکریپتهای PHP را اجرا کند و نتیجه را به عنوان محتوای پویا به کاربران ارائه دهد. همچنین، ماژول mod_perl و mod_python نیز به آپاچی اجازه میدهند تا اسکریپتهای پردازشی Perl و Python را اجرا کند و محتوای پویا را ارائه دهد.
در کل، آپاچی با استفاده از ماژولهای مختلف، به صورت موثری محتوای استاتیک و پویا را مدیریت میکند و به مشتریها ارائه میدهد.
Nginx
وب سرور Nginx هیچ قابلیت بومی برای پردازش محتوای پویا ندارد. Nginx برای رسیدگی به درخواستهای پویا باید این درخواست را به یک کتابخانه خارجی تحویل دهد و منتظر بماند تا نتیجه بازگردانده شود. سپس نتیجه را به مشتری منتقل میکند. این درخواستها با استفاده از پروتکلهایی مانند http، FastCGI، SCGI، memcache، Uwsgi بین Nginx و کتابخانه مربوطه مبادله میشوند. محتوای استاتیک نیز در Nginx به روش مستقیم ارائه میشود.
پیکرهبندی متمرکز و توزیع شده (Centralized and distributed configuration)
Apache و Nginx در رویکرد خود به ارائه پیکرهبندی متمرکز و توزیع شده بسیار متفاوت هستند.
Apache
در Apache، پیکرهبندی معمولا به صورت متمرکز انجام میشود، به این معنی که تمام پیکرهبندیها در یک فایل تنظیمات اصلی قرار دارند که در مسیری مانند /etc/httpd/conf/httpd.conf یا /etc/apache2/apache2.conf ذخیره میشود. همچنین، در Apache میتوان برای هر دایرکتوری مجوزهای مختص به خود را تعریف کرد و این مجوزها در فایلهای .htaccess در هر دایرکتوری ذخیره میشوند. این رویکرد متمرکز در Apache امکان مدیریت مرکزی و درک و بررسی پیکرهبندیها را آسان میکند، اما ممکن است در محیطهای بزرگ و پیچیده از انعطافپذیری کمتری برخوردار باشد.
Nginx
اما در Nginx، پیکرهبندی به صورت توزیع شده انجام میشود، به این معنی که هر بخش از پیکرهبندی در فایل تنظیمات جداگانهای قرار دارد که در مسیرهایی مانند /etc/nginx/conf.d/ یا /etc/nginx/sites-available/ ذخیره میشود. هر فایل تنظیمات برای یک سایت و یا بخش خاصی از سایت تعریف میشود. این رویکرد توزیع شده در Nginx امکان انعطافپذیری بیشتری را در مدیریت پیکرهبندیها فراهم میکند؛ اما ممکن است در محیطهای بزرگ و پیچیده، مدیریت پیکرهبندیها را پیچیدهتر کند.
بنابراین، در مقایسه با Apache، Nginx از یک رویکرد توزیع شده برای پیکرهبندی استفاده میکند که انعطافپذیری بیشتری را در مدیریت پیکربندیها فراهم میکند. این وب سرور به علت عدم پشتیبانی از فایلهای .htaccess، از رویکرد توزیع شده برای مدیریت مجوزها برای هر دایرکتوری استفاده نمیکند.
فایل در مقابل تفسیر مبتنی بر URI
یکی دیگر از حوزههایی که این دو وب سرور در آن با یکدیگر تفاوت دارند، روش تفسیر درخواستها و نگاشت آنها به منابع واقعی روی سیستم است.
Apache
در Apache، هنگامی که درخواستی از مرورگر وب دریافت میشود، ابتدا درخواست توسط ماژولهای مختلفی که به صورت پیش فرض در آپاچی فعال هستند پردازش میشود. سپس، با توجه به نوع درخواست، ماژولهای مختلفی مانند mod_rewrite و mod_alias درخواست را تفسیر کرده و به منابع واقعی روی سیستم نگاشت میکنند. برای مثال، اگر درخواستی برای فایل index.html دریافت شود، Apache ابتدا این فایل را در دایرکتوریهای مختلف مانند DocumentRoot و DirectoryIndex جستجو میکند و در نهایت فایل index.html را پیدا میکند و آن را به درخواستدهنده ارسال میکند.
Nginx
در Nginx، هنگامی که درخواستی از مرورگر وب دریافت میشود، ابتدا توسط همان Nginx پردازش میشود. Nginx سعی میکند با استفاده از فایل تنظیمات خود، درخواست را به منابع واقعی روی سیستم نگاشت کند. برای مثال، اگر درخواستی برای فایل index.html دریافت شود، Nginx به صورت مستقیم به مسیر مورد نظر در فایل تنظیمات خود نگاشت میکند و فایل را به درخواستدهنده ارسال میکند. به عبارت دیگر، در Nginx نیازی به استفاده از ماژولهای مختلف برای تفسیر درخواست و نگاشت آن به منابع واقعی وجود ندارد و این باعث افزایش سرعت و کاهش نیاز به منابع سیستمی میشود.
سوالات متداول
1. آیا Nginx سریعتر از Apache است؟
بله، به طور کلی Nginx از Apache سریعتر است؛ زیرا با توجه به روشهای پردازش وب، Nginx بهترین عملکرد را در بارهای سنگین ترافیکی دارد. اما در بارهای ترافیک کمتر، تفاوت بین دو سرور کمتر به چشم میآید.
2. آیا Apache انعطافپذیرتر از Nginx است؟
بله، Apache از انعطافپذیری بیشتری برخوردار است و به راحتی میتوان آن را با استفاده از ماژولهای مختلف، پلاگینها و فایلهای .htaccess تنظیم کرد. اما در Nginx این قابلیت به صورت محدودتر و با استفاده از فایلهای تنظیمات جداگانه و ماژولهایی مانند Lua فراهم است.
3. آیا Nginx پایدارتر از Apache است؟
این موضوع به شرایط و نحوه پیکرهبندی سرورها بستگی دارد. در برخی موارد، Apache با پیکرهبندی مناسب و استفاده از ماژولهای مورد نیاز، پایداری بالاتری نسبت به Nginx دارد، در حالی که Nginx به دلیل ساختار خود و روش کاری، معمولا به صورت پیشفرض پایداری بیشتری دارد. اما در حالت کلی، هر دو سرور به خوبی پایداری و امنیت سیستم را حفظ میکنند و این موضوع به نحوه استفاده و پیکرهبندی آنها بستگی د
منابع:
https://www.digitalocean.com/community/tutorials/apache-vs-nginx-practical-considerations