NGINX'in bu aşamasında Load Balancer notlarımı aktaracağım. Uzun bir yazı olacak ve uzun bir yazı olması için yine elimden geleni yapacağım. Yine Vagrant yardımı ile VM'ler kurup ilerlemeyi düşünüyorum. Bu sefer farklı distrolar yerine ayağa kaldıracağım VM'lerin hepsi CentOS7 olacak. Load Balancer tanımını veya açıklamalarını bulamayacağınız bir blog yazısı okuyorsunuz. Dediğim gibi bu blog öğreticiden çok öğrendiklerimi notlara döktüğüm ve uyguladığım yerler. Aslında tarifleri sakladığım bir yer olarak düşünebilirsiniz. Yine Load Balancer için basit ve analojik bir tanım için şu cümleyi kurabilirim; Client ile Server arasındaki trafik polisi. Client yol üzerindeki taşıtlarsa eğer Server ise Client tarafından kullanılan kara yolarıdır. Trafik Polisi, yolların kapasitesine göre araç yoğunluğunu olabildiğince tüm yollara optimal seviyede dağıtmak için araçları yönlendirmek isteyecektir. Tam olarak Load Balancer'da bu görevi üstlenmektedir; sunucuların kapasitesine göre request yoğunluğunu en verimli şekilde sunucular arasında dağıtmak. Bu analoji ile uygulamaya başlayabiliriz. Her zaman olduğu gibi yine yazıdan çok code snippet göreceğiz.
VM'lerimizi ayağa kaldıralım. Tüm hepsi için ortak paketlere ihtiyacımız olacağından dolayı bu sefer kurulum aşamasında provision sağlamak istiyorum, bunun için basit bir bash scripti yazalım ve Vagrantfile'ın bu scripti VM'lerin ayağa kaldırma sırasında otomatik olarak çalıştırmasını isteyelim.
#!/bin/bash
sudo -i
yum update -y
yum install epel-release -y
yum install nginx -y
yum install vim -y
yum install net-tools -y
service nginx start
service nginx status
İhtiyaçlarımız bu şekilde. Şimdi de Vagrantfile'a göz atalım.
Vagrant.configure("2") do |config|
### nginx vm ###
config.vm.define "prx01" do |prx01|
prx01.vm.box = "centos/7"
prx01.vm.hostname = "prx01"
prx01.vm.network "private_network", ip: "192.168.62.12"
prx01.vm.network "public_network", bridge: "wlp0s20f3"
end
### server 1 vm ###
config.vm.define "lb1" do |lb1|
lb1.vm.box = "centos/7"
lb1.vm.hostname = "lb1"
lb1.vm.network "private_network", ip: "192.168.62.14"
lb1.vm.network "public_network", bridge: "wlp0s20f3"
end
### server 2 vm ###
config.vm.define "lb2" do |lb2|
lb2.vm.box = "centos/7"
lb2.vm.hostname = "lb2"
lb2.vm.network "private_network", ip: "192.168.62.15"
lb2.vm.network "public_network", bridge: "wlp0s20f3"
end
config.vm.provision "shell", path: "/.../.../init.sh"
end
Üç farklı centOS ayağa kaldırıyoruz. Hepsi için Statik IP belirledik, ayağa kaldırma aşamasında bridge onayı almasını istemediğimiz için default bridge belirledik ve sonra olarak provision ile çalıştırmasını istediğimiz bash scripti konumunu gösterdik. O halde hepsini ayağa kaldıralım.
$ vagrant up
Bringing machine 'prx01' up with 'virtualbox' provider...
Bringing machine 'lb1' up with 'virtualbox' provider...
Bringing machine 'lb2' up with 'virtualbox' provider...
==> prx01: Importing base box 'centos/7'...
...
...
==> lb1: Importing base box 'centos/7'...
...
...
==> lb2: Importing base box 'centos/7'...
...
...
Üç VM ayağı kalktığına göre ilk olarak lb1 ve lb2 serverları ayarlayalım. O ikisiyle çok fazla işimiz olmayacak. Sadece test amaçlı birer araç olarak düşünelik. lb1 ve lb2 bizim backend sunucularımız ve requestler belirli algoritmalar ile bu iki sunucudan birine gidecek. Bu algoritmalara birazdan değineceğim. Dediğim öncelikle bu iki sunucuyu hızlıca ayaklandıralım ve köşeye alalım. Bu ayarları tek bir code snippet ile göstereceğim. İlki için yaptıklarımın aysını ikinci sunucu için de yapacağım için çok fazla kod parçasına yer vermeden işi bitireceğim.
$ vagrant ssh lb1
$ sudo -i
[root@lb1 ~]$
$ vim /etc/nginx/conf.d/server.conf
server {
server_name 192.168.62.14;
location / {
root /var/www/web;
index index.html;
}
}
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ mkdir /var/www/web
$ vim /var/www/web/index.html
BURASI BIRINCI SERVER!! LB-1
$ chown -R nginx.nginx /var/www/web/
$ ls -al /var/www/
drwxr-xr-x. 2 nginx nginx 24 Ağu 26 14:55 web
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: disabled
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
$ vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
$ shutdown -r now
Connection to 127.0.0.1 closed by remote host.
Connection to 127.0.0.1 closed.
$ vagrant ssh lb1
$ sudo -i
$ sestatus
SELinux status: disabled
$ service nginx restart
Redirecting to /bin/systemctl restart nginx.service
$ curl 192.168.62.14
BURASI BIRINCI SERVER!! LB-1
$ curl -I 192.168.62.14
HTTP/1.1 200 OK
Server: nginx/1.20.1
Ben iki server için gerekli ayarları yaptım. Burada sadecec birini gösterdim. İkincisi için, ikinci server rahat anlaşılsın diye index.html içeriğini değiştirdim ve tabii server_name directive'ini değiştirdim. Onun dışında hepsi aynı ki zaten temel düzeyde basit ayarlar bunlar. Hızlıca ne yaptığımızı gözden geçirelim. SSH bağlantısı kurduk, server_name belirledik ki bu Static IP, dosya dizinine bakmasi için root ayarladık, default index directive'ini ayarladık ki basit bir web için yeterli. İlgili konumu ve index.html'i oluşturduk. Worker Process kullanıcımız nginx olduğundan dolayı bu kullanıcıyı ilgili dizinle eşleştirdik. SELinux'u kısa çözüm olarak disabled konumuna getirdik ve son olarak NGINX servisini yeniden başlattık. curl ile request attığımızda da herhangi bir sıkıntının olmadığını kontrol ettik. Buraya kadar ihtiyaçlarımızı karşıladık. Şimdi gelelim eğlenceli kısıma. prx01 ile SSH bağlantısı kuralım ve yavaş yavaş ilerleyelim.
vagrant ssh prx01
$ sudo -i
[root@prx01 ~]$
Bağlantımızı yaptığımıza göre web.conf dosyamızı ngx_http_upstream_module ile yapılandıralım. Modülü linkledim.
$ vim /etc/nginx/conf.d/web.conf
upstream backend {
server 192.168.62.14;
server 192.168.62.15;
}
server {
server_name 192.168.62.12;
listen 80;
location / {
proxy_pass http://backend;
}
}
192.168.62.13'ü server olara düşündüğümüzde bu IP adresine gelen her request sırasıyla upstrean server'a yönlendirilecek. Dediğim gibi bunun farklı algoritmlaları bunları tek tek not alarak ilerleyeceğim. Şu anda bu aşamayı test etmek istiyorum. Server'a birden çok request gönderelim ve sonucu inceleyelim.
$ curl http://192.168.62.12
BURASI IKINCI SERVER!! LB-2
$ curl http://192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl http://192.168.62.12
BURASI IKINCI SERVER!! LB-2
$ curl http://192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl http://192.168.62.12
BURASI IKINCI SERVER!! LB-2
$ curl http://192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl http://192.168.62.12
BURASI IKINCI SERVER!! LB-2
$ curl http://192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl http://192.168.62.12
BURASI IKINCI SERVER!! LB-2
$ curl http://192.168.62.12
BURASI BIRINCI SERVER!! LB-1
Her bir requestin sırasıyla iki sunucuya yönlendirildiğini görüyoruz. Buraya kadar herhangi bir sıkıntımız yok. Basit düzeyde bir altyapımızı oluşturduk. Farklı senaryolar ile devam edelim. Bu aşamadan sonra bazı parametrelerden söz etmek istiyorum. Yukarılarda bir yerde bıraktığım linkler arasında bu parametreli inceleyebilirsin. Bazılarını şimdi ele alalım. İlk parametremiz weight. Server'ın önceliğini belirlediğimiz bir parametre diğer bir ifade ile ağırlığını. Örneğin lb1 için weight parametresinin ağırlığını 3 olarak belirlediğimiz düşünürsek. İlk üç request lb1'e gelecektir.
upstream backend {
server 192.168.62.14 weight=3;
server 192.168.62.15;
}
$ service nginx restart
Redirecting to /bin/systemctl restart nginx.service
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI IKINCI SERVER!! LB-2
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI IKINCI SERVER!! LB-2
Bir sonraki parametre down parametresi. Bu parametre ile server kalıcı olarak kulllanılamaz olarak işaretlenir. Diğer bir ifade tüm requestler bu server dışındaki serverlara dağılır. Hemen örnek olarak gösterelim.
upstream backend {
server 192.168.62.14;
server 192.168.62.15 down;
}
$ service nginx restart
Redirecting to /bin/systemctl restart nginx.service
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
$ curl 192.168.62.12
BURASI BIRINCI SERVER!! LB-1
Devam edecek ....
İletişime geçmek, yorum bırakmak veya hatalarımı düzetlmek istersen mail atabilirsin.