nginx

How to configure load balancing using Nginx

مزایای Load balancing

Load balancing یک روش عالی برای scale out کردن برنامه شما و افزایش عملکرد و redundancy آن است. Nginx ، یک نرم افزار وب سرور محبوب است که می تواند به عنوان یک load balancer ساده و در عین حال قدرتمند برای بهبود در دسترس بودن و کارایی منابع سرورهای شما تنظیم شود.

Nginx چگونه کار می کند؟ Nginx به عنوان یک entry point واحد به یک برنامه وب توزیع شده که روی چندین سرور جداگانه کار می کند ، عمل می کند.

این راهنما مزایای load balancing را توصیف می کند. بیاموزید که چگونه load balancing را با nginx برای سرورهای خود تنظیم کنید.

نصب nginx

اولین کاری که باید انجام دهید این است که یک host جدید راه اندازی کنید که به عنوان load balancer شما باشد.

بعد از اینکه سرور را به روشی که دوست دارید تنظیم کردید ، جدیدترین nginx پایدار را نصب کنید. از یکی از روشهای زیر استفاده کنید.

# Debian and Ubuntu

sudo apt-get update

sudo apt-get install nginx
# CentOS

sudo yum install epel-release

sudo yum update

sudo yum install nginx

پس از نصب ، دایرکتوری را به دایرکتوری اصلی تنظیمات nginx تغییر دهید.

cd /etc/nginx/

اکنون بسته به سیستم عامل شما ، پرونده های تنظیمات وب سرور در یکی از دو مکان قرار دارند.

Ubuntu و Debian ، قانونی را برای ذخیره فایل های virtual host در  /etc/nginx/sites-available/ که از طریق symbolic link به /etc/nginx/sites-enabled/ وصل می شوند ، دنبال می کنند. برای فعال کردن هرگونه فایل virtual host جدید می توانید از دستور زیر استفاده کنید.

sudo ln -s /etc/nginx/sites-available/vhost /etc/nginx/sites-enabled/vhost

کاربران CentOS می توانند فایل های تنظیمات host خود را در /etc/nginx/conf.d/ که هر فایل virtual host از نوع .conf در آنها load می شود ، پیدا کنند.

بررسی کنید که حداقل تنظیمات پیش فرض را پیدا کرده اید و سپس nginx را ریستارت کنید.

sudo systemctl restart nginx

بررسی کنید که سرور به درخواستهای HTTP پاسخ می دهد. آدرس IP عمومی سرور load balancer را در مرورگر خود باز کنید. وقتی صفحه پیش فرض welcome to nginx را مشاهده کردید ، نصب با موفقیت انجام شد.

اگر در load صفحه مشکلی دارید ، بررسی کنید که firewall اتصال شما را مسدود نمی کند. به عنوان مثال در CentOS 7 ، قوانین پیش فرض firewall اجازه ترافیک HTTP را نمی دهد ، آن را با دستورات زیر فعال کنید.

sudo firewall-cmd --add-service=http --permanent

sudo firewall-cmd --reload

تنظیم nginx به عنوان load balancer

هنگامی که nginx نصب و آزمایش شد ، شروع به تنظیم آن برای load balancing کنید. در واقع ، تمام کاری که شما باید انجام دهید این است که nginx را با دستورالعمل هایی برای گوش دادن به کدام نوع اتصال و هدایت مجدد آنها تنظیم کنید. با استفاده از ویرایشگر متنی که ترجیح می دهید ، یک فایل تنظیمات جدید ایجاد کنید. به عنوان مثال با nano:

sudo nano /etc/nginx/conf.d/load-balancer.conf

در load-balancer.conf باید دو بخش زیر را تعریف کنید ، upstream و server ، مثالهای زیر را ببینید.

#مشخص کنید که کدام سرورها را در طرح load balancing قرار دهید.

#بهتر است از IP های private سرورها برای عملکرد و امنیت بهتر استفاده کنید.

http {

   upstream backend {

      server 10.1.0.101; 

      server 10.1.0.103;

      server 10.1.0.102;

   }


   server {

      listen 80;

      location / {

          proxy_pass http://backend;

      }
   }
}

#این سرور تمام ترافیک را به پورت 80 می پذیرد و آن را به upstream منتقل می کند.

#توجه کنید که نام upstream و proxy_pass باید با هم مطابقت داشته باشند.

سپس فایل را ذخیره کرده و از ویرایشگر خارج شوید.

بعد ، تنظیمات پیش فرض سرور را که قبلاً آزمایش کرده اید پس از نصب غیرفعال کنید. باز هم بسته به سیستم عامل شما ، این قسمت کمی متفاوت است.

در سیستم های Debian و Ubuntu باید symbolic link پیش فرض را از پوشه فعال شده سایت ها حذف کنید.

