پرش به مطلب اصلی

Nginx

فرض کنید می‌خواهیم یک وب سایت راه‌اندازی کنیم تا افراد بتوانند به راحتی از طریق ارتباط با آن یک سری داده متنی، تصویری یا ویدیویی را با یکدیگر تبادل کنند. کاربران با استفاده از مرورگر خود Request های خود را به آدرس وب سایت ارسال می‌کنند؛ این Request ها باید در مقصد پردازش و مدیریت شوند. پردازش و مدیریت درخواست‌های دریافتی در یک سرور به عهده وب سرور است.
وب سرور یک نرم افزار یا سخت افزار کامپیوتری است که از پروتکل HTTP و پروتکل های دیگر برای پاسخ به Request های کاربران که از طریق وب انجام می شود، استفاده می کند. وظیفه اصلی وب سرور پردازش و مدیریت Request های کاربران، نمایش محتوای وب سایت از طریق ذخیره سازی، پردازش و ارائه صفحات وب به صورت فایل HTML همراه با هر نوع داده دیگری مانند تصویر، متن، فایل‌های CSS و همچنین جاوا اسکریپت به کاربران است. وب سرورها علاوه بر HTTP از SMTP و FTP نیز پشتیبانی می‌کنند.

نحوه کارکرد وب سرور

حال به صورت دقیق‌تر به کارکرد وب سرور می‌پردازیم.
فرض کنید که به اطلاعات خاصی از وب‌سایت example.com نیاز پیدا می‌کنید. به همین دلیل با وارد کردن URL خواسته شده در مرورگر خود، درخواست خود را ادر می‌کنید. در مرحله بعد مرورگر با استفاده از پروتکل DNS آدرس IP سایت example.com را پیدا می‌کند و با این کار، مرورگر به یک وب سرور منتقل می شود. سپس مرورگر با درخواست HTTP فایل خاصی را از وب سرور درخواست می کند. وب سرور پاسخ خواهد داد و مجدداً از طریق HTTP صفحه درخواستی را برای مرورگر ارسال می کند. اگر صفحه درخواستی وجود نداشته باشد یا مشکلی پیش بیاید، وب سرور با یک پیام خطا پاسخ خواهد داد. سپس مرورگر قادر به نمایش صفحه وب خواهد بود.

استاتیک در مقابل داینامیک

در این بخش به تقابل وب سرور Static در مقابل وب سرور Dynamic می‌پردازیم.
یک وب سرور می‌تواند برای ارائه محتوای ثابت یا پویا استفاده شود. محتوای ثابت به محتوایی اشاره دارد که همانطور که هست نشان داده می شود، در حالی که محتوای پویا را می توان به روز کرد و آن را به صورت شخصی سازی شده تغییر داد. یک وب سرور Static از یک کامپیوتر و نرم‌افزار HTTP تشکیل شده است و فایل های میزبانی شده را همانطور که هست به یک مرورگر ارسال می کند. در حالی که در وب سرور پویا از یک وب سرور و سایر نرم افزارها مانند برنامه Backend و پایگاه داده استفاده می کنیم تا داده‌ها را به صورت متغیر و شخصی سازی شده به او نشان دهیم.
برای کسب اطلاعات بیشتر راجع به وب سرور میتوانید به این لینک مراجعه کنید.
حال فرض کنید وب سایت خود را گسترش داده‌اید و این وب سایت چندین سرویس ارائه می دهد. پس تصمیم می گیرید تا به جای پاسخ دهی به کاربران توسط یک سرور، چندین سرور با وظایف متفاوت ایجاد کنید. از آن جایی که اضافه شدن این سرورها باعث ایجاد پیچیدگی سیستم میشود، علاقمندیم تا همه این سرورها را تا حد توان از دید کاربر پنهان نگه داریم و کاربر صرفا با یک سرور تعامل داشته باشد.

Reverse Proxy

