Salam dostlar,
"Nginx" ilə bağlı əvvəlki məqaləmin birinci hissəsində "Nginx"-ə nəzəri giriş edərək quraşdırılma prosesini icra etmişdim. Bu məqaləmdə isə (həmçinin birinci məqaləmdə ikinci hissə məqalənin yazılmasına görə verilmiş müsbət rəylərə əsasən) "Nginx"-in ayarlanması, nəzəri olaraq "forward", "reverse proxy" və "load balancer", eləcə də "failover scenario"-nun yaradılaraq "test simulation" prosesinin icra edilməsini həyata keçirəcəyik. Beləliklə, ilk olaraq "forward", "reverse proxy" və "load balancer" haqqında qısaca bəhs etmək istərdim.
- "Forward Proxy Server" - düz "proxy server" anlamını ifadə edir və həmçinin "proxy server" kimi də adlanır. Bu zaman "client" kompüterlər "forward proxy server"-in adından sorğular göndərir ki, "forward proxy server" "client"-ın kimliyini kənardan (serverlərdən) gizlətmiş olur;
- "Reverse Proxy Server" - əks "proxy server" anlamını ifadə edir və müəyyən funksionallıq baxımından "forward proxy server"-ə bənzəsə də, lakin "forward proxy server"-in gördüyü işin əksini edir. Yəni bu zaman "server" kompüterlər "reverse proxy server"-in adından sorğular göndərir ki, "reverse proxy server" "server"-in kimliyini kənardan (client-lardan) gizlətmiş olur ki, bu da "server"-i kənar müdaxilə və təhlükəli vəziyyətlərdən qorumuş olur;
- "Load Balancer" - yük balanslaşdırıcısı funksiyasını icra edir. Qeyd etdiyimiz kimi, bəzən "reverse proxy server" yük balanslaşdırıcısı (load balancer) kimi fəaliyyət göstərə bilir ki, bu zaman hər bir yük balanslaşdırıcısı (load balancer) əks (reverse) "proxy server" olmalıdır. Beləliklə, "load balancer"-in rolu "client" sorğularının yükünü "server"-lər arasında bölüşdürməkdir.
Beləliklə, "Nginx"-in "forward", "reverse proxy" və "load balancer" kimi fəaliyyət göstərmək qabiliyyəti, onu bir çox veb proqramlar və arxitekturalar üçün daha da fuksional edir.
- "Failover Scenario"-nun qurulması:
Bu test mühitinin qurulması üçün, ən azından iki ədəd "web server" platformasının (Nginx) qurulması lazımdır ki, bu zaman bir "web server"-də nasazlıq baş verərsə, "redundancy" və "failover" imkanların tətbiq edilməsi ilə digər "web server"-in əlçatan olması təmin olunsun. Beləliklə, hal-hazırda mənim "Nginx" ilə yüklənmiş iki ədəd "web server" platforması mövcuddur və ediləcək prosedurlar aşağıdakı kimidir:
- İlk öncə "Nginx" quraşdırdığımız hər iki "server"-də "Nginx"-in həm "service", həm də konfiqurasiya (fayl) səviyyəsində funksionallığını, yəni hər hansı bir xətanın olub-olmadığını yoxlamaq olmaq üçün əmrləri icra edirik;
2. Hər iki "server"-də "proxy"-nin qurulması və ayarlanması üçün "/etc/nginx/conf.d/" qovluğunda (directory) "proxy.conf" adlı fayl yaradaraq xüsusi ayarları tənzimləyirik. Qeyd edim ki, həmin faylda "upstream backend" sətrinin altında yer alan birinci sətrdəki "server" sözünün qarşısına ikinci "web server ip" ünvanını, həmin sətrin altında yer alan ikinci sətrdəki "server" sözünün qarşısına (backup sözü olan sətrdə) isə birinci "web server ip" ünvanını daxil edirik. Ayarlar daxil edildikdən sonra "systemctl restart nginx" əmri icra edilməklə "web service" yenidən başladılır;
Yaratdığımız bu konfiqurasiya faylında yer alan sətrlərin izahını təqdim edirəm:
- "upstream backend" - "load balance" tətbiq olunacaq serverlər qrupunu müəyyən edir və burada "backend" sözü "default" sözdür və bu sözün yerinə istəyə bağlı olan istənilən söz qeyd oluna bilər;
- "server x.x.x.x. ip" - "backend" qrupuna daxil olan "server"-dir və bu sətrdə ikinci "server"-in "ip" ünvanı qeyd olunur;
- "server x.x.x.x. ip backup" - "backend" qrupuna daxil olan "server"-dir, burada "backup" sözü o deməkdir ki, həmin qrupda hər hansı bir "server" sıradan çıxarsa, məhz bu "server" yükü balanslaşdırmaq üçün (load balancer) olaraq işə düşür. Bu sətrdə isə birinci "server"-in "ip" ünvanı qeyd olunur;
- "listen 80" - yalnız 80 portundan gələn sorğular dinlənilməlidir;
- "location / " - "root" ("/") yerini müəyyən edir;
- "proxy_pass http://backend" - daxil olan sorğuların (request), "backend" qrupunda yer alan "server"-lərdən birinə yönlədirilməsini təmin edir;
- "proxy_set_header Host $host" - "backend" qrupunda olan "server"-lərin gələn sorğuları düzgün idarə edə bilməsini təmin edir ki, burada "host" dəyərdir (value);
- "proxy_set_header X-Real-IP $remote_addr" - istəyə bağlı olan bir seçimdir və gələn sorğunun "client ip" ünvanına təyin edilməsini təmin edir.
Ümumiyyətlə nəticə olaraq qeyd edim ki, bu ayarlanma prosesi "load balancer" və "reverse proxy" kombinasiyasını təşkil etməklə müəyyən alqoritmə əsaslanaraq sorğuları iki "backend server"-dən (məs: web server 1&2) birinə yönləndirir ki, "backend server"-lərdən biri əlçatmaz olarsa, "Nginx" avtomatik olaraq trafikin digər serverə yönləndirilməsini təmin etmiş olur.
3. Hər iki "server"-də "proxy" ayarlarının (load balancer və reverse proxy) funksional olmasını xüsusi əmr vasitəsilə yoxlayırıq;
- Əsas (birinci) "server"-də "load balancer"-i yoxlayırıq və nəticə uğurludursa aşağıdakı kimi yekun nəticə əldə olunacaqdır;
- İkinci "server"-də "reverse proxy"-ni yoxlayırıq, bu zaman əsas (yəni birinci) "server"-dən cavab (reply) gəlib-gəlmədiyi yoxlanmış olur və nəticə uğurludursa aşağıdakı kimi yekun nəticə əldə olunacaqdır;
Qeyd:
"curl http://localhost" əmrində yekun nəticəni yoxlamaq üçün "localhost" yerinə "server"-in həm öz, həm də digərinin "ip" ünvanı qeyd oluna bilər ki, bu zaman hər iki "server" arasında əlaqənin uğurlu olması da bir daha təsdiqlənmiş olur.
"Failure Scenario"
4. "Server"-in sıradan çıxarılması simulyasiyanı (failure scenario) tətbiq etməklə, əsas (birinci) "server"-də "nginx service"-i dayandırmaqla, digər "server"-in funksional olub-olmamasını yoxlayırıq və nəticə uğurludursa aşağıdakı kimi yekun nəticə əldə olunacaqdır;
5. İndi isə, ikinci "server"-də "curl http://localhost" əmrini icra edirik və nəticə uğurludursa aşağıdakı kimi yekun nəticə əldə olunacaqdır;
6. İkinci "server"-də "nginx service"-i dayandırmaqla, digər "server"-in funksional olub-olmamasını yoxlayırıq və nəticə uğurludursa aşağıdakı kimi yekun nəticə əldə olunacaqdır;
Qeyd:
Əsas (birinci) "server"-də "nginx service" işlək vəziyyətə qaytarıldı ki, nəticə olaraq statusu aktiv vəziyyətdədir;
Qeyd:
Əsas (birinci) "server"-də "nginx service" işlək vəziyyətdə olmasına baxmayaraq "browser"-də "internal server error" tipli xəta bildirişi verdi;
Dostlar,
Güman edirəm ki, ikinci hissə olan bu praktiki məqaləm maariflənməniz istiqamətində sizin üçün faydalı olar.
Təşəkkür edirəm
Hörmətlə,
Müəllif
Araz Əhmədov
Comments
Post a Comment