sudo rm /etc/nginx/sites-enabled/default

host های CentOS از link یکسانی استفاده نمی کنند. در عوض ، به سادگی نام default.conf را در دایرکتوری  /conf.d به چیزی تغییر دهید که با .conf ختم نشود ، به عنوان مثال:

sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled

سپس برای ریستارت nginx از دستور زیر استفاده کنید.

sudo systemctl restart nginx

بررسی کنید nginx با موفقیت شروع شود. اگر ریستارت انجام نشد ، به etc/nginx/conf.d/load-balancer.conf/ که ایجاد کرده اید نگاهی بیندازید تا مطمئن شوید که غلط تایپی یا نقطه ویرگول از دست رفته وجود نداشته باشد.

وقتی آدرس IP پابلیک load balancer را در مرورگر وب خود وارد می کنید ، باید به یکی از سرورهای back-end بروید.

Load balancing methods

اگر هیچ method دیگری تعریف نشده باشد ، مانند مثال اول بالا ، load balancing با nginx به طور پیش فرض از الگوریتم round-robin استفاده می کند. با استفاده از round-robin ، هر سرور با توجه به ترتیبی که در فایل      load-balancer.conf تنظیم کرده اید ، به نوبت انتخاب می شود. این method تعداد ریکوئست ها را برای محیط های عملیاتی کوچک به یک اندازه متعادل می کند.

load balancing مبتنی بر اتصالات کم (Least connections) ، method ساده دیگری است. همانطور که از نام آن مشخص است ، این روش ریکوئست ها را به سمت سرور با کمترین ارتباط فعال در آن زمان هدایت می کند. با برنامه هایی که ممکن است تکمیل ریکوئست هاشون گاهی بیشتر طول بکشد ، نسبت به round-robin کارایی بیشتری دارد.

برای فعال کردن روش least connections balancing ، پارامتر least_conn را به قسمت upstream خود اضافه کنید همانطور که در مثال زیر نشان داده شده است.

upstream backend {

   least_conn;

   server 10.1.0.101; 

   server 10.1.0.102;

   server 10.1.0.103;

}

طرح های بالانسینگ Round-robin و least connections عادلانه هستند و کاربردهای خود را دارند. با این حال ، آنها نمی توانند پایداری session را فراهم کنند. اگر برنامه وب شما مستلزم آن است که کاربران بعداً به همان سرور  back-end که در هنگام اتصال قبلی خود به آن وصل شده بودند، هدایت شوند ، به جای آن از روش IP hashing استفاده کنید. IP hashing با استفاده از آدرس IP بازدید کنندگان به عنوان یک کلید تعیین می کند که کدام host برای سرویس دهی به ریکوئست انتخاب شود. این اجازه می دهد که بازدیدکنندگان هر بار به همان سرور قبلی هدایت شوند ، با در نظر گرفتن اینکه سرور در دسترس است و آدرس IP بازدید کننده تغییر نکرده است.

برای استفاده از این روش ، پارامتر ip_hash را به بخش upstream خود اضافه کنید مانند مثال زیر.

upstream backend {

   ip_hash;

   server 10.1.0.101; 

   server 10.1.0.102;

   server 10.1.0.103;

}

در تنظیمات سرور که منابع موجود بین host های مختلف برابر نیستند ، ممکن است مطلوب باشد برخی از سرورها را نسبت به بقیه مورد علاقه قرار دهید. تعریف وزن سرور به شما امکان می دهد تا load balancing را با nginx تنظیم کنید. سرور با بیشترین وزن در load balancer ، بیشتر مورد انتخاب قرار می گیرد.

upstream backend {

   server 10.1.0.101 weight=4; 

   server 10.1.0.102 weight=2;

   server 10.1.0.103;

}

به عنوان مثال در تنظیمات نشان داده شده در بالا ، سرور اول دو برابر بیشتر از سرور دوم انتخاب می شود ، که دوباره دو برابر ریکوئست نسبت به سرور دوم دریافت می کند.

Load balancing با HTTPS

HTTPS را برای سایت خود فعال کنید ، این یک روش عالی برای محافظت از بازدید کنندگان و داده های آنها است. اگر هنوز رمزگذاری را روی host های وب خود اجرا نکرده اید ، به شما توصیه می کنیم حتماً به راهنمای ما برای نحوه نصب Let’s Encrypt در nginx نگاهی بیندازید.

استفاده از رمزگذاری با load balancer آسانتر از آن است که تصور می کنید. تمام کاری که شما باید انجام دهید این است که بخش دیگری از سرور را به فایل تنظیمات load balancer خود اضافه کنید که به ترافیک HTTPS در پورت 443 با SSL گوش دهد. سپس proxy_pass را در بخش upstream خود مانند HTTP در مثال قبلی تنظیم کنید.

