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 میتوانید از این لینک استفاده کنید.
حال فرض کنید این وبسایت راه ا ندازی شده چندین سرویس مختلف ارائه میدهد و هر سرویس بار بسیار زیادی را تحمل میکند. تعداد درخواستها به هر سرور بسیار زیاد شده است و یک سرور نمیتواند به همه درخواستها بدرستی و در زمان کوتاه پاسخ دهد. حال این چالش را میتوان به روشهای مختلفی حل کرد:
- اضافه کردن منابع (CPU و RAM و Disk و ...) سرور که با هزینه زیادی همراه است و scalable هم نیست.
- اضافه کردن چند سرور با وظایف مشابه و تقسیم بار روی چندین سرور به جای یک سرور که این حالت 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
به خاطر ثبات، مجموعه ویژگیهای غنی، پیکربندی ساده و مصرف کم منابع شناخته شده است.
در اینجا به تفصیل به ویژگیها و قابلیتهای کلیدی آن میپردازیم:
- وب سرور: Nginx برای ارائه محتوای استاتیک به صورت سریع و کارآمد استفاده میشود. همچنین میتوان از آن به عنوان وب سرور برای محتوای داینامیک نیز استفاده کرد، اگرچه این قابلیت معمولاً شامل واگذاری جنبههای داینامیک به یک سرور برنامه پشت Nginx است که به عنوان یک پروکسی معکوس استفاده میشود.
- Reverse Proxy: Nginx، میتواند ترافیک ورودی را بین چندین سرور پشتی توزیع کند، پاسخها را کش کند، و بهبود امنیت و عملکرد را فراهم کند. این برای تعادل بار بین چندین سرور برنامه یا برای کش کردن سایتهای کند مبتنی بر پایگاه داده مورد استفاده قرار میگیرد.
- توزیع بار: سیستم توزیع بار Nginx میتواند درخواست مشتریان را بر اساس IP، URL و دیگر خصوصیات توزیع کند و از هر دو خصوصیت Active/Passive Healh Check پشتیبانی میکند تا اطمینان حاصل شود ترافیک فقط به سرورهای سالم هدایت میشود.
- کش Nginx: HTTP میتواند پاسخها را در کش ذخیره و بازیابی کند تا بار روی سرورهای برنامه را کاهش دهد و زمان پاسخ را سرعت ببخشد.
- فشردهسازی محتوا: Nginx، از فشردهسازی محتوا با استفاده از gzip پشتیبانی میکند تا مقدار دادههایی که باید از طریق شبکه ارسال شود را کاهش دهد.
- انعطافپذیری در پیکربندی: فایل پیکربندی Nginx هم ساده و هم قدرتمند است، که امکان تغییر مسیر آسان، بازنویسی URL ها و بسیاری موارد دیگر را فراهم میکند.
- همزمانی (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
مواجه شود.