Reverse Proxy ابزاری است که تحت عنوان یک سرور مستقل امکانات متعددی را در اختیار ما قرار میدهد تا بتوانیم به نیازهای بیان شده پاسخ دهیم.
Reverse Proxy یک مدل معماری شبکه است که در آن یک سرور واسط بین کلاینت و سرور اصلی قرار می‌گیرد. در این مدل، درخواست‌های کلاینت به سرور اصلی ارسال نمی‌شوند، بلکه ابتدا به ریورس پروکسی می‌رسند و سپس ریورس پروکسی مسئول ارسال درخواست به سرور اصلی و دریافت پاسخ آن است.
به طور خلاصه، فرایند کارکرد یک Reverse Proxy به این شکل است:
فرض کنید یک وب سرور به عنوان Reverse Proxy در مقابل چندین وب سرور داخلی با IP Address های 192.168.1.02 و 192.168.1.03 و 192.168.1.04 قرار گردفته است.

  • کاربر یک درخواست به آدرس example.com ارسال می‌کند.
  • درخواست به Reverse Proxy می‌رسد.
  • Reverse Proxy بر اساس قوانین تعریف شده، آدرس درخواست را با یکی از آدرس‌های سرورهای داخلی مثل 192.168.1.03 جایگزین می‌کند.
  • درخواست را به سرور مقصد ارسال می‌کند.
  • پاسخ از سرور داخلی دریافت و برای کاربر اراسل می‌شود.

برای کسب اطلاعات بیشتر راجع به Reverse Proxy می‌توانید از این لینک استفاده کنید.

Reverse Proxy Function Explained Picture

حال فرض کنید این وبسایت راه اندازی شده چندین سرویس مختلف ارائه می‌دهد و هر سرویس بار بسیار زیادی را تحمل میکند. تعداد درخواست‌ها به هر سرور بسیار زیاد شده است و یک سرور نمی‌تواند به همه درخواست‌ها بدرستی و در زمان کوتاه پاسخ دهد. حال این چالش را میتوان به روش‌های مختلفی حل کرد:

  1. اضافه کردن منابع (CPU و RAM و Disk و ...) سرور که با هزینه زیادی همراه است و scalable هم نیست.
  2. اضافه کردن چند سرور با وظایف مشابه و تقسیم بار روی چندین سرور به جای یک سرور که این حالت scalable است.

برای انجام روش دوم، با مفهومی به نام Load balancing آشنا می شویم.

Load Balancing

لود بالانسینگ یا متعادل‌کردن بار به معنای توزیع یکسان بار یا ترافیک ورودی به یک شبکه، میان گروهی از سرورهای بک‌اند می‌باشد. این عمل توسط یک لود بالانسر (Load Balancer) انجام شده و باعث می‌شود تا سرور در ساعات اوج ترافیک دچار کندی و یا اختلال نشود. لود بالانسر میان کلاینت‌ها و سرورها قرار گرفته و به گونه‌ای ترافیک را توزیع می‌کند که بر هیچ‌یک از سرورها فشاری وارد نشود. برای درک بهتر لود بالانسینگ به این مثال توجه کنید. فرض کنید فروشگاهی دارای ۱۰ صندوق است که تنها یکی از آن‌ها کار می‌کند و در چنین شرایطی تمام مشتریان مجبورند در صفی طولانی بایستند و فرد صندوق‌دار نیز باید کار تمام آن‌ها راه بیندازد که این عمل باعث خستگی و کاهش بهره‌وری آن فرد در حین کار می‌شود. حال فرض کنید به‌یکباره تمام صندوق‌ها شروع به کار کرده و تمام مشتریان به صورت مساوی میان آن‌ها تقسیم شوند. در این حالت مشتریان زودتر از فروشگاه خارج شده و صندوق‌دار‌ها نیز دچار خستگی نمی‌شوند. لودبالانسینگ هم دقیقا به همین صورت عمل می‌کند.
حال شما میتوانید بر اساس نیاز و نوع استفاده از تکنیک‌های متفاوتی برای Load Balancing استفاده کنید.

  • Round Robin: در این نوع الگوریتم، ترافیک ورودی به شبکه به صورت زنجیره‌ای و پشت‌سرهم میان سرورها تقسیم می‌شود. این متد اغلب زمانی مورد استفاده قرار می‌گیرد که تمام سرورها دارای مشخصات یکسان باشند.
  • Weighted Round Robin: نوعی الگوریتم لود بالانسینگ است که در آن شما با توجه به ظرفیت و عملکرد سرورها می‌توانید ترافیک ورودی را میان آن‌ها تقسیم می‌کند. به عنوان مثال می‌توانید بیشتر ترافیک وب‌سایت خود را به سمت سروری که منابع قوی‌تری دارد، ارسال کنید.
  • IP Hash: در این متد، لود بالانسرها محاسبات ریاضی به نام Hashing را بر روی آدرس‌های IP انجام داده و بر اساس عدد بدست آمده، ترافیک آن‌ها را به سمت سرورهای مناسب هدایت می‌کنند. با استفاده از این روش می‌توانید مطمئن شوید که درخواست‌های یک IP هر بار تنها به سمت یک سرور خاص می‌روند.
  • Weighted Least Connection: در این الگوریتم، تعداد درخواست‌های ارسالی به هر سرور بر اساس میزان عملکرد و ظرفیت مشخص می‌شود و بنابراین سرورهای قدرتمندتر نسبت به سایر سرورها باید تعداد اتصالات بیشتری داشته باشند.

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