فایل تنظیمات خود را مجدداً برای ویرایش باز کنید.

sudo nano /etc/nginx/conf.d/load-balancer.conf

سپس بخش server زیر را به انتهای فایل اضافه کنید.

server {

   listen 443 ssl;

   server_name domain_name;

   ssl_certificate /etc/letsencrypt/live/domain_name/cert.pem;

   ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;

   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

   location / {
      proxy_pass http://backend;
   }
}

سپس فایل را ذخیره کنید ، از ویرایشگر خارج شوید و nginx را ریستارت کنید.

sudo systemctl restart nginx

تنظیم رمزگذاری در load balancer هنگام استفاده از اتصالات شبکه private به back-end ، مزایای بزرگی دارد.

با HTTPS فعال شده همچنین می توانید رمزگذاری را برای همه اتصالات به load balancer خود اعمال کنید. کافی است بخش server خود را که به پورت 80 گوش می دهد با نام سرور و تغییر مسیر به پورت HTTPS خود به روز کنید. سپس قسمت location را حذف یا کامنت کنید، زیرا دیگر نیازی به آن نیست. مثال زیر را ببینید.

server {

   listen 80;

   server_name domain_name;

   return 301 https://$server_name$request_uri;

  #location / {
  #    proxy_pass http://backend;
  #}
}

پس از ایجاد تغییرات ، فایل را دوباره ذخیره کنید. سپس nginx را ریستارت کنید.

sudo systemctl restart nginx

اکنون تمام اتصالات به load balancer شما از طریق یک اتصال رمزگذاری شده HTTPS ارائه می شود. ریکوئست های HTTP رمزگذاری نشده نیز به استفاده از HTTPS هدایت می شوند. این یک انتقال یکپارچه به رمزگذاری است. هیچ کاری از سمت بازدید کنندگان شما لازم نیست انجام شود.

Health checks

برای اینکه بدانید کدام سرورها در دسترس هستند ، پیاده سازی nginx reverse proxy  شامل بررسی های health سرور است. اگر سرور نتواند به ریکوئست شما پاسخ دهد یا با خطا دهد ، nginx متوجه خواهد شد که سرور از کار افتاده است. سعی خواهد کرد برای مدتی از ارسال ارتباطات به آن سرور جلوگیری کند.

تعداد تلاشهای پی در پی اتصال ناموفق در یک بازه زمانی خاص را می توان در فایل تنظیمات load balancer تعریف کرد. یک پارامتر max_fails را در خطوط server ست کنید. به طور پیش فرض ، وقتی هیچ max_fails مشخص نشده باشد ، این مقدار روی 1 تنظیم می شود. در صورت انتخاب max_fails روی 0 ، بررسی های سلامتی در آن سرور غیرفعال می شود.

اگر max_fails روی مقداری بیشتر از 1 تنظیم شود ، fail های بعدی باید در یک بازه زمانی خاص اتفاق بیفتند تا شمارش نشود. این چارچوب زمانی توسط پارامتر fail_timeout مشخص می شود ، که همچنین مشخص می کند که سرور باید چه مدت خرابی در نظر گرفته شود. به طور پیش فرض ، fail_timeout روی 10 ثانیه تنظیم شده است.

بعد از اینکه یک سرور ناموفق تشخیص داده شد و زمان تعیین شده توسط fail_timeout سپری شد ، nginx با ریکوئست های مشتری با سرعتی بالا سرور را بررسی می کند. در صورت بازگشت موفقیت آمیز کاوشگرها ، سرور دوباره به صورت live علامت گذاری شده و به صورت عادی در load balancing قرار می گیرد.

upstream backend {

   server 10.1.0.101 weight=5;

   server 10.1.0.102 max_fails=3 fail_timeout=30s;

   server 10.1.0.103;

}

نتیجه گیری در مورد مزایای load balancing

اگر می خواهید عملکرد و در دسترس بودن برنامه وب خود را بهبود ببخشید ، قطعاً یک load balancer باید مورد توجه قرار گیرد. راه اندازی Nginx در عین حال یک ابزار نسبتاً ساده برای بارگذاری متعادل وب سرور است. همراه با یک راه رمزگذاری آسان ، مانند Let’s Encrypt client ، یک front-end عالی برای web farm شما ایجاد می کند. برای کسب اطلاعات بیشتر ، اسناد مربوط به بالادست را در nginx.org بررسی کنید.

هنگامی که از چندین host استفاده می کنید از وب سرویس شما با redundancy محافظت می کند ، load balancer هنوز هم می تواند یک single point of failure برجای بگذارد. با تنظیم IP متغیر بین چندین load balancer ، می توانید در دسترس بودن را بیشتر بهبود ببخشید.

0 دیدگاه در “How to configure load balancing using Nginxافزودن → خودتان

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *