NGINX’i Reverse Proxy Olarak Kullanmak

Bir önceki yazımda Heroku üzerinde Play! Framework tecrübemden bahsetmiştim. Heroku‘yu çok çok başlangıçta bir projede kullanırken bazı dezavantajları var. Bunlardan en önemlisi sistemden bir süre ücretsiz faydalanarak bir yerlere gelebileceğinizi hayal ederken, ücretsiz verilen tek işlemcinin belli bir süre uygulamanıza erişilmediği zaman idle konuma alınıyor olması. Mesela uygulamanıza 1 saat kimse erişmediyse, 1 saat sonra gelen kişi, uygulamanın baştan çalıştırılmasını beklemek zorunda kalıyor, bu da 15-20 saniye tutabiliyor. Düşününce daha da önemli olan diğer bir konu ise veritabanı kısmı. Heroku’da 10bin satıra kadar PostgreSQL yada 10MB MySQL’i ücretsiz olarak kullanmanız mümkün. Ödeme seçeneklerine gelindiğindeyse Xen yada KVM sanallaştırmasını kullanan VPS’leri tercih etmek toplamda daha ucuza geliyor yine.

Alternatif olarak Heroku’nun da sistemlerini çalıştırdığı Amazon’u direk kendiniz kullanmanız seçeneği var. Birçoğunuzun bildiği üzere Amazon micro instance’larını 1 yıl süreyle ücretsiz olarak kullanmanıza izin veriyor. Facebook uygulaması olarak geliştirdiğimiz TASK’ı şu an Amazon’un sunucularında çalıştırıyorum. Sunucularında diyorum çünkü EC2 üzerinde bir application server çalıştırırken, RDS üzerinde veritabanını ve S3 üzerinde de uygulamaya yüklenen resimleri barındırıyorum.

Konuya başlama amacından biraz fazla uzaklaştık sanırım. Konuya dönersek, Amazon üzerinde kısıtlı olan kaynaklarınızla bütün işi Play! Framework’e yıkarsanız bazı sıkıntılar yaşayabilirsiniz. Yaşadığım en büyük sıkıntıysa Facebook uygulamalarında zorunluluk haline gelen SSL sertifakası işini Play! Framework’e verirseniz, 1.2.5 sürümünde bilinen bir bug olarak zaman zaman exception fırlatabiliyor. Bundan kurtulmanın en kolay yoluysa NGINX’i reverse proxy olarak kullanmak. Eğer sunucunuzda Ubuntu kullanıyorsanız bu işlemi yapmak inanın çok kolay. Repo’dan nginx’in kurulumunu tamamladıktan sonra /etc/nginx/sites-available/default yolundaki dosyada 1-2 düzenleme yapmanız gerekiyor. Bu dosyadaki server { … } etiketlerinin arasındaki location kısmını aşağıdaki gibi düzenlemelisiniz,

location / {
proxy_pass http://127.0.0.1:8080;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Buradaki proxy_pass kısmına sunucunuzdaki app-container’ınızın çalıştığı adresi vermelisiniz. Eğer uygulamanızda SSL kullanıyorsanız aynı ayarlarla bir de 443 portunu dinleyen sunucu tanımlamalısınız, hepsi bu kadar.

NGINX’i reverse proxy olarak kullanarak statik dosyaların cache’lenmesinden de faydalanabilirsiniz. Emin olun sunucunuzdan her megabyte’ına kadar faydalanmanızı sağlayacak bir iyilik yapmış olacaksınız kendinize.