﻿
{"id":21906,"date":"2021-06-07T00:02:25","date_gmt":"2021-06-07T00:02:25","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=21906"},"modified":"2021-06-07T00:02:25","modified_gmt":"2021-06-07T00:02:25","slug":"docker-nginx-sunucusu-ile-load-balancing-operasyonu","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/docker-nginx-sunucusu-ile-load-balancing-operasyonu\/","title":{"rendered":"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>\u00d6nceki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/load-balancingyuk-dengeleme-ve-load-balanceryuk-dengeleyici-nedir\/\" rel=\"noopener\" target=\"_blank\">Load Balancing(Y\u00fck Dengeleme) ve Load Balancer(Y\u00fck Dengeleyici) Nedir?<\/a> ve <a href=\"https:\/\/www.gencayyildiz.com\/blog\/docker-ocelot-kutuphanesi-ile-load-balancing-operasyonu\/\" rel=\"noopener\" target=\"_blank\">Docker + Ocelot K\u00fct\u00fcphanesi \u0130le Load Balancing Operasyonu<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131lar\u0131m\u0131zda load balancing ve load balancer \u00fczerine hasbelkader irdelemelerde bulunmu\u015ftuk. Bu i\u00e7eri\u011fimizde ise load balancing operasyonu i\u00e7in olduk\u00e7a elveri\u015fli olan, kurulumu basit lakin i\u015flevsel a\u00e7\u0131dan olduk\u00e7a etkili Nginx teknolojisi \u00fczerinden incelemede bulunuyor olaca\u011f\u0131z. \u0130lk olarak Nginx&#8217;in ne oldu\u011fundan bahsedecek, ard\u0131ndan Nginx sunucunun Windows ve Docker ortamlar\u0131nda nas\u0131l aya\u011fa kald\u0131r\u0131ld\u0131\u011f\u0131na de\u011finecek ve nihai olarak load balancing operasyonunu t\u00fcm detaylar\u0131yla pratikte ele al\u0131yor olaca\u011f\u0131z. O halde buyrun ba\u015flayal\u0131m&#8230;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/nginx.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/nginx.png\" alt=\"\" width=\"590\" height=\"182\" class=\"aligncenter size-full wp-image-22038\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/nginx.png 590w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/nginx-300x93.png 300w\" sizes=\"auto, (max-width: 590px) 100vw, 590px\" \/><\/a><\/p>\n<h6>Nginx Nedir?<\/h6>\n<p>2002 y\u0131l\u0131nda Igor Sysoev taraf\u0131ndan geli\u015ftirilmi\u015f olan Nginx; kitlesel uygulamalar i\u00e7in y\u00fcksek e\u015f zamanl\u0131 \u00e7al\u0131\u015fma kabiliyeti, y\u00fcksek performans ve d\u00fc\u015f\u00fck haf\u0131za kullan\u0131m\u0131na odaklan\u0131larak tasarlanm\u0131\u015f bir web sunucusudur. Load balancing&#8217;in d\u0131\u015f\u0131nda HTTP cache, Microservice ve g\u00fcvenlik konular\u0131na da \u00e7\u00f6z\u00fcmler getirmektedir.<\/p>\n<blockquote><p><em style=\"color:orange;\">Nginx, genellikle yaz\u0131l\u0131mlardaki y\u00fckleri da\u011f\u0131tabilmek i\u00e7in load balancing operasyonlar\u0131nda tercih edilmektedir lakin tek yapt\u0131\u011f\u0131 hizmet bu de\u011fildir&#8230;<\/em><\/p><\/blockquote>\n<h3>Nginx Kurulumu<\/h3>\n<p>Nginx; Unix, Linux, Mac OS X, Solaris, Windows vs. gibi i\u015fletim sistemlerinde kurularak \u00e7al\u0131\u015ft\u0131r\u0131labildi\u011fi gibi Docker gibi sanalla\u015ft\u0131rma ortamlar\u0131nda da aya\u011fa kald\u0131r\u0131larak rahatl\u0131kla kullan\u0131labilir. \u0130\u015fletim sistemlerinde kurulmu\u015f yahut sanalla\u015ft\u0131rma ortamlar\u0131nda aya\u011fa kald\u0131r\u0131lm\u0131\u015f Nginx sunucusunda load balancing operasyonunu icra edebilmek i\u00e7in ilgili sunucu i\u00e7erisindeki <code style=\"font-size:13px;\">nginx.conf<\/code> isimli dosya \u00fczerinde gerekli ayarlamalar\u0131n yap\u0131lmas\u0131 gerekmektedir. Bu dosyan\u0131n nerede oldu\u011fu, hangi ayarlar\u0131n ne \u015fekilde yap\u0131laca\u011f\u0131 vs. t\u00fcm teferruat\u0131yla bu i\u00e7eri\u011fimizin sonraki sat\u0131rlar\u0131nda incelenece\u011finden dolay\u0131 \u015fimdilik oralara temas etmemeksizin \u00f6ncelikle konumuz olan kuruluma odaklanarak devam edelim.<\/p>\n<h6>Windows Kurulumu ve Windows Platformunda Load Balancing<\/h6>\n<p>Nginx&#8217;i Windows platformuna fiziksel olarak kurmak ve \u00e7al\u0131\u015ft\u0131rmak istiyorsan\u0131z e\u011fer <a href=\"http:\/\/nginx.org\/en\/download.html\" rel=\"noopener\" target=\"_blank\">nginx.org\/en\/download.html<\/a> adresinden indirebilir ve direkt olarak \u00e7al\u0131\u015ft\u0131rabilirsiniz. \u0130lgili adrese girildi\u011finde<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-300x250.png\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"300\" height=\"250\" class=\"alignleft size-medium wp-image-21920\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-300x250.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu.png 513w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>yandaki g\u00f6rseldeki gibi <em>Mainline version<\/em> alt\u0131ndaki ilgili linke t\u0131klayarak Nginx&#8217;in en sonuncu kararl\u0131 s\u00fcr\u00fcm\u00fcne dair .exe uzant\u0131l\u0131 dosyas\u0131n\u0131 edinebilirsiniz. Bu dosya sayesinde kurulum yapmaya gerek duymaks\u0131z\u0131n direkt sunucuyu \u00e7al\u0131\u015ft\u0131rabilirsiniz.<br \/>\n<span style=\"font-size:9px;\">(Not : Bu i\u00e7eri\u011fin klavyeye al\u0131nd\u0131\u011f\u0131 tarihten sonraki s\u00fcr\u00fcmler do\u011fal olarak de\u011fi\u015fiklik g\u00f6sterebilir.)<\/span><\/p>\n<p>Linke t\u0131klay\u0131p, ilgili sunucu dosyalar\u0131n\u0131 indirdi\u011finizi varsayarsak e\u011fer ilgili .zip dosyas\u0131n\u0131 a\u00e7t\u0131\u011f\u0131n\u0131zda i\u00e7erisindeki klas\u00f6rlerin ve dosyalar\u0131n a\u015fa\u011f\u0131daki gibi oldu\u011funu g\u00f6receksiniz;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-1.png\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"195\" height=\"151\" class=\"alignright size-full wp-image-21925\" \/><\/a>Burada dikkat ederseniz gelen 6 klas\u00f6rden &#8216;conf&#8217;u ve &#8216;nginx.exe&#8217; dosyas\u0131n\u0131 vurgulam\u0131\u015f bulunmaktay\u0131z.<\/p>\n<p><em style=\"color:purple;\">&#8216;conf&#8217; klas\u00f6r\u00fc<\/em>; i\u00e7erisinde Nginx sunucusuna dair gerekli konfig\u00fcrasyonlar\u0131 bar\u0131nd\u0131ran bir klas\u00f6rd\u00fcr. Bu konfig\u00fcrasyonlarda sonraki sat\u0131rlarda g\u00f6rece\u011fimiz load balancing operasyonlar\u0131n\u0131 yap\u0131land\u0131rmaktay\u0131z. Misal olarak bu yap\u0131land\u0131rmalar; Nginx sunucusunun hangi portta aya\u011fa kalkaca\u011f\u0131, Nginx&#8217;e gelen isteklerin hangi sunuculara y\u00f6nlendirilece\u011fi vs. olacakt\u0131r.<\/p>\n<p><em style=\"color:purple;\">&#8216;nginx.exe&#8217; dosyas\u0131<\/em>; Nginx sunucusunu kuruluma gerek duymamaks\u0131z\u0131n aya\u011fa kald\u0131rmam\u0131z\u0131 sa\u011flayan .exe dosyas\u0131d\u0131r.<\/p>\n<p><strong>Windows Ortam\u0131nda nginx.conf Dosyas\u0131n\u0131n Yap\u0131land\u0131r\u0131lmas\u0131<\/strong><br \/>\nWindows ortam\u0131nda Nginx&#8217;i \u00e7al\u0131\u015ft\u0131rabilmek ve sunucular\u0131m\u0131za load balancing operasyonunu ger\u00e7ekle\u015ftirebilmek i\u00e7in ilk olarak &#8216;conf&#8217; klas\u00f6r\u00fc i\u00e7erisindeki &#8216;nginx.conf&#8217; dosyas\u0131n\u0131 a\u00e7\u0131p, yap\u0131land\u0131rmam\u0131z gerekmektedir. \u0130lgili dosyay\u0131 a\u00e7t\u0131\u011f\u0131n\u0131zda a\u015fa\u011f\u0131daki gibi bir kod y\u0131\u011f\u0131n\u0131yla kar\u015f\u0131la\u015facaks\u0131n\u0131z.<\/p>\n<div style=\"font-size:8px;color:white;background-color:gray;line-height: 1.0;\">\n#user  nobody;<br \/>\nworker_processes  1;<\/p>\n<p>#error_log  logs\/error.log;<br \/>\n#error_log  logs\/error.log  notice;<br \/>\n#error_log  logs\/error.log  info;<\/p>\n<p>#pid        logs\/nginx.pid;<\/p>\n<p>events {<br \/>\n    worker_connections  1024;<br \/>\n}<\/p>\n<p>http {<br \/>\n    include       mime.types;<br \/>\n    default_type  application\/octet-stream;<\/p>\n<p>    #log_format  main  &#8216;$remote_addr &#8211; $remote_user [$time_local] &#8220;$request&#8221; &#8216;<br \/>\n    #                  &#8216;$status $body_bytes_sent &#8220;$http_referer&#8221; &#8216;<br \/>\n    #                  &#8216;&#8221;$http_user_agent&#8221; &#8220;$http_x_forwarded_for&#8221;&#8216;;<\/p>\n<p>    #access_log  logs\/access.log  main;<\/p>\n<p>    sendfile        on;<br \/>\n    #tcp_nopush     on;<\/p>\n<p>    #keepalive_timeout  0;<br \/>\n    keepalive_timeout  65;<\/p>\n<p>    #gzip  on;<\/p>\n<p>    server {<br \/>\n        listen       80;<br \/>\n        server_name  localhost;<\/p>\n<p>        #charset koi8-r;<\/p>\n<p>        #access_log  logs\/host.access.log  main;<\/p>\n<p>        location \/ {<br \/>\n            root   html;<br \/>\n            index  index.html index.htm;<br \/>\n        }<\/p>\n<p>        #error_page  404              \/404.html;<\/p>\n<p>        # redirect server error pages to the static page \/50x.html<br \/>\n        #<br \/>\n        error_page   500 502 503 504  \/50x.html;<br \/>\n        location = \/50x.html {<br \/>\n            root   html;<br \/>\n        }<\/p>\n<p>        # proxy the PHP scripts to Apache listening on 127.0.0.1:80<br \/>\n        #<br \/>\n        #location ~ \\.php$ {<br \/>\n        #    proxy_pass   http:\/\/127.0.0.1;<br \/>\n        #}<\/p>\n<p>        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000<br \/>\n        #<br \/>\n        #location ~ \\.php$ {<br \/>\n        #    root           html;<br \/>\n        #    fastcgi_pass   127.0.0.1:9000;<br \/>\n        #    fastcgi_index  index.php;<br \/>\n        #    fastcgi_param  SCRIPT_FILENAME  \/scripts$fastcgi_script_name;<br \/>\n        #    include        fastcgi_params;<br \/>\n        #}<\/p>\n<p>        # deny access to .htaccess files, if Apache&#8217;s document root<br \/>\n        # concurs with nginx&#8217;s one<br \/>\n        #<br \/>\n        #location ~ \/\\.ht {<br \/>\n        #    deny  all;<br \/>\n        #}<br \/>\n    }<\/p>\n<p>    # another virtual host using mix of IP-, name-, and port-based configuration<br \/>\n    #<br \/>\n    #server {<br \/>\n    #    listen       8000;<br \/>\n    #    listen       somename:8080;<br \/>\n    #    server_name  somename  alias  another.alias;<\/p>\n<p>    #    location \/ {<br \/>\n    #        root   html;<br \/>\n    #        index  index.html index.htm;<br \/>\n    #    }<br \/>\n    #}<\/p>\n<p>    # HTTPS server<br \/>\n    #<br \/>\n    #server {<br \/>\n    #    listen       443 ssl;<br \/>\n    #    server_name  localhost;<\/p>\n<p>    #    ssl_certificate      cert.pem;<br \/>\n    #    ssl_certificate_key  cert.key;<\/p>\n<p>    #    ssl_session_cache    shared:SSL:1m;<br \/>\n    #    ssl_session_timeout  5m;<\/p>\n<p>    #    ssl_ciphers  HIGH:!aNULL:!MD5;<br \/>\n    #    ssl_prefer_server_ciphers  on;<\/p>\n<p>    #    location \/ {<br \/>\n    #        root   html;<br \/>\n    #        index  index.html index.htm;<br \/>\n    #    }<br \/>\n    #}<\/p>\n<p>}\n<\/p><\/div>\n<p>Evet, biliyorum&#8230; Kod \u00e7ok k\u00fc\u00e7\u00fck ve okunamamaktad\u0131r \ud83d\ude42<br \/>\nZaten okunabilir olmas\u0131na da gerek yoktur. Haa isterseniz kodu kopyalay\u0131p bir not defterinde istedi\u011finiz b\u00fcy\u00fckl\u00fckte g\u00f6rebilirsiniz. Lakin s\u00f6yledi\u011fim gibi buna gerek yoktur. \u00c7\u00fcnk\u00fc buradaki niyetim, mevcudiyetteki kodun ne kadar kompleks ve karma\u015f\u0131k olsa dahi nas\u0131l bir \u015fey oldu\u011funu sizlere g\u00f6stermektir. Yap\u0131lmas\u0131 gereken bu dosyan\u0131n i\u00e7erisinde a\u015fa\u011f\u0131daki gibi bir konfig\u00fcrasyondur. <span style=\"font-size:10px;\">(Dikkat ederseniz a\u015fa\u011f\u0131daki kod orjinaline nazaran sadele\u015ftirilmi\u015ftir. Kopyalay\u0131p direkt ilgili dosya i\u00e7erisine yap\u0131\u015ft\u0131rarak kullanabilirsiniz.)<\/span><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nworker_processes 1;\r\n\r\nevents {\r\n    worker_connections 1024;\r\n}\r\n\r\nhttp {\r\n    include mime.types;\r\n    default_type application\/octet-stream;\r\n    sendfile on;\r\n    keepalive_timeout 65;\r\n\r\n    upstream servers {\r\n        server 127.0.0.1:1071;\r\n        server 127.0.0.1:1072;\r\n    }\r\n\r\n    server {\r\n        listen 8080;\r\n        server_name localhost;\r\n\r\n        location \/ {\r\n            proxy_pass http:\/\/servers;\r\n        }\r\n\r\n        error_page 500 502 503 504 \/50x.html;\r\n        location = \/50x.html {\r\n            root html;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki kodu izah etmemiz gerekirse e\u011fer; <strong><em>13<\/em><\/strong> ile <strong><em>16.<\/em><\/strong> sat\u0131rlar aras\u0131nda &#8216;servers&#8217;<span style=\"font-size:10px;\">(ba\u015fka isimde verilebilir)<\/span> ad\u0131nda bir <code style=\"color:red;font-size:12px;\">upstream<\/code> tan\u0131mlanm\u0131\u015ft\u0131r. Bu upstream, load balancing i\u015fleminin yap\u0131laca\u011f\u0131 sunucular\u0131 tutmaktad\u0131r. \u00d6rnekte de g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere y\u00f6nlendirmenin yap\u0131laca\u011f\u0131 sunucu bilgileri <code style=\"color:blue;font-size:12px;\">server<\/code> komutu e\u015fli\u011finde bildirilmi\u015ftir ve her bir bildiriden sonra <strong><em style=\"color:green;\">;<\/em><\/strong> operat\u00f6r\u00fc kullan\u0131lmaktad\u0131r. Burada elimizdeki sunucu say\u0131s\u0131 kadar adres bildirimi yapabilmekteyiz.<\/p>\n<p>Y\u00f6nlendirmeleri kar\u015f\u0131layacak olan sunucular\u0131 tan\u0131mlad\u0131ktan sonra <strong><em>22.<\/em><\/strong> sat\u0131rdaki <code style=\"color:purple;font-size:12px;\">location \/<\/code> i\u00e7erisine <code style=\"color:red;font-size:12px;\">proxy_pass http:\/\/<span style=\"color:blue;\">servers<\/span>;<\/code><span style=\"font-size:10px;\">(servers tan\u0131mlanan upstream&#8217;den gelmektedir)<\/span> komutuyla <code>localhost:8080<\/code> portuna gelecek olan t\u00fcm http isteklerini(\/) kar\u015f\u0131lamakta ve ilgili sunuculara kullan\u0131lan algoritma e\u015fli\u011finde y\u00f6nlendirme yap\u0131lmaktad\u0131r. Tabi hangi load balancing algoritmas\u0131n\u0131n kullan\u0131ld\u0131\u011f\u0131na sonraki sat\u0131rlarda de\u011finiyor olaca\u011f\u0131z.<\/p>\n<p>Nginx sunucusunun 80 portunda aya\u011fa kalkaca\u011f\u0131n\u0131 ise <strong><em>19.<\/em><\/strong> sat\u0131rdaki <code style=\"color:purple;font-size:12px;\">listen 8080;<\/code> komutu belirlemektedir.<\/p>\n<p>De\u011finilen bu konfig\u00fcrasyonlar\u0131n d\u0131\u015f\u0131nda di\u011ferleri pek m\u00fchim arz etmemektedir. K\u0131saca \u00f6zet ge\u00e7mek gerekirse bir Nginx konfig\u00fcrasyonu i\u00e7in temelde <em>upstream<\/em> ile birlikte <em>location<\/em> yap\u0131land\u0131rmas\u0131 yeterli olacakt\u0131r.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-2.png\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"170\" height=\"224\" class=\"alignleft size-full wp-image-21964\" \/><\/a>T\u00fcm bu i\u015flemleri yapt\u0131ktan sonra &#8216;nginx.conf&#8217; dosyas\u0131n\u0131 kaydedip, &#8216;nginx.exe&#8217; dosyas\u0131 \u00fczerinden Nginx sunucusunu \u00e7al\u0131\u015ft\u0131rabilirsiniz. \u0130lgili dosyaya t\u0131klad\u0131ktan sonra sunucunun aya\u011fa kalk\u0131p kalkmad\u0131\u011f\u0131n\u0131 anlayabilmek i\u00e7in &#8216;Task Manager&#8217; \u00fczerinden yandaki gibi kontrol edebilirsiniz.<\/p>\n<p>Art\u0131k <code>localhost:8080<\/code> url&#8217;ine gelen t\u00fcm istekler &#8216;servers&#8217; isimli upstream&#8217;de belirtilen sunuculara y\u00f6nlendirilecek ve b\u00f6ylece y\u00fck dengeleme sa\u011flanm\u0131\u015f olacakt\u0131r.<br \/>\n<div id=\"attachment_21974\" style=\"width: 334px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-21974\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu.gif\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"324\" height=\"122\" class=\"size-full wp-image-21974\" \/><\/a><p id=\"caption-attachment-21974\" class=\"wp-caption-text\">Nginx ile yap\u0131lan load balancing i\u015flemi. Dikkat edilirse e\u011fer belirtilen adresin<span style=\"color:green;\">(localhost:8080)<\/span> t\u00fcm rotalar\u0131na gelen isteklerde bile gerekli y\u00f6nlendirmeleri sa\u011flamaktad\u0131r.<\/p><\/div><\/p>\n<p>\u0130\u015fte&#8230; Windows platformunda Nginx bu \u015fekilde aya\u011fa kald\u0131r\u0131lmakta ve g\u00f6sterildi\u011fi gibi yap\u0131land\u0131rmalar\u0131 olu\u015fturulmaktad\u0131r. \u015eimdi s\u0131ra Docker ortam\u0131nda Nginx kurulumunu ve yap\u0131land\u0131rmas\u0131n\u0131 incelemeye gelmi\u015ftir.<\/p>\n<h6>Nginx&#8217;i Dockerize Etmek ve Docker \u0130le Load Balancing<\/h6>\n<p>Nginx&#8217;i dockerize ederken Windows&#8217;ta ki kurulumuna istinaden &#8216;nginx.conf&#8217; dosyas\u0131na image olu\u015ftururken m\u00fcdahale etmemiz gerekmektedir. Bunun i\u00e7in yine yukar\u0131da olu\u015fturdu\u011fumuz gibi a\u015fa\u011f\u0131daki i\u00e7erikte bir &#8216;nginx.conf&#8217; dosyas\u0131 olu\u015fturunuz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nworker_processes 1;\r\n \r\nevents {\r\n    worker_connections 1024;\r\n}\r\n \r\nhttp {\r\n    include mime.types;\r\n    default_type application\/octet-stream;\r\n    sendfile on;\r\n    keepalive_timeout 65;\r\n \r\n    upstream servers {\r\n        server 192.168.0.12:1071;\r\n        server 192.168.0.12:1072;\r\n    }\r\n \r\n    server {\r\n        listen 80;\r\n        server_name localhost;\r\n \r\n        location \/ {\r\n            proxy_pass http:\/\/servers;\r\n        }\r\n \r\n        error_page 500 502 503 504 \/50x.html;\r\n        location = \/50x.html {\r\n            root html;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Burada dikkat ederseniz e\u011fer upstream i\u00e7erisindeki server bilgilerini 127.0.0.1 olarak de\u011fil, remote ip olarak vermi\u015f bulunmaktay\u0131z. Bunun nedeni localhost&#8217;a kar\u015f\u0131l\u0131k gelecek olan 127.0.0.1 adresini Docker container&#8217;\u0131n kendi i\u00e7erisinde aramas\u0131d\u0131r. Halbuki bizler \u00f6rneklendirme i\u00e7in ana bilgisayar\u0131m\u0131z\u0131n local adresini bildirmek istiyoruz. B\u00f6yle bir durumda 127.0.0.1&#8217;i verememekteyiz. Aksi taktirde <em>502 Bad Gateway<\/em> hatas\u0131yla kar\u015f\u0131laca\u011f\u0131z. Haliyle bu duruma ana makinan\u0131n remote ip&#8217;sini ya da varsa DNS ad\u0131n\u0131 kullanarak \u00e7\u00f6z\u00fcm getirmekteyiz. Tabi ki de ger\u00e7ek operasyonlarda uzak bir sunucunun adresi bildirilece\u011finden dolay\u0131 buradaki detay pek \u00f6nem arz etmeyecektir. Ama dedi\u011fim gibi local \u00fczerinde \u00f6rnek mahiyetinde \u00e7al\u0131\u015f\u0131yorsan\u0131z e\u011fer Docker i\u00e7erisinde remote ip ile ana bilgisayar\u0131 ifade etmek elzemdir.<\/p>\n<table>\n<thead>\n<tr>\n<th>127.0.0.1<\/th>\n<th>Remote Ip<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-3.png\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"291\" height=\"291\" class=\"aligncenter size-full wp-image-21981\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-3.png 291w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-3-150x150.png 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-3-160x160.png 160w\" sizes=\"auto, (max-width: 291px) 100vw, 291px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-4-237x300.png\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"237\" height=\"300\" class=\"aligncenter size-medium wp-image-21982\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-4-237x300.png 237w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-4.png 291w\" sizes=\"auto, (max-width: 237px) 100vw, 237px\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" style=\"font-size:10px;\">\nDaha detayl\u0131 bilgi i\u00e7in <a href=\"https:\/\/stackoverflow.com\/questions\/38346847\/nginx-docker-container-502-bad-gateway-response\/47663730#47663730\" rel=\"noopener\" target=\"_blank\">https:\/\/stackoverflow.com\/questions\/38346847\/nginx-docker-container-502-bad-gateway-response\/47663730#47663730<\/a> adresindeki yorumu okuman\u0131z\u0131 tavsiye ederim.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><em>Remote IP adresini nereden bulaca\u011f\u0131z?<\/em> diye sorarsan\u0131z e\u011fer Network k\u0131sm\u0131ndan a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi &#8216;Properties&#8217; -> &#8216;IPv4 address&#8217; k\u0131sm\u0131ndan eri\u015febilirsiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-5.png\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"936\" height=\"578\" class=\"aligncenter size-full wp-image-21988\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-5.png 936w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-5-300x185.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-5-768x474.png 768w\" sizes=\"auto, (max-width: 936px) 100vw, 936px\" \/><\/a><br \/>\nVelhas\u0131l, devam edersek e\u011fer bu &#8216;nginx.conf&#8217; dosyas\u0131n\u0131n bulundu\u011fu dizine bir Dockerfile dosyas\u0131 olu\u015fturunuz ve i\u00e7erisine a\u015fa\u011f\u0131daki talimatlar\u0131 giriniz.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nFROM nginx:latest\r\nCOPY nginx.conf \/etc\/nginx\/nginx.conf\r\nEXPOSE 80\r\n<\/pre>\n<p>Dikkat ederseniz Docker&#8217;da aya\u011fa kald\u0131r\u0131lacak olan &#8216;nginx&#8217; image&#8217;\u0131n\u0131n i\u00e7erisindeki <code>\/etc\/nginx\/nginx.conf<\/code> klas\u00f6r\u00fc, yukar\u0131da geli\u015ftirdi\u011fimiz mevcut <code>nginx.conf<\/code> klas\u00f6r\u00fc ile de\u011fi\u015ftirmekteyiz. Haliyle b\u00f6ylece art\u0131k bizim verdi\u011fimiz yap\u0131land\u0131rmalara g\u00f6re ilgili sunucu \u00e7al\u0131\u015facak ve y\u00fck dengeleme sa\u011flanm\u0131\u015f olacakt\u0131r. Bu i\u015flemin ard\u0131ndan ilgili dizine powershell yahut cmd ile girerek a\u015fa\u011f\u0131daki docker cli komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n\u0131z.<\/p>\n<div style=\"text-align:center;\">\n<code style=\"color:red;font-size:12px;\">docker build -t nginxserver .<\/code><br \/>\n<code style=\"color:red;font-size:12px;\">docker run --name loadbalancer -p 80:80 -d nginxserver<\/code>\n<\/div>\n<p>Ve t\u00fcm bu i\u015flemlerden sonra art\u0131k <code>localhost\/example<\/code> adresine s\u0131ras\u0131yla istek g\u00f6nderiniz ve y\u00fck dengelemenin ger\u00e7ekle\u015ftirildi\u011fini g\u00f6zleyiniz.<br \/>\n<div id=\"attachment_21995\" style=\"width: 270px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-1.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-21995\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-1.gif\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"260\" height=\"104\" class=\"size-full wp-image-21995\" \/><\/a><p id=\"caption-attachment-21995\" class=\"wp-caption-text\">Docker \u00f6rneklendirmesinde 80 portunu kulland\u0131\u011f\u0131m\u0131z i\u00e7in \u00f6nceki Windows \u00f6rneklendirmesine nazaran url&#8217;de ki fark kafan\u0131z\u0131 kar\u0131\u015ft\u0131rmamas\u0131n\u0131 \u00f6neririm&#8230;<\/p><\/div><\/p>\n<h3>Nginx &#8211; Load Balancing Detaylar\u0131<\/h3>\n<p>\u015eimdiye kadar Windows ve Docker ortamlar\u0131nda Nginx&#8217;in kurulumunu ve load balancing operasyonlar\u0131n\u0131n nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 tam teferruatl\u0131 ele alm\u0131\u015f bulunmaktay\u0131z. Bundan sonra ise art\u0131k algoritma se\u00e7imi, sunucu a\u011f\u0131rl\u0131\u011f\u0131 ayarlama, sunucu yava\u015f ba\u015flatma yap\u0131lanmas\u0131, session kal\u0131c\u0131l\u0131\u011f\u0131, healt check vs. gibi teferruatlar\u0131n nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 ele al\u0131yor olaca\u011f\u0131z.<\/p>\n<h6>Load Balancing Algoritma Se\u00e7imi<\/h6>\n<p>\u00d6nceki yaz\u0131lar\u0131m\u0131zdan <a href=\"https:\/\/www.gencayyildiz.com\/blog\/load-balancingyuk-dengeleme-ve-load-balanceryuk-dengeleyici-nedir\/\" rel=\"noopener\" target=\"_blank\">Load Balancing(Y\u00fck Dengeleme) ve Load Balancer(Y\u00fck Dengeleyici) Nedir?<\/a> ba\u015fl\u0131kl\u0131 i\u00e7eri\u011fimizde load balancing&#8217;in \u00e7al\u0131\u015fmas\u0131na dair temel algoritmalardan bahsetmi\u015ftik. Nginx, bu algoritmalar e\u015fli\u011finde \u015fahs\u0131na m\u00fcnhas\u0131r \u00f6zelle\u015ftirmelerde bulundu\u011fu farkl\u0131 algoritmalarla gelmektedir. \u015eimdi gelin bu algoritmalar\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 tekrar hat\u0131rlayarak ve \u00f6\u011frenerek inceleyelim&#8230;<\/p>\n<ul>\n<li><strong style=\"color:purple;\">Round Robin<\/strong> : Sunucu a\u011f\u0131rl\u0131klar\u0131 dikkate alarak gelen iste\u011fi sunucular aras\u0131nda e\u015fit olarak da\u011f\u0131t\u0131r. Varsay\u0131lan olarak kullan\u0131lan y\u00f6ntemdir.\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n   server backend1.example.com;\r\n   server backend2.example.com;\r\n}\r\n<\/pre>\n<\/li>\n<li><strong style=\"color:purple;\">Least Connections<\/strong> : Gelen iste\u011fi az say\u0131da etkin ba\u011flant\u0131ya sahip sunucuya g\u00f6nderir. <code style=\"color:red;font-size:12px;\">least_conn<\/code> etiketiyle ifade edilir.\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    least_conn;\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n}\r\n<\/pre>\n<\/li>\n<li><strong style=\"color:purple;\">IP Hash<\/strong> : Ayn\u0131 adresten gelen istekleri ayn\u0131 sunucuya y\u00f6nlendirir. <code style=\"color:red;font-size:12px;\">ip_hash<\/code> etiketiyle ifade edilir.\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    ip_hash;\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n}\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-2.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-2.gif\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"252\" height=\"108\" class=\"aligncenter size-full wp-image-22003\" \/><\/a><br \/>\nE\u011fer ki sunuculardan herhangi birinin y\u00fck dengeleme rotasyonunun ge\u00e7ici olarak kald\u0131r\u0131lmas\u0131 gerekiyorsa <code>down<\/code> komutu kullan\u0131labilir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n    server backend3.example.com down;\r\n}\r\n<\/pre>\n<p>Bu sunucuya g\u00f6nderilecek istekler otomatik olarak gruptaki bir sonraki sunucuya y\u00f6nlendirilir.\n<\/li>\n<li><strong style=\"color:purple;\">Generic Hash<\/strong> : \u0130ste\u011fin g\u00f6nderilece\u011fi sunucu herhangi bir metin dizesi, de\u011fi\u015fken yahut kombinasyonel bir de\u011ferle belirlenmektedir. <code style=\"color:red;font-size:12px;\">hash $request_uri consistent<\/code> etiketiyle ifade edilir.\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    hash $request_uri consistent;\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n}\r\n<\/pre>\n<\/li>\n<li><strong style=\"color:purple;\">Least Time<\/strong> : Gelen iste\u011fi en d\u00fc\u015f\u00fck ortalama gecikme de\u011ferine sahip olan sunucuya y\u00f6nlendirir. <code style=\"color:red;font-size:12px;\">least_time<\/code> etiketiyle birlikte <code style=\"color:red;font-size:12px;\">header<\/code>, <code style=\"color:red;font-size:12px;\">last_byte<\/code> ve <code style=\"color:red;font-size:12px;\">last_byte inflight<\/code> olmak \u00fczere \u00fc\u00e7 parametreyle ifade edilir.\n<p><code style=\"color:red;font-size:12px;\">header<\/code>, sunucudan ilk bayr\u0131 alma zaman\u0131n\u0131 ifade eder.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    least_time header;\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n}\r\n<\/pre>\n<p><code style=\"color:red;font-size:12px;\">last_byte<\/code>, sunucudan tam yan\u0131t alma zaman\u0131n\u0131 ifade eder.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    least_time last_byte;\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n}\r\n<\/pre>\n<p><code style=\"color:red;font-size:12px;\">last_byte inflight<\/code>, eksik istekleri dikkate alarak sunucudan tam yan\u0131t alma zaman\u0131n\u0131 ifade eder.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    least_time last_byte inflight;\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n}\r\n<\/pre>\n<\/li>\n<li><strong style=\"color:purple;\">Random<\/strong> : Gelen istek rastgele bir sunucuya y\u00f6nlendirilir.  <code style=\"color:red;font-size:12px;\">random<\/code> etiketiyle ifade edilir.\n<p><code style=\"color:red;font-size:12px;\">least_conn<\/code>, en az aktif ba\u011flant\u0131 say\u0131s\u0131n\u0131 ifade eder.<br \/>\n<code style=\"color:red;font-size:12px;\">least_time=header<\/code>, sunucudan yan\u0131t ba\u015fl\u0131\u011f\u0131n\u0131 almak i\u00e7in en d\u00fc\u015f\u00fck ortalama s\u00fcreyi ifade eder.<br \/>\n<code style=\"color:red;font-size:12px;\">least_time=last_byte<\/code>, sunucudan tam yan\u0131t almak i\u00e7in en d\u00fc\u015f\u00fck ortalama s\u00fcreyi ifade eder.<\/p>\n<p>E\u011fer ki <code>two<\/code> parametresi belirtilirse, \u00f6ncelikle rastgele iki sunucu dikkate al\u0131n\u0131r ve ard\u0131ndan yukar\u0131daki y\u00f6ntemlerden hangisi kullan\u0131l\u0131yorsa ona g\u00f6re birisini se\u00e7er ve iste\u011fi y\u00f6nlendirir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    random two least_time=last_byte;\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n    server backend3.example.com;\r\n    server backend4.example.com;\r\n}\r\n<\/pre>\n<p>Rastgele da\u011f\u0131l\u0131m herhangi bir hesap gerektirmemesinden \u00f6t\u00fcr\u00fc bir miktar h\u0131zl\u0131 \u00e7al\u0131\u015fmaktad\u0131r.\n<\/li>\n<\/ul>\n<h6>Sunucu A\u011f\u0131rl\u0131klar\u0131\/Server Weights<\/h6>\n<p>Nginx, Round Robin y\u00f6ntemi e\u015fli\u011finde gelen istekleri sunucular aras\u0131ndaki a\u011f\u0131rl\u0131klar\u0131na g\u00f6re da\u011f\u0131tabilmektedir. <code>weight<\/code> parametresi sunucu a\u011f\u0131rl\u0131klar\u0131n\u0131 belirlemede kullan\u0131lmaktad\u0131r.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    server backend1.example.com weight=5;\r\n    server backend2.example.com;\r\n    server 192.0.0.1 backup;\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki yap\u0131lanmada <em>backend1.example.com<\/em> 5, di\u011fer iki sunucu varsay\u0131lan(1) a\u011f\u0131rl\u0131\u011fa sahiptir. Bu demek oluyor ki, gelen 6 iste\u011fin 5&#8217;i <em>backend1.example.com<\/em>&#8216;a, 1&#8217;i ise <em>backend2.example.com<\/em>&#8216;a gidecektir. Dikkat ederseniz <em>192.0.0.1<\/em> sunucusu ise <code>backup<\/code> ile i\u015faretlenmi\u015ftir. B\u00f6ylece di\u011fer iki sunucu kullan\u0131lmad\u0131\u011f\u0131 s\u00fcrece istek alamayacak hale getirilmi\u015ftir.<\/p>\n<h6>Sunucu Yava\u015f Ba\u015flatma\/Server Slow-Start<\/h6>\n<p>Sunucu yava\u015f ba\u015flatma \u00f6zelli\u011fi, yak\u0131n zamanda onar\u0131lan bir sunucunun zaman a\u015f\u0131m\u0131na u\u011framaks\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacak olan bir \u00f6zelliktir. <code style=\"color:red;font-size:12px;\">slow_start<\/code> etiketi ile a\u015fa\u011f\u0131daki gibi ayarlanabilmektedir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    server backend1.example.com slow_start=30s;\r\n    server backend2.example.com;\r\n    server 192.0.0.1 backup;\r\n}\r\n<\/pre>\n<h6>Oturum Kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 Etkinle\u015ftirme\/Enabling Session Persistence<\/h6>\n<p>Nginx, gelen istekleri kullan\u0131c\u0131 oturumlar\u0131n\u0131 tan\u0131mlad\u0131\u011f\u0131 ayn\u0131 sunuculara y\u00f6nlendirerek session kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 sa\u011flayabilmektedir. <code style=\"color:red;font-size:12px;\">sticky<\/code> etiketi e\u015fli\u011finde <code style=\"color:red;font-size:12px;\">sticky cookie<\/code>, <code style=\"color:red;font-size:12px;\">sticky route<\/code> ve <code style=\"color:red;font-size:12px;\">sticky learn<\/code> olmak \u00fczere \u00fc\u00e7 farkl\u0131 kal\u0131c\u0131l\u0131k y\u00f6ntemini destekler.<\/p>\n<p><code style=\"color:red;font-size:12px;\">sticky cookie<\/code>, gelen ilk iste\u011fe bir oturum tan\u0131mlama bilgisi ekler ve b\u00f6ylece sunucuyu tan\u0131mlar. \u0130stemci, yapaca\u011f\u0131 bir sonraki istekte tan\u0131mlama bilgisi i\u00e7erir ve iste\u011fi e\u015fle\u015fen sunucuya y\u00f6nlendirir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    server backend1.example.com;\r\n    server backend2.example.com;\r\n    sticky cookie srv_id expires=1h domain=.example.com path=\/;\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rne\u011fi incelerseniz e\u011fer; <code>srv_id<\/code> parametresi, tan\u0131mlama bilgisinin ad\u0131n\u0131 belirlemektedir. <code>expires<\/code> parametresi, taray\u0131c\u0131n\u0131n cookie&#8217;yi tutma s\u00fcresini  belirlemektedir. <code>domain<\/code> parametresi, tan\u0131mlama bilgisinin ayarland\u0131\u011f\u0131 etki alan\u0131n\u0131 tan\u0131mlamaktad\u0131r. Opsiyoneldir. <code>path<\/code> parametresi ise tan\u0131mlama bilgisinin yolunu tutar. Bu en basit session kal\u0131c\u0131l\u0131k y\u00f6ntemidir.<\/p>\n<p><code style=\"color:red;font-size:12px;\">sticky route<\/code>, gelen ilk istek al\u0131nd\u0131\u011f\u0131nda client&#8217;a bir rota verilir. Sonraki t\u00fcm istekler, <code>route<\/code> parametresiyle kar\u015f\u0131la\u015ft\u0131r\u0131larak e\u015fle\u015fen sunucuya y\u00f6nlendirilir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    server backend1.example.com route=a;\r\n    server backend2.example.com route=b;\r\n    sticky route $route_cookie $route_uri;\r\n}\r\n<\/pre>\n<p><code style=\"color:red;font-size:12px;\">sticky learn<\/code>, gelen istek neticesinde yan\u0131tlar\u0131 inceleyerek hangi sunucuya y\u00f6nlendirilece\u011fini \u00f6\u011frenen y\u00f6ntemdir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n   server backend1.example.com;\r\n   server backend2.example.com;\r\n   sticky learn\r\n       create=$upstream_cookie_examplecookie\r\n       lookup=$cookie_examplecookie\r\n       zone=client_sessions:1m\r\n       timeout=1h;\r\n}\r\n<\/pre>\n<h6>Ba\u011flant\u0131 Say\u0131s\u0131n\u0131 S\u0131n\u0131rlama<\/h6>\n<p>Gelen isteklerin y\u00f6nlendirilece\u011fi sunucular\u0131n ba\u011flant\u0131 say\u0131lar\u0131n\u0131 s\u0131n\u0131rlayabilmekteyiz. Bu i\u015flem i\u00e7in <code style=\"color:red;font-size:12px;\">max_conns<\/code> etiketi kullan\u0131lmaktad\u0131r.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    server backend1.example.com max_conns=3;\r\n    server backend2.example.com;\r\n    queue 100 timeout=70;\r\n}\r\n<\/pre>\n<p><code>max_conns<\/code> de\u011feri doldu\u011fu taktirde <code>queue<\/code> de\u011feri kadar s\u0131raya al\u0131n\u0131r. <code>queue<\/code>, isteklerle doldu\u011fu taktirde veya istek neticesinde sunucu se\u00e7imi <code>timeout<\/code> de\u011feri kadar zaman a\u015f\u0131m\u0131na u\u011frarsa client&#8217;a bir hata g\u00f6nderilir.<\/p>\n<h6>Healt Check<\/h6>\n<p>Nginx, y\u00fck dengelemenin yap\u0131laca\u011f\u0131 sunucular\u0131 s\u00fcrekli olarak test edebilir ve gelen iste\u011fi ba\u015far\u0131s\u0131z yahut s\u0131k\u0131nt\u0131l\u0131 sunuculara y\u00f6nlendirmeden bo\u015fa gitmeyecek \u015fekilde i\u015fleyebilmektedir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nupstream servers {\r\n    server backend1.example.com;\r\n    server backend2.example.com max_fails=3 fail_timeout=30s;\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rne\u011fi incelerseniz e\u011fer; <code>fail_timeout<\/code> parametresi ile sunucunun kullan\u0131lamaz olarak i\u015faretlenmesi i\u00e7in ne kadar s\u00fcrelik ba\u015far\u0131s\u0131z giri\u015fimin ger\u00e7ekle\u015fmesi gerekti\u011fini ve ayn\u0131 zamanda sunucunun uygun de\u011fil olarak i\u015faretlendi\u011fi s\u00fcreyi ayarlamaktay\u0131z. Bu s\u00fcre varsay\u0131lan olarak 10 saniyedir. \u00d6rnekte 30 saniye olarak yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r. <code>max_fails<\/code> parametresi ise sunucunun kullan\u0131lam\u0131yor olarak i\u015faretlenmesi i\u00e7in gereken s\u00fcre boyunca(<code>fail_timeout<\/code>) ger\u00e7ekle\u015fmesi gereken ba\u015far\u0131s\u0131z denemelerin say\u0131s\u0131n\u0131 ayarlamam\u0131z\u0131 sa\u011flar. Yani yukar\u0131daki \u00f6rne\u011fin mealini yaparsak e\u011fer; 30 saniye i\u00e7erisinde 3 kez yan\u0131t al\u0131namazsa sunucu 30 saniye boyunca kullan\u0131lamaz olarak i\u015faretlenir.<\/p>\n<p>E\u011fer ki bir grupta tek bir sunucu varsa <code>fail_timeout<\/code> ve <code>max_fails<\/code> parametreleri yok say\u0131larak, o sunucunun hi\u00e7bir zaman kullan\u0131lamaz olarak i\u015faretlenemeyece\u011fi unutulmamal\u0131d\u0131r.<\/p>\n<p>Bu inceledi\u011fimiz sa\u011fl\u0131k kontrol\u00fcne <strong><em>Pasif Sa\u011fl\u0131k Kontrol\u00fc<\/em><\/strong> denmektedir. Yani gelen iste\u011fin y\u00f6nlendirilmesi neticesinde sunucudan al\u0131nan tepkiye g\u00f6re bu kontroller yap\u0131lm\u0131\u015f olacakt\u0131r. Birde ayriyeten <strong>Aktif Sa\u011fl\u0131k Kontrol\u00fc<\/strong> mevcuttur. Nginx, her sunucuya \u00f6zel bir denetim iste\u011fi g\u00f6ndererek, \u00f6nceden bir denetleme yapar ve sunucular\u0131n durumunu d\u00fczenli olarak kontrol eder. Yani bir iste\u011fe ba\u011fl\u0131 olmaks\u0131z\u0131n aktiflik s\u00f6z konusudur. Bunun i\u00e7in <code style=\"color:red;font-size:12px;\">health_check<\/code> etiketinin a\u015fa\u011f\u0131daki gibi kullan\u0131lmas\u0131 yeterlidir :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nserver {\r\n    location \/ {\r\n        proxy_pass http:\/\/servers;\r\n        health_check;\r\n    }\r\n}\r\n<\/pre>\n<p>Nginx, bu yap\u0131land\u0131rma sayesinde varsay\u0131lan olarak her 5 saniyede bir gruptaki her bir sunucuya istek g\u00f6nderir. \u0130lgili sunucular sa\u011fl\u0131k kontrol\u00fcnden ge\u00e7ip, 200 status code d\u00f6nene kadar client&#8217;tan gelen istekleri kar\u015f\u0131layamazlar.<\/p>\n<p>Healt Check&#8217;e dair daha detayl\u0131 bilgi i\u00e7in <a href=\"https:\/\/docs.nginx.com\/nginx\/admin-guide\/load-balancer\/http-health-check\/\" rel=\"noopener\" target=\"_blank\">\u015furadaki<\/a> makaleyi okuman\u0131z\u0131 tavsiye ederim.<\/p>\n<h3>\u0130stek Yapan Client&#8217;\u0131n IP De\u011ferine Eri\u015fmek<\/h3>\n<p>Load balancing s\u00fcre\u00e7lerinde t\u00fcrl\u00fc ihtiya\u00e7lar do\u011frultusunda sunucular \u00fczerinde istek yapan client&#8217;lar\u0131n IP de\u011ferlerine eri\u015fmemiz gerekebilmektedir. Halbuki load balancer&#8217;lar\u0131n istek yapan client&#8217;\u0131n IP adresi yerine kendi IP adreslerini ilgili sunuculara iletmek gibi k\u00f6t\u00fc bir al\u0131\u015fkanl\u0131klar\u0131 vard\u0131r. Uygulama sunucular\u0131n\u0131n client&#8217;lar\u0131n IP de\u011ferlerini \u00f6\u011frenmesi gerekti\u011finde HTTP Header&#8217;da <code>X-Forwarded-For<\/code> key&#8217;inin doldurulmas\u0131 gerekmektedir. Bunun i\u00e7in ise load balancer&#8217;lar \u00fczerinde ilgili key&#8217;e kar\u015f\u0131l\u0131k a\u015fa\u011f\u0131daki ayar\u0131n yap\u0131lmas\u0131 gerekmektedir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n        location \/ {\r\n            proxy_pass https:\/\/servers;\r\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code style=\"color:red;font-size:12px;\">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<\/code> komutu ile istek yapan client&#8217;\u0131n bilgisinin <code>X-Forwarded-For<\/code> key&#8217;ine kar\u015f\u0131l\u0131k HTTP Header&#8217;da ta\u015f\u0131nmas\u0131 gerekti\u011fi bildirilmektedir. Bu yap\u0131land\u0131rman\u0131n akabinde yap\u0131lan istek neticesinde ilgili client&#8217;\u0131n IP&#8217;sine a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi HTTP Header \u00fczerinden rahatl\u0131kla eri\u015febilmekteyiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-6.png\" alt=\"Docker + Nginx Sunucusu \u0130le Load Balancing Operasyonu\" width=\"679\" height=\"290\" class=\"aligncenter size-full wp-image-22032\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-6.png 679w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/06\/Docker-Nginx-Sunucusu-Ile-Load-Balancing-Operasyonu-6-300x128.png 300w\" sizes=\"auto, (max-width: 679px) 100vw, 679px\" \/><\/a><\/p>\n<p>Nihai olarak, uzun ve me\u015fakkatli bir i\u00e7erikle Nginx sunucusu \u00fczerinden load balancing operasyonunun nas\u0131l yap\u0131labilece\u011fini hemen hemen t\u00fcm detaylar\u0131yla ele alm\u0131\u015f bulunmaktay\u0131z. Tabi ki de konuya dair bizlerin temas etmedi\u011fi amma velakin ihtiya\u00e7 do\u011frultusunda ilgili sunucunun orjinal d\u00f6k\u00fcmanlar\u0131na g\u00f6z atmam\u0131z gerekecek olan detaylarda mevcuttur. Ben deniz load balancing \u00fczerine gelen yo\u011fun talep \u00fczerine faydal\u0131 ve yerinde bir i\u00e7erik olu\u015fturdu\u011fumu umuyorum. Umar\u0131m \u00f6n\u00fcm\u00fczdeki s\u00fcre\u00e7te bu konuda bir e\u011fitim videosu \u00e7ekip Youtube kanal\u0131mda da yay\u0131nlamay\u0131 hedefliyorum. Velhas\u0131l, s\u0131k\u0131lsan\u0131z dahi \u00fc\u015fenmeden bu sat\u0131rlara kadar okuyup e\u015flik etti\u011finiz i\u00e7in te\u015fekk\u00fcr ederim \ud83d\ude42<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, \u00d6nceki Load Balancing(Y\u00fck Dengeleme) ve Load Balancer(Y\u00fck Dengeleyici) Nedir? ve Docker + Ocelot K\u00fct\u00fcphanesi \u0130le Load Balancing Operasyonu ba\u015fl\u0131kl\u0131 yaz\u0131lar\u0131m\u0131zda load balancing ve load balancer \u00fczerine hasbelkader irdelemelerde bulunmu\u015ftuk. Bu i\u00e7eri\u011fimizde ise load&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":22038,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3281,3573],"tags":[4293,4295,4294,4296,4309,4303,4291,4301,4299,4305,4289,4292,4302,4310,4300,4298,4304,4288,4306,4297,42,4267,4308,4307,4290],"class_list":["post-21906","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker","category-microservices","tag-502-bad-gateway","tag-502-bad-gateway-cozumu","tag-502-bad-gateway-hatasi","tag-docker-nginx-502-bad-gateway","tag-enabling-session-persistence","tag-generic-hash","tag-igor-sysoev","tag-ip-hash","tag-least-connections","tag-least-time","tag-nginx","tag-nginx-docker","tag-nginx-generic-hash","tag-nginx-healt-check","tag-nginx-ip-hash","tag-nginx-least-connections","tag-nginx-least-time","tag-nginx-nedir","tag-nginx-random","tag-nginx-round-robin","tag-random","tag-round-robin","tag-server-slow-start","tag-server-weights","tag-what-is-nginx"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/21906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=21906"}],"version-history":[{"count":118,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/21906\/revisions"}],"predecessor-version":[{"id":22039,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/21906\/revisions\/22039"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/22038"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=21906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=21906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=21906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}