Ana Sayfa » *nix » Apache mod_proxy, mod_cache ile Reverse Proxy Kurulumu

Apache mod_proxy, mod_cache ile Reverse Proxy Kurulumu


BerbatKötüİdare EderGüzelHarika (Toplam 3 oy. 5 puan üzerinden ortalama 3,33 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...
Bilindiği gibi Ters Vekil Sunucu olarak bilinen Reverse Proxy uygulamaları adından da anlaşıldığı üzere normal proxy (bu da ne demekse) uygulamalarının ters şekilde çalışan versiyonudur. Yani normal bir proxy uygulamasında kullanıcı tarafında bulunan proxy sunucusu, reverse proxy mantığında web sunucusu tarafında bulunur ve kullanıcılar görüntülemek istedikleri bir web sitesi için ilgili web sunucusu yerine reverse proxy ile irtibata geçerler.Reverse Proxy ise kullanıcının istekleri doğrultusunda ilgilli web sitesine ait veriyi web sunucusundan çeker ve kullanıcıya iletir. asf-logo-reduced

Reverse proxy uygulamalarının birden fazla kullanım amacı bulunmaktadır. Bu makalede 7.0 üzerinde web sunucusu kullanarak mod_proxy, mod_cache modülleri ile bir web sitesinin içeriğinin memoryde cachelenmesi ve performans artışı sağlanması anlatılmaktadır.

Trafiği yüksek bir web sitesinde zaman zaman aşırı derecede yüklenmeler olabilir; disk I/O problemleri yaşanabilir ve bunun sonucunda da sitede yavaşlama meydana gelebilir. Böyle durumlar için yapılabilecek şeylerden birisi de reverse proxy uygulaması ile sitenin (durağan html sayfaları, resim dosyaları vs. gibi) statik contentini cachelemektir. Böylece daha önceden cachelenmiş ve değişmeyen bu içeriklerin görüntülenmesi için web sunucusunun kaynakları tüketilmemiş olur.  Ayrıca, statik içeriğinizi memory’de cacheleyerek erişim hızını epey yukarılara çekebilir ve performans konusunda da kazanç sağlayabilirsiniz.

İşte nasıl yapıldığı:

Ben için her zaman kullanıyorum; dolayısı ile bu yazıda anlatılanlar için geçerlidir. Ancak herhangi bir Linux dağıtımı kullanıyor olsanız bile mantık aynıdır.

Makalede anlatılan kurulum sadece bir web sitesini hizmet verecek bir proxy sunucusuna aittir. Bu nedenle tamamen ön tanımlı olarak kurulan bir 2.2 kullandım.
Eğer siz birden fazla web sitesi için proxy  kullanmak istiyorsanız, httpd.conf içerisindeki virtual hosts tanımlamalarınızı düzenlemeniz gerekir. Benim anlatacağım örnek için virtual hosts kullanılmamıştır.

Reverse Proxy ve Memory Cache uygulaması için aşağıdaki apache modüllerinin kurulu olması gerekmektedir.

CACHE
DISK_CACHE
PROXY
PROXY_CONNECT
PROXY_HTTP

Dikkat ettiğiniz gibi proxy ve cacheing ile ilgili hemen tüm modüller listede yer alıyor.  Bu modüllere kısaca değinmek gerekirse;

DISK_CACHE modülü, cachlenecek verinin diskin herhangi bir bölümünde tutulmasını sağlıyor.  Apache’nin proxy görevi görebilmesi için PROXY ve http üzerinde proxy hizmeti vereceğimiz için PROXY_HTTP modülü kullanılıyor.

Normalde, apache 2.2 kurulumunda seçtiğiniz modüllere ait httpd.conf girdileri otomatik olarak yapılıyor. Ancak belki lazım olur diye, httpd.conf içerisindeki ilgili LoadModule satırları aşağıdaki gibidir.

LoadModule file_cache_module libexec/apache22/mod_file_cache.so
LoadModule cache_module libexec/apache22/mod_cache.so
LoadModule disk_cache_module libexec/apache22/mod_disk_cache.so
LoadModule mem_cache_module libexec/apache22/mod_mem_cache.so
LoadModule proxy_module libexec/apache22/mod_proxy.so
LoadModule proxy_connect_module libexec/apache22/mod_proxy_connect.so
LoadModule proxy_http_module libexec/apache22/mod_proxy_http.so

Apache sunucusu proxy ve cache işlemi için kullanılmaya hazırsa yapılandırma ile ilgili bölüme geçebiliriz.

Cache işlemini temel olarak birkaç şekilde yapabilirsiniz; birincisi cachelenen içeriği disk üzerindeki herhangi bir alanda tutmaktır. Diğeri ise disk yönteminden çok daha hızlı olan memory’de tutma işlemidir. Eğer diskleriniz hızlı değil ve proxy olarak kullanacağınız bilgisayarda yeterli raminiz varsa ikinci yöntemi öneririm.

Ben bu noktada memory’de cacheleme yöntemini daha efektif buluyorum. Ancak memory cache işlemi için ram’in bir kısmını sisteme disk olarak tanıtıyorum ve bu şekilde melez bir yöntem kullanıyorum.  Neden böyle yaptığımın nedenlerinden birisi, cachelenen içeriği direk olarak memory’de tutarsanız ilgili içeriği görme şansınız olmuyor. Yani herhangi bir dizin yapısı olmadığından dolayı nelerin cachelendiğini görme şansınız bulunmuyor. Bir diğer nede ise, memory’de cachelenmiş içerik apache’nin her restart edilişinde uçuyor olması ki bu da pek hoş bir durum değil. İşte bu nedenlerden dolayı bahsettiğim şekilde, ramdisk oluşturmak ve içeriği burada cachelemek daha mantıklı görünüyor. Bu şekilde apache restart sonrası cache uçmayacaktır. Ancak gene de sistemi reboot ettiğiniz zaman ramdiskinizin uçacağını bilmelisiniz.

Şimdi bir ramdisk oluşturalım, sonrada sistem açılışlarında yeniden oluşturulup mount edilmesi için bir startup scripti yazalım.

Önce, mount etmek için bir dizin açalım ve örnek olarak 1GB’lik bir ramdisk  oluşturalım.

# mkdir /mnt/ramdisk
# /sbin/mdmfs -s 1024M md10 /mnt/ramdisk

df -h dediğiniz zaman ramdiski mount edilmiş bir şekilde görmeniz gerekir.

Bu noktada ipucu olması açısından belirtmekte yarar var. Cacheleyeceğiniz web sitesinde çok fazla static content bulunuyorsa oluşturulan ramdiskin inode değerlerinin static content rakamını karşılayacak adette olması gerekir. Eğer böyle bir durum varsa 1GB’lik ramdisk için inode değerini arttırlamak için komutu /sbin/mdmfs -s 1024M -i 1024 md10 /mnt/ramdisk olarak revize edebilirsiniz. df -i komutu ile inode değerlerinizi görebilirsiniz.

Not: inode değerini arttırdığınız zaman 1GB’lik diskin kullanılabilir alanı azalacaktır.

Neyse, ramdisk yaratıldığına göre, sistemi restart ettiğiniz zaman yeniden oluşturulması için gereken scripti yazalım.

Örnek olarak / dizini altında ramdisk_olustur.sh isimli bir dosya açın ve içerisine aşağıdaki satırları girin.

#!/bin/sh
/sbin/mdmfs -s 256M md10 /mnt/ramdisk
/usr/sbin/chown www:www /mnt/ramdisk
/bin/echo "****RAMDISK OLUSTURULDU****"

Dikkat ettiğiniz gibi ilk satır ramdisk’i oluşturuyor, ikincisi ise cachelenen verinin apache tarafından ramdiske yazabilmesi için gerekli owner durumu ayarlanıyor.

Not: ’lerde apache’nin kullanıcısı www’dir. Eğer herhangi bir linux dağıtımı kullanıyorsanız, sisteminizde apache için açılmış kullanıcı adını belirtmeniz gerekir. (Bu isim genelde apache’dir.)

Son olarak scriptin sistem açılışlarında çalıştırılabilmesi için /etc/rc.local dosyasına aşağıdaki şekilde bir satır ekleyin.

#!/bin/sh
# rc.local provides execution of startup scripts.
#
#RamDisk Olustur
/bin/sh /ramdisk_olustur.sh

Not: Bu dosya sisteminizde mevcut değilse oluşturmanız gerekir.

Evet, artık üzerinde apache kurulu bir bilgisayarımız ve sistem açılışlarında otomatik olarak oluşturulacak bir ramdiskimiz mevcut.

Bundan sonraki adım, apachenin httpd.conf dosyasında gerekli tanımları yapmak.

Anlatılacak örnekte, statik içeriği cachelencek web sitesi olarak www.syslogs.org adresini kullanacağım.

/usr/local/etc/apache22/ dizini altında duran httpd.conf dosyanızı editleyin ve en alttaki satırın bir üstüne aşağıdaki satırları kendinize göre düzenledikten sonra ekleyin.

<IfModule mod_cache.c>
CacheIgnoreQueryString On
CacheDefaultExpire 86400

<IfModule mod_disk_cache.c>
CacheRoot /mnt/ramdisk
CacheEnable disk /images
CacheDirLevels 3
CacheDirLength 2
CacheMaxFileSize 100000
CacheMinFileSize 64
</IfModule>
</IfModule>

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://www.syslogs.org/
ProxyPassReverse / http://www.syslogs.org/

Eklediğimiz bu satırlarla ilgili detaylı bilgiye sayfanın en altında bulunan kaynak linklerinden ulaşabilirsiniz.

Ancak kısaca değinmek gerekirse,

Bu örnekte www.syslogs.org adresindeki /images dizini altında bulunan içerik cacheleniyor. Yani bu dizin altındaki dosyalar kullanıcılara direk olarak proxy üzerinden verilecektir.  (Herşeyi cachelemek istiyorsanız sadece / demeniz yeterli. ) Ayrıca, cachelenecek dosyaların minimum 64 byte büyüklüğünde olmasını belirtiyoruz; ve toplamda 1 milyon adet dosya cachlenmesini söylüyoruz. Cachelenen verinin 86400 saniye (1 gün) sonra expire etmesini belirtiyoruz.

Son olarak burada dikkat edilmesi gereken önemli bir noktaya da değinmek istiyorum.
ProxyRequests ibaresi herzaman için Off konumda olmalıdır. Aksi taktirde sunucunuzu üçüncü şahısların kullanımına açmış olursunuz.

Yukarıdaki örneği kendi sisteminize uygulayarak kullanabilirsiniz. Ayrıca, kaynak linklerinden yararlanarak ekstra özellikler eklemeniz de mümkün.

Şimdi, değişikliklerin aktif olması için apachectl restart komutu ile apache servisini yeniden başlatın.

Herhangi bir hata almadıysanız reverse proxy’nin ilgili web sitesini cachelemek için kullanıma hazır olması gerekir. Bundan sonra yapmanız gereken tek şey en kolay yoldan DNS kayıtlarınızı düzenlemek ve ziyaretçileri proxy sunucusuna yönlendirmekten ibaret. Ancak dns kayıtlarını güncellerken dikkat etmeniz gereken bir nokta var:  Proxy sunucusu da ilgili siteye erişmek için www.syslogs.org adresini kullanıyor ve siz DNS’den bu siteyi proxy sunucusuna yönlendirirseniz, proxy’nin kendisi de siteyi kendi üzerinde arayacak ve bulamayacaktır. :) Bu nedenle proxy’ye sitenin asıl yerini ayrıca belirtmeniz gerekir.

/etc/hosts dosyasını açın ve aşağıdaki gibi bir girdi girin:

(sitenin gercek ip adresi)            www.syslogs.org

Artık dns kaydınızı değiştirebilir ziyaretçileri proxy’ye yönlendirebilirsiniz.  Böylece, ziyaretçiler site erişimi için proxy’ye gelecekken, proxy siteye ulaşmak için gerçek web sunucusuna gidecektir.

Test yapmak için kullandığınız client bilgisayarın hosts dosyasında manuel olarak xxx.xxx.xxx.xxx www.syslogs.org gibi bir tanımlama yapabilirsiniz. Bu şekilde dns kaydına gerek kalmaksızın deneme şansınız olacaktır.

İlk testi yaptıktan sonra, /mnt/ramdisk dizininin çıktısı aşağıdakine benzer olacaktır.

[[email protected]_proxy ~]# ls -l /mnt/ramdisk/
total 24

drwx------  3 www   www       512 Feb 11 23:38 E2
drwx------  3 www   www       512 Feb 11 23:38 [email protected]
drwx------  3 www   www       512 Feb 11 23:38 MD
drwx------  3 www   www       512 Feb 11 23:38 NP
drwx------  3 www   www       512 Feb 12 00:06 OT
drwx------  3 www   www       512 Feb 11 23:38 Ou
drwx------  3 www   www       512 Feb 11 23:38 UJ
drwx------  3 www   www       512 Feb 11 23:38 YE
drwx------  3 www   www       512 Feb 11 23:38 mt
drwx------  3 www   www       512 Feb 11 23:38 oX
drwx------  3 www   www       512 Feb 12 00:06 x4