حال پس از آشنا شدن با کلیدواژه‌های Web Server ، Reverse Proxy و همچنین Load Balancing به سراغ ابزاری می‌رویم که همه این امکانات را برای ما فراهم می‌کند.

Nginx

Nginx یک وب سرور با عملکرد بالا است که علاوه بر این، به عنوان یک پروکسی معکوس، پروکسی ایمیل، لود بالانسر و پروکسی عمومی TCP/UDP این سیستم برای اولین بار توسط ایگور سیسوئف توسعه یافت و در سال ۲۰۰۴ به صورت عمومی منتشر شد. Nginx به خاطر ثبات، مجموعه ویژگی‌های غنی، پیکربندی ساده و مصرف کم منابع شناخته شده است.
در اینجا به تفصیل به ویژگی‌ها و قابلیت‌های کلیدی آن می‌پردازیم:

  1. وب سرور: Nginx برای ارائه محتوای استاتیک به صورت سریع و کارآمد استفاده می‌شود. همچنین می‌توان از آن به عنوان وب سرور برای محتوای داینامیک نیز استفاده کرد، اگرچه این قابلیت معمولاً شامل واگذاری جنبه‌های داینامیک به یک سرور برنامه پشت Nginx است که به عنوان یک پروکسی معکوس استفاده می‌شود.
  2. Reverse Proxy: Nginx، می‌تواند ترافیک ورودی را بین چندین سرور پشتی توزیع کند، پاسخ‌ها را کش کند، و بهبود امنیت و عملکرد را فراهم کند. این برای تعادل بار بین چندین سرور برنامه یا برای کش کردن سایت‌های کند مبتنی بر پایگاه داده مورد استفاده قرار می‌گیرد.
  3. توزیع بار: سیستم توزیع بار Nginx می‌تواند درخواست مشتریان را بر اساس IP، URL و دیگر خصوصیات توزیع کند و از هر دو خصوصیت Active/Passive Healh Check پشتیبانی می‌کند تا اطمینان حاصل شود ترافیک فقط به سرورهای سالم هدایت می‌شود.
  4. کش Nginx: HTTP می‌تواند پاسخ‌ها را در کش ذخیره و بازیابی کند تا بار روی سرورهای برنامه را کاهش دهد و زمان پاسخ را سرعت ببخشد.
  5. فشرده‌سازی محتوا: Nginx، از فشرده‌سازی محتوا با استفاده از gzip پشتیبانی می‌کند تا مقدار داده‌هایی که باید از طریق شبکه ارسال شود را کاهش دهد.
  6. انعطاف‌پذیری در پیکربندی: فایل پیکربندی Nginx هم ساده و هم قدرتمند است، که امکان تغییر مسیر آسان، بازنویسی URL ها و بسیاری موارد دیگر را فراهم می‌کند.
  7. همزمانی (Concurrency): ابزار Nginx با معماری رویداد محور (event-driven architecture) خود، تعداد زیادی اتصال همزمان را بسیار کارآمد مدیریت می‌کند. این امر باعث سهولت هرچه بیشتر پاسخ دهی به درخواست کاربران می‌شود.

تمرین

با کمک Nginx Beginner’s Guide ابتدا این وب‌سرور را بر روی دستگاه خود نصب کنید. سپس با مطالعه این لینک و جست‌وجو در اینترنت کانفیگی ایجاد کنید که به نیازمندی‌های زیر پاسخ دهد:

  • با ارسال درخواست به آدرس /static فایل‌های درون دایرکتوری /usr/share/static نمایش داده شود. برای مثال هنگامی که کاربر آدرس http://localhost/static/style.css را درخواست می‌کند، فایل /usr/share/static/style.css به او نشان داده شود.
  • با ارسال درخواست به /api درخواست‌ها بین 3 آدرس google.com, yahoo.com و bing.com پخش شود.
  • درخواست‌های به آدرس /API به آدرس /api منتقل شود.
  • درخواست‌هایی از طرف curl و wget ارسال می‌شود با خطای 403 مواجه شود.