{"id":164,"date":"2014-02-13T22:20:41","date_gmt":"2014-02-13T20:20:41","guid":{"rendered":"http:\/\/www.umutbesler.com\/?p=164"},"modified":"2014-02-13T22:20:41","modified_gmt":"2014-02-13T20:20:41","slug":"varnish-kurulumu-ve-yukdagilimi-yapmak-load-balancing","status":"publish","type":"post","link":"http:\/\/www.umutbesler.com\/2014\/02\/13\/varnish-kurulumu-ve-yukdagilimi-yapmak-load-balancing\/","title":{"rendered":"Varnish kurulumu ve y\u00fckda\u011f\u0131l\u0131m\u0131 yapmak (Load Balancing)"},"content":{"rendered":"

Varnish son zamanlarda pop\u00fcler olmaya ba\u015flayan bir web proxy sunucusudur. Bu d\u00f6k\u00fcmanda Varnish’in basit\u00e7e kurulumunu ve Varnish ile y\u00fck da\u011f\u0131l\u0131m\u0131 yaparak web sunucunuza d\u00fc\u015fen y\u00fck\u00fc nas\u0131l azaltabilece\u011finize de\u011finece\u011fim. Anlatt\u0131\u011f\u0131m ayarlar Ubuntu i\u00e7in olacak ancak di\u011fer Linux da\u011f\u0131t\u0131mlar\u0131nda da ayn\u0131 \u015fekilde \u00e7al\u0131\u015facakt\u0131r.<\/p>\n


\nVarnish, Linux tabanl\u0131 olup pop\u00fcler Linux da\u011f\u0131t\u0131mlar\u0131n\u0131n depolar\u0131nda bulunmaktad\u0131r. Son versiyonunu kullanmak istiyorsan\u0131z yine Ubuntu ve Redhat i\u00e7in Varnish’in kendi depolar\u0131 mevcut. Ubuntu i\u00e7in \u00f6rnek verecek olursak:<\/p>\n

    \n
  1. curl http:\/\/repo.varnish-cache.org\/debian\/GPG-key.txt | sudo apt-key add -<\/code><\/li>\n
  2. echo \"deb http:\/\/repo.varnish-cache.org\/ubuntu\/ <ubuntu_dagitim_adi> varnish-3.0\" |\u00a0sudo tee -a \/etc\/apt\/sources.list<\/code><\/li>\n
  3. sudo apt-get update<\/code><\/li>\n
  4. sudo apt-get install varnish<\/code><\/li>\n<\/ol>\n

    Ad\u0131mlar\u0131n\u0131 takip ederek en son versiyonunu kurabilirsiniz.
    \nVarnish’in as\u0131l g\u00f6revi proxy sunucusu olmak, ancak destekledi\u011fi di\u011fer \u00f6zellikler ile \u00e7ok hafif bir y\u00fck da\u011f\u0131t\u0131m sunucusu olabilmektedir.<\/p>\n

    Y\u00fck da\u011f\u0131t\u0131m senaryolar\u0131 a\u015fa\u011f\u0131daki gibi olabilir:<\/p>\n

      \n
    1. Tek sunucu \u00fczerinde web sunucusunu farkl\u0131 bir portta \u00e7al\u0131\u015ft\u0131r\u0131p (\u00f6rn. 8080) Varnish’i 80. portta \u00e7al\u0131\u015ft\u0131rmak<\/li>\n
    2. Birden fazla web sunucusunun \u00f6n\u00fcne bir (veya daha fazla) Varnish sunucusu yerle\u015ftirip y\u00fck da\u011f\u0131l\u0131m\u0131 yapmak<\/li>\n<\/ol>\n

      Varnish kurulumu yapt\u0131ktan sonraki ilk a\u015fama Varnish’in \u00e7al\u0131\u015faca\u011f\u0131 portu belirlemek ve buna g\u00f6re web sunucusunun (veya sunucular\u0131n\u0131n) portlar\u0131n\u0131 ayarlamak olacakt\u0131r. Varnish’in standart ayarlar\u0131 \/etc\/default\/varnish dosyas\u0131nda bulunmaktad\u0131r. Burada yap\u0131lmas\u0131 gereken \u015fey DAEMON_OPTS ile ba\u015flayan sat\u0131rdaki ayarlamalar\u0131 yapmakt\u0131r. Bu sat\u0131rda -a parametresi Varnish’in hangi ip ve portta \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirler. -s parametresi ise proxy i\u00e7in ayr\u0131lacak haf\u0131za miktar\u0131n\u0131 belirler. Varnish’in h\u0131zl\u0131 olmas\u0131n\u0131n en b\u00fcy\u00fck sebebi proxy i\u00e7in disk kullanmadan sadece ram kullanmas\u0131 ve log tutmak i\u00e7in yine disk kullanmamas\u0131d\u0131r. Varnish’in loglar\u0131 tutulmad\u0131\u011f\u0131 i\u00e7in loglar\u0131n\u0131 anl\u0131k g\u00f6rmek i\u00e7in varnishlog komutunu kullanabilirsiniz.<\/p>\n

      Bu ayarlar\u0131 yap\u0131p Varnish’i ba\u015flatt\u0131\u011f\u0131n\u0131zda standart kurulum tamamlanm\u0131\u015f olacakt\u0131r.<\/p>\n

      Varnish’in web siteleri ile ilgili ayarlar\u0131 ve uydu\u011fu kurallar\u0131n bulundu\u011fu dosya ise \/etc\/varnish\/default.vcl dosyas\u0131d\u0131r. Yeni ayarlar yapmak i\u00e7in bu dosyay\u0131 d\u00fczenleyebilir veya iste\u011fe ba\u011fl\u0131 olarak farkl\u0131 dosyalar yarat\u0131p Varnish’in bunlar\u0131 kullanmas\u0131n\u0131 sa\u011flayabilirsiniz. Varnish ile load balancing yapmak \u00e7ok kolay. Yukarda bahsetti\u011fimiz senaryolara g\u00f6re ayarlar\u0131 \u015fu \u015fekilde:<\/p>\n

      1. Tek Sunucu \u00fczerinde \u00e7al\u0131\u015ft\u0131rmak:<\/strong><\/p>\n

      Bu kullan\u0131m tipinde web sunucu farkl\u0131 bir portta \u00e7al\u0131\u015f\u0131r (\u00f6rn. 8080) ve Varnish 80. portta \u00e7al\u0131\u015farak, gerekli durumlarda web sunucusuna ba\u011flant\u0131 kurar.
      \nDefault.vcl dosyas\u0131ndaki ayarlar \u015fu \u015fekilde olacakt\u0131r:<\/p>\n

      backend default { .host = \"127.0.0.1\"; .port = \"8080\"; }<\/pre>\n

      Bu ayar sonras\u0131nda Varnish gelen her iste\u011fi 8080. portta \u00e7al\u0131\u015fan web sunucuya g\u00f6nderecektir. Ayr\u0131ca statik dosyalar\u0131n haf\u0131zada tutulup bir daha istendi\u011finde web sunucuya gitmeden direk haf\u0131zadan sunulmas\u0131, belli kurallar d\u0131\u015f\u0131ndaki ba\u011flant\u0131lar\u0131n web sunucuya g\u00f6nderilmemesi gibi bir\u00e7ok ayar yap\u0131labilir. Bu konular 2. tip kullan\u0131mda da ayn\u0131 \u015fekilde oldu\u011fu i\u00e7in a\u015fa\u011f\u0131da ayr\u0131ca anlataca\u011f\u0131m.<\/p>\n

      2. Birden fazla web sunucuya y\u00fck da\u011f\u0131l\u0131m\u0131 yapmak:<\/strong><\/p>\n

      Bu kullan\u0131m tipinde birden fazla web sunucu kurulumu yap\u0131l\u0131r ve bunlar\u0131n \u00f6n\u00fcne bir veya birden fazla Varnish sunucusu konur. Gelen t\u00fcm istekler Varnish’e gelir ve belli kurallara g\u00f6re web sunuculara y\u00f6nlendirilir. Bu \u00e7al\u0131\u015fma tipinde arkadaki web sunuculardan birinde bir sorun oldu\u011funda istekler di\u011fer sunuculara y\u00f6nlendirilir. B\u00f6ylece kesintisiz hizmette sa\u011flanm\u0131\u015f olur.<\/p>\n

      Default.vcl dosyas\u0131ndaki ayarlar \u015fu \u015fekilde olacakt\u0131r (2 web sunucu i\u00e7in):<\/p>\n

      backend web1 {\r\n  .host = \"10.0.0.1\";\r\n  .probe = {\r\n                .url = \"\/\";\r\n                .interval = 5s;\r\n                .timeout = 1s;\r\n                .window = 5;\r\n                .threshold = 3;\r\n  }\r\n}\r\n\r\nbackend web2 {\r\n  .host = \"10.0.0.2\";\r\n  .probe = {\r\n                .url = \"\/\";\r\n                .interval = 5s;\r\n                .timeout = 1 s;\r\n                .window = 5;\r\n                .threshold = 3;\r\n  }\r\n}<\/pre>\n

      Burada web sunucular\u0131m\u0131z\u0131n ip tan\u0131mlar\u0131n\u0131 yapt\u0131k. Ayr\u0131ca .url se\u00e7ene\u011fi ile bu url’yi test etmesini, 5 saniyede bir yap\u0131lacak 5 denemeden 3 tanesinde hata al\u0131rsa bu sunucuyu ar\u0131zal\u0131 olarak g\u00f6rmesini istedik. Bu de\u011ferleri kendi iste\u011finize g\u00f6re de\u011fi\u015ftirebilirsiniz.<\/p>\n

      director havuz round-robin {\r\n        {\r\n                .backend = web1;\r\n        }\r\n        {\r\n                .backend = web2;\r\n        }\r\n}<\/pre>\n

      Burada web sunucular\u0131m\u0131zdan bir sunucu havuzu olu\u015fturduk. Art\u0131k bir web sitesine sen “havuz” isimli sunucu havuzuna git deme \u015fans\u0131m\u0131z var. Burdaki tan\u0131mda verdi\u011fimiz “round-robin” ayar\u0131n\u0131n anlam\u0131 her gelen iste\u011fi s\u0131ras\u0131yla havuzdaki sunuculara y\u00f6nlendirmek demek. Yani ilk istek geldi\u011finde web1’e gidecek, 2. istek web2’ye gidecek. 3. istek yine web1’e gidecek.<\/p>\n

      Burada kullanabilece\u011fimiz di\u011fer se\u00e7enekler ise:<\/p>\n

        \n
      • random: rasgele bir sunucu se\u00e7ilip, istek ona y\u00f6nlendirilir<\/li>\n
      • client: ba\u011flant\u0131 kuran ki\u015fiye g\u00f6re bir sunucu se\u00e7ilip o ki\u015finin hep ayn\u0131 sunucuya ba\u011flanmas\u0131n\u0131 sa\u011flamak i\u00e7in kullan\u0131l\u0131r<\/li>\n
      • hash: ba\u011flan\u0131lan URL ile bir hash olu\u015fturulup ona g\u00f6re y\u00f6nlendirme yap\u0131l\u0131r<\/li>\n
      • fallback: ilk sa\u011fl\u0131kl\u0131 web sunucu se\u00e7ilip t\u00fcm ba\u011flant\u0131lar ona y\u00f6nlendirilir, o sunucuda bir problem olursa, di\u011fer sunucuya ge\u00e7ilir<\/li>\n<\/ul>\n

        Ayarlarda son olarak Varnish’e o siteye gelen ba\u011flant\u0131lar\u0131 sunucu havuzuna y\u00f6nlendirmesini s\u00f6ylememiz gerekiyor, bunun i\u00e7in default.vcl dosyas\u0131ndaki vcl_recv b\u00f6l\u00fcm\u00fcne a\u015fa\u011f\u0131daki gibi bir ayar yapmak gerekiyor:<\/p>\n

        sub vcl_recv {\r\n   if (req.http.host ~ \"^(www.)?benimsitem.com$\") {\r\n       set req.backend = havuz;\r\n   }\r\n}<\/pre>\n

        Art\u0131k benimsitem.com’a giren bir ki\u015fi Varnish \u00fczerinden arkadaki web sunuculara y\u00f6nlendirilecek.<\/p>\n

        Yap\u0131labilecek di\u011fer uygulamalar:<\/strong><\/p>\n

        Varnish yukardaki \u015fekilde kullan\u0131ld\u0131\u011f\u0131nda sadece gelen trafi\u011fi web sunuculara y\u00f6nlendirecektir. Ancak buna ek olarak web sunucular\u0131n y\u00fck\u00fcn\u00fc hafifletmek i\u00e7in \u00e7e\u015fitli ek ayarlamalar yap\u0131labilir:<\/p>\n

          \n
        • Statik dosyalar (jpg dosyalar\u0131, i\u00e7eri\u011fi de\u011fi\u015fmeyen html dosyalar\u0131 vs.) i\u00e7in proxyleme yap\u0131l\u0131p, ayn\u0131 dosyay\u0131 defalarca web sunucudan istemeden direk haf\u0131zadan sunabilir. Bunlar i\u00e7in belli s\u00fcreler ayarlan\u0131p, o s\u00fcre doldu\u011funda tekrar web sunucudan istek yap\u0131lmas\u0131 sa\u011flanabilir<\/li>\n
        • Olas\u0131 bir sald\u0131r\u0131 veya DDOS durumunda gelen istekler Varnish taraf\u0131nda filtrelenip web sunucunun bu gereksiz isteklere cevap vermeye \u00e7al\u0131\u015f\u0131p zorlanmas\u0131 engellenebilir<\/li>\n
        • Web sunucular\u0131n tamam\u0131 \u00e7\u00f6kt\u00fc\u011f\u00fc gibi bir durumda belli sayfalar\u0131n proxy \u00fczerinden sunulmas\u0131 sa\u011flanabilir. \u00d6rne\u011fin bir haber sayfas\u0131nda ana sayfa Varnish \u00fczerinde 5 saniyelik bir s\u00fcre ile proxy yap\u0131lmaktayken, web sunucular \u00e7\u00f6kt\u00fc\u011f\u00fcnde, Varnish’in cache s\u00fcresini uzat\u0131p, ana sayfay\u0131 haf\u0131za \u00fczerinden vermeye devam etmesi sa\u011flanabilir. B\u00f6ylece web sunucular kapal\u0131 olsa bile ana sayfa \u00e7al\u0131\u015fmaya devam edecektir.<\/li>\n<\/ul>\n

          Varnish genel olarak bu \u015fekillerde kullan\u0131lmakla beraber basit ve geli\u015ftirilebilir konfigurasyon yap\u0131s\u0131 sayesinde \u00e7ok daha farkl\u0131 \u015fekillerde de kullan\u0131labilmektedir. Daha \u00f6ncede bahsetti\u011fim diske log yazmamas\u0131 gibi bir\u00e7ok \u00f6zelli\u011fi ile y\u00fczbinlerce ba\u011flant\u0131ya hi\u00e7 zorlanmadan cevap verebilir.<\/p>\n

          Benim Varnish’te tek g\u00f6rd\u00fc\u011f\u00fcm eksik SSL deste\u011fi olmamas\u0131. Bunu da geli\u015ftiricileri SSL \u015fifrelemesinin yap\u0131lmas\u0131n\u0131n programa \u00e7ok fazla y\u00fck getirece\u011fi ve kullan\u0131m amac\u0131n\u0131 bozaca\u011f\u0131 y\u00f6n\u00fcnde a\u00e7\u0131klam\u0131\u015flar.<\/p>\n","protected":false},"excerpt":{"rendered":"

          Varnish son zamanlarda pop\u00fcler olmaya ba\u015flayan bir web proxy sunucusudur. Bu d\u00f6k\u00fcmanda Varnish’in basit\u00e7e kurulumunu ve Varnish ile y\u00fck da\u011f\u0131l\u0131m\u0131 yaparak web sunucunuza d\u00fc\u015fen y\u00fck\u00fc nas\u0131l azaltabilece\u011finize de\u011finece\u011fim. Anlatt\u0131\u011f\u0131m ayarlar Ubuntu i\u00e7in olacak ancak di\u011fer Linux da\u011f\u0131t\u0131mlar\u0131nda da ayn\u0131 \u015fekilde \u00e7al\u0131\u015facakt\u0131r.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3,29],"tags":[32,33,31,30],"_links":{"self":[{"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/posts\/164"}],"collection":[{"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/comments?post=164"}],"version-history":[{"count":1,"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/posts\/164\/revisions"}],"predecessor-version":[{"id":165,"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/posts\/164\/revisions\/165"}],"wp:attachment":[{"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/media?parent=164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/categories?post=164"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.umutbesler.com\/wp-json\/wp\/v2\/tags?post=164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}