Görüldüğü gibi cachelenen contentin barındırılması için belirli bir algoritma ile hiyerarşik bir dizin yapısı oluşturulmuş durumda. Dizinleri incelerseniz cachelnen contente ait dosyaları görebilirsiniz.

En son olarak, cache alanınızın şişmemesi ve expire eden dosyaların silinmesi için bir işlem daha bulunmaktadır. Apache’nin bu işi yapan htcacheclean isimli güzel bir programcığı bulunuyor. Bu programı isterseniz cron ile isteseniz de daemon mod’da bir servis olarak çalıştırabiliyorsunuz ve belirlediğiniz kurallara göre cache dizinlerinde temizlik yapıyor.

Bu programcık mod_cache ile birlikte geliyor. Dolayısı ile herhangi bir kuruluma gerek yok.

Sistemde /usr/local/etc/rc.d/htcacheclean ismi ile duran bu dosyayı editleyin ve htcacheclean ile başlayan satırları aşağıdaki gibi kırmızı ile belirtilmiş şekilde düzenleyin:

htcacheclean_enable="${htcacheclean_enable:-"NO"}"
htcacheclean_cache="${htcacheclean_cache:-"/mnt/ramdisk"}"
htcacheclean_cachelimit="${htcacheclean_cachelimit:-"1000M"}"
htcacheclean_interval="${htcacheclean_interval:-"60"}"
htcacheclean_args="${htcacheclean_args:-"-t"}"

Not: Scriptin default tanımlarında ki htcacheclean_args:-“-t -n -i” ibaresinde geçen -n ve -i parametrelerini silmemin nedeni diskin ramdisk olmasından dolayı I/O ile ilgili derdimin olmamasından kaynaklanıyor.  Siz kaldırmak istemiyorsanız silme işleminin daha yavaş olacağını hesaba katmanız gerekir.

Bu konuyla ilgili detaylı bilgiyi de sayfanın sonundaki kaynakça linklerinde bulabilirsiniz.

Şimdi htcacheclean’i daemon mode’da çalıştıralım.
Önce, sistem açılışlarında da çalışması için /etc/rc.conf dosyasına aşağıdaki satırı ekleyin.

htcacheclean_enable="YES"

Şimdi de servisi çalıştırın.

# /usr/local/etc/rc.d/htcacheclean start

ps -aux |grep htcacheclean komutu ile durumu kontrol ettiğinizde düzenlediğimiz şekilde çalıştığını görebilirsiniz:

root 1152  0.0  0.3 0:00.02 /usr/local/sbin/htcacheclean -p/mnt/ramdisk -d60 -l250M -t

Cache dizininin temizlik işlemlerini de hallettiğimize göre yapacak başka bir şey kalmıyor.

Artık elimizde, sitemizin /images dizini altında duran resim dosyalarını cachelemek üzere devrede olan bir proxy sunucumuz bulunuyor.

Güle güle kullanın.

Kaynaklar:

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
http://httpd.apache.org/docs/2.2/mod/mod_cache.html
http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html
http://httpd.apache.org/docs/2.2/programs/htcacheclean.html

Kategoriler: *nix |

Bu yazılar da ilginizi çekebilir:


- FreeBSD Sistemlerde RamDisk Oluşturulması
- NCSA_AUTH ile Şifreli Squid Proxy Kurulumu | FreeBSD
- FreeBSD – Jail Sistemleri Ramdisk Üzerinde Çalıştırmak
- Apache için mod_security Kurulumu
- Squid ve IPFIREWALL ile Transparan Proxy Kurulumu

Yorumlar


  1. Uğur | (Ocak 22nd, 2012 1:19 am)

    Elinize sağlık.
    Güzel bir Türkçe kaynak olmuş.
    Ek olarak bir şey eklemek istedim.Proxy konfigurasyonu yapmadan da yapılandırılan ramdisk üzerinde content tutup publish etmek de mümkün.
    Selamlar.

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Evet mumkun, ancak sistem reboot’unda data ucacagi icin guvenilir degil malesef.
    Bir de bir kac yuz GB’lik icerik soz konusu olunca, sisteme o ebatlarda memory takmak mumkun olamiyor.

    [Cevapla]

Trackbacks

Yorumda bulunun.