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.

Heroku’da Play! Framework Tecrübesi

Günümüzde PHP sunucusu bulmak artık işten bile sayılmaz, her yerde PHP koşturabilecek çok makul fiyatlarda sunucular bulmanız mümkün. Ama konu Java, Python, Ruby gibi dillere gelince hele bir de farklı framework’lerine gelince her sunucu istekleri karşılayamayabiliyor. Daha doğrusu bu dillerle yazılan uygulamaların başlangıçtaki tüketimi PHP’ye oranla biraz daha masraflı olduğu için bu dillere verilecek sunucularda fazladan satışlar (over-use) mümkün olmuyor. Doğal olarak taban fiyatlarda yüksek oluyor.

Dünyada cloud computing’in gerçek anlamda yaygınlaşmasıyla ekonomik sunucular bulmak mümkünleşti. Hatta bazıları uygunluğu abartarak geliştirme aşamasında ve az miktarda ziyaretçisi olan uygulamalara hizmetlerini ücretsiz sunuyorlar. Bunlardan en önemlisi tabi ki de Amazon.

Amazon üzerinde kendi sunucunuzu yapılandırabiliyorsunuz. Bunun yanında hazır veritabanı sistemleri ve CDN hizmetleri gibi birçok servis yapılandırılmış durumda, size sadece bunları kullanmak kalıyor. Üstelik yeni üyelik açtığınız zaman 1 yıl boyunca bu hizmetlerin hepsinden belli miktarlara kadar ücretsiz yararlanabiliyorsunuz. Şimdi gelelim yazının başlığında geçen Heroku‘ya.

Heroku sunucu yapılandırmalarının tamamını kendi üstüne almış ve scalability denen kavramın sorumluluğunu da kendisi yüklenmiş. Yani bugün tek çekirdek işinizi görürken yarın 3 çekirdek ihtiyacınız olursa bunu sadece 1-2 tık ile çözebiliyorsunuz.  Ücretlendirmesi de kullandığınız işlemci saati üzerinden yapılıyor. Eğer uygulamanızı o anda kullanan yoksa otomatik olarak boştaki işlem gücü kapatılıyor ve sizin fazladan ücret ödemeniz önlenmiş oluyor. Bütün bunların yanında uygulamanızda tek işlem birimi kullandığınız sürece sizden bir bedel talep etmiyorlar.

Deployment konusuna gelirsek, işin o kısmınında çok kolaylaştırıldığını söylemek isterim. Ben Play! Framework uygulamamı deploy ederken hiç sıkıntı yaşamadım desem yalan olmaz. Sitelerinde anlatılan basamakları sırayla uyguladığınızda normal bir git sunucusuna uygulama yükler gibi yüklemiş oluyorsunuz. Sizin adınıza onlar uygulamayı derleyip çalıştırıyorlar. Veritabanı olarak PostgreSQL kullanırsanız 10bin satırlık veriyi tutmanız ücretsiz, bunun yerine MySQL’u seçerseniz, add-on’lar kısmında ClearDB var bu seferde 5MB’lık verinizi ücretsiz olarak tutuyorlar. Uygulama belli bir kullanıcıya ulaştığı anda bedel ödemeniz gerekiyor ki başlangıç bence yüksek bedeller. Development sürecinden sonra alternatiflere göz atılmalı diye düşünüyorum.

Asterisk PBX Deneyimim

Yarı zamanlı olarak çalıştığım bir firma, komşu bir firmanın projesine destek amaçlı PBX sistemleriyle ilgilenmeyi gözüne kestirdi ve sonuç olarak PBX üzerine bilgi edinmekte benim üzerime düştü. İlk başlarda epey zorlu bir süreç yaşadım çünkü bu alanda kullanılan bütün lugata yabancıydım. Hazırda bulunan teknolojilerden hangilerini kullanmak lazımdı ve bu işler nasıl yapılırdı hiç fikrim yoktu. İşin kötü yanı yıllardır peşinden sürüklendiğim açık kaynak sevdası bu sefer beni zor duruma düşüren taraftı. Kabul etmek gerekir ki çalışan ve emek veren her insan para kazanmanın derdinde. Açık kaynakçılar da elbette para kazanmanın yolu olarak destek satmayı planlıyorlar. Mesela linux kullanıcıları çok kolay olarak destek bulabilirler, çünkü diğer kullananlar tecrübelerini paylaşmaktan çekinmeyerek binlerce sayfa yazmışlar ama iş özelleşmiş ve para getirisinin yüksek olduğu düşünülen bir alana gelince kimse tecrübesini de paylaşmamış. Türkçe kaynak zaten yok desek ayıp etmiş olmayız ama ingilizcesini bulmakta inanın çok zor. En azından başlangıçta hangi yoldan ilerlemeniz gerektiğini tamamen kendiniz bulmanız gerekiyor, eğer ilk sürünme kısmını aşabilirseniz sonradan bulacağınız kaynaklar çok daha fazla işinizi görecektir.

İlk önce hangi işletim sistemiyle yola devam edeceğinize karar vermeniz gerekli. Bu noktada benim ilk isteğim Ubuntu üzerine Asterisk kurarak yola devam etmekti ama işyerim paket olarak dağıtılan sistemleri ileriye yönelik kurulum ve güncellemeler için tercih edeceğini söyledi. Tabi bu durumda Asterisk diye aramalar yaptığınızda karşınıza ilk olarak AsteriskNow adlı işletim sistemi çıkıyor. Ben de ilk olarak onu kullanmayı tercih ettim. Öncelikle ilk kurulumun sonunda sistemin web arayüzü düzgün çalışmıyordu, bir miktar düzenlemenin sonunda çözüme ulaşamadığım gibi sistemi de geri kurtarmak için baştan kurmanın en az zaman kaybı olacağını düşünerek baştan kurulum yaptım. Bu sefer ilginç bir şekilde sistem bir miktar daha düzgün çalışıyordu ama hala eksikler vardı. Bu durum başıma ilk defa geldiği için çok şaşırdım ve durumu inceleme başlayınca diskin sürekli yeni bad sector’ler oluşturarak sistemi bozduğunu fark ettim. Başka bir disk elde ederek üçüncü bir kurulum yaptım. Bu sefer her şey çok düzgündü ancak sisteme bir türlü FXO hattını tanıtmayı başaramadım. Kullandığımız kart ile ilgili bir problemde olabilir ancak bu sırada başka paket uygulamalarında varlığından haberdar oldum. Üstelik AsteriskNow’a oranla çok daha güzel özellikleri olanlar varmış. Kısa bir inceleme sonunda yoluma Elastix (içerisinde yine asterisk barındırıyor) ile devam etme kararı aldım. Elastix’in en büyük avantajı başlangıçta web arayüz üzerinden Hardware Detector adlı bir uygulama sunuyor olması. Sunucuyu çalıştırdıktan sonra telephony kartımızı bu tool ile tanıtmamız çok kolay oldu. Artık gelen aramaları otomatik olarak açarak bu hattın kullanılmadığının duyurusunu sistem yapabiliyordu.

Elimizde çalışan bir sistem vardı artık, yani en azından telefonu açıp “Hello Yakışıklı!” diyebilen bir bayanla baş başaydık. Bu noktada artık IVR yapılandırılması gerekiyordu. Yazıyı bu konuya yabancı arkadaşlarında anlayabileceği şekilde anlatmaya çalıştığım için bu konuya da açıklık getireyim. IVR’ı birkaç kelimeyle özetlersek, bilgisayarın sizin sekreterliğinizi yapmasını sağlamak diyebiliriz. Yani herhangi bir müşteri hizmetlerini aradığınızda şu numaraya basın buraya bağlanın yada bu numaraya basın şuraya bağlanın kısmını oluşturuyor. Ancak bu noktada diğer bütün PBX yazılımları gibi Elastix’in sunduğu imkanlarda çok kısıtlı. Bu noktada kolları sıvayıp programlama yapmaya başlamanız kesinlikle gerekiyor. Bu yazımda tabi ki de nasıl programlanacağından bahsetmeyeceğim ama nereden başlayacağınıza dair yol göstermek istiyorum. Asterisk’i oluşturan firma bu işi yapabilmeniz için Asterisk Gateway Interface adında bir interface oluşturmuş ve bu interface’in birkaç dil ile implemantasyonu yapılmış durumda. Asterisk arayüzleri genellikle PHP ile çalıştığı için ilk tercih olarak PHPAGI‘yi kullanmanızı tavsiye edeceğim, çünkü sunucuda başka bir dilin ağırlıklarını da taşımanızdan sizi kurtaracaktır. Java gibi bir yükü sunucuda barındırmak size bellek tüketimi açısından sıkıntılar yaşatabilecek olmasına rağmen, bellek tüketimi problem değil biz Java kullanmak istiyoruz derseniz  bu sefer FastAGI‘yi kullanabilirsiniz. Başka bir trend olan Python ile yolunuza devam etmek isterseniz de buradaki yazıdan destek alabilirsiniz.

Yeni başlayacak arkadaşlara gerekli bilgileri sunduğumu düşünüyorum, çalışmalarınızda kolaylıklar dilerim.

Jetpack 1.4 Yorum Alanını Nasıl Kullanacağız?

WordPress’in 3.4 sürümüne geçmesinin yanı sıra Jetpack’te artık 1.4 sürümüne geldi ve güzel tarafı WordPress’in yorum alanına facebook gibi hesaplarınızla yorum yapabilmeniz eklenmiş oldu. Ancak ne yazık ki kullandığımız temalarda bu eklentiyi etkinleştirmemize rağmen bir türlü değişikliği göremeyenlerdenseniz, temanızda bir ufak değişikliğe gitmeniz gerekiyor.

Temanızın single.php dosyasının için yorum formunu oluşturan kodunuzu bulun ve tamamen kaldırın. Yerine
php etiketleri arasında comment_form(); kodunu çağırınız. single.php’yi kaydettikten sonra sayfanızı yenilediğinizde, yeni yorum alanının sitenize dahil olduğunu göreceksiniz.

WordPress.Org’a İlk Eklenti

WordPress için yarı yıl tatili süresinde birkaç eklenti yazmam gerekmişti. Bunlardan bazılarını genele yönelik olarak düzenleyip yayınlama kararını vermem yarı yıl tatilinin son bulmasıyla başlamıştı ve ilk eklentimi okul açıldıktan birkaç hafta sonra yayınlamıştım. Ancak hakkında birşeyler yazmak ancak şimdiye kendisinin birkaç ufak hatasını gideren ikinci sürümünü yayınladığım bugüne kısmet oldu.

Eklenti temel olarak içerik türlerine bir de yemek tariflerinizi ekleyebileceğiniz bir tür ekliyor ve şimdilik ayarları ingilizce olarak yer alıyor. Önümüzdeki günlerde içerisinde kendi sayfa görünümünü de içeren Türkçe sürümünü de yayınlamayı düşünüyorum ancak ben o sürümü geliştirecek vakit bulana kadar şu anki sürümüne buradan ulaşabilirsiniz. Karşılaştığınız hataları ve geliştirilmesi gerektiğini düşündüğünüz yerlerini yorum yazarak bana iletirseniz çok sevinirim. Ancak dikkat etmeniz gereken bir nokta var eklentiyi kullanabilmek için sitenizi barındırdığınız sunucuda PHP 5.3 veya yukarısı bir sürüm bulunması gerekiyor.

C# ‘ta App.Config Kullanımı

Benim gibi açık kaynakçı bir adamın gün gelip C# kullanacağına kim inanırdı ama gün geldi bir süreliğine kendisiyle haşır neşir olmam gerekiyor. İlerleyen günlerde sebeplerini de açıklarım ama şimdilik tecrübelerimi paylaşayım. Eskiden exe uygulamarının yanında bazen .ini dosyaları olurdur, C# ile Microsoft onları kullanmaktan vazgeçti. Hazırlamam gereken uygulamada da dışarıdan parametre okumam gerekiyor, hoş ini dosyasıda nasıl kullanılır C# ile bilmediğim için benim için çok birşey fark etmedi ama yine de araştırırken net ve kolay bir kaynak bulamadım. Halbuki benim istediğim sadece 3 tane string okumaktı.

Sadede gelirsek

<configuration>

<appSettings>
<add key="Plant" value="Fab1" />
<add key="Line" value="B1" />
<add key="Section" value="T1" />
</appSettings>

</configuration>

şeklinde hazırlanmış bir app.config dosyasından data çekmek için

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace _ak_res
{
class ReadConf
{
public String getPlant(){
return ConfigurationSettings.AppSettings["Plant"].ToString();
}

public String getLine()
{
return ConfigurationSettings.AppSettings["Line"].ToString();
}

public String getSection()
{
return ConfigurationSettings.AppSettings["Section"].ToString();
}
}
}

şeklinde yazacağınız bir class işinizi görecektir. İşinizi göreceğini umuyorum, anlamadığınız yerler olursa, yorum kısmından sorabilirsiniz.

PHP 5.4 Web Server ile Geliyor

PHP geliştiricilerine güzel bir haberimiz var. Şimdiye kadar geliştiriciler kodlarını test etmek için makinalarına Apache tarzı bir sunucu yazılımı kurmaları ve bütün eklentileriyle düzenlemeleri gerekiyordu. Şimdiyse artık php içerisinde bu özellikleri içeren bir yapıyla geliyor.

Uygulama geliştiriciler artık daha önceden Pyhton kullandılarsa alışkın oldukları gibi direk projenin bulunduğu klasörden çalıştırarak deneme imkanına kavuşuyorlar. Php’yi aşağıdaki gibi çalıştırmanız yeterli oluyor. Port numarası boştaki herhangi bir port numarası olarak belirlenebilir.

$ php -S localhost:1301 -t /projenin/bulundugu/yer

Bu şekilde uygulama çalıştırmanın tek dezavantajı https şeklindeki secure bağlantıları deneyemiyorsunuz. Bu durumdan en çok facebook uygulaması geliştirenler şikayetçi olacaklardır.

Google Chrome ve GNOME-Keyring Anlaşmazlığı

Bu yıl aldığım birçok ders Windows üzerinde çalışan araçları kullanmamı gerektirdiği için Linux’uma daha az uğrar oldum. Vizeler ve ödevlerden nefes alma fırsatım olduğu bir aralıkta geri döndüğümde gelen güncellemeleride yaptıktan sonra birde ne göreyim benim Chromium kaydettiği şifrelerimi hatırlamaz olmuş. Yüzlerce sitenin şifresini ben nasıl aklımda tutayım? Çoğunu hatırlamıyorum bile, Google üzerinden senkronizasyon ile bu sorunu aşıyorum genellikle ama şifrelerim hatırlanmadığı zaman büyük bir sorun oluştu tabiki…

Nasıl üstesinden gelirim diye internette dolaşırken problemin gnome-keyring’le olan ilişkide çıkan sorunlardan kaynaklandığını öğrendim ve çözüm önerisi olarak Chromium’u tamamen kaldırıp tekrar kurmam ve parametre olarak “–password-store=basic” ile başlatırsam bilgisayarımda saklanan şifrelerimin artık şifrelenmeyeceğini ama erişlebilir olacağını öğrendim. Kişisel bilgisayarıma erişimin zaten birkaç kişi ile sınırlı kaldığınıda göz önünde bulundurarak bu yöntemi kullanmaya başladım.

Tekrardan şifrelerimin tarayıcım tarafından hatırlanması güzel bir duygu…

CentOS VPS’e Transmission Kurulumu *Güncellendi*

Elimde uzun zamandır bulunan bir vps’i torrent istemcisi olarak kullanmak istiyordum. Tabi ilk olarak aklıma ssh üzerinden bir torrent istemcisi kullanmak geldi ve google üzerinden onlarca arama yapmama rağmen beni tatmin edebilecek düzeyde bir istemci bulamadım. Sonra araştırma yapmaya devam ederken, halihazırda zaten kullanmakta olduğum transmission’ın GTK arayüzünden çok daha güzel bir web arayüzüne sahip olduğu aklıma gelince neden onu kullanmıyorum diyerek paket yöneticisinde var mı diye baktım. CentOS’çular beni hayal kırıklığına uğratmak için çabalıyor olsalar gerek ki bütün torrent istemcilerini depolarından kaldırmışlar.

Örnek Ekran Görüntüsü
Örnek Ekran Görüntüsü

Kaynak kodundan derleyerek kurma düşüncesine girdim ama bu seferde karşıma çıkan bağlılıklar cileden çıkarmaya yetecek boyutlardaydı. Sağolsun birileri transmission için gerekli depoları oluşturmuş ve bağlılıklarıyla beraber sunuyor. Bu durumda yapmanız gerekenlerin listesi %80 azalıyor. Eğer bir Linux kullanıcısıysanız terminalinizden direk ssh komutuyla vps’inize bağlanabilirsiniz, Windows kullanıcısıysanızda bu işi putty ile gerçekleştirdikten sonra CentOS 5 kullanıcı iseniz

cd /etc/yum.repos.d/

wget http://geekery.altervista.org/geekery-el5.repo

komutlarıyla, CentOS 6 kullanıcısıysanız da

cd /etc/yum.repos.d/ wget http://geekery.altervista.org/geekery-el6.repo

komutlarıyla depolarımızı ekliyoruz. Sonrasında

yum install transmission*

komutunu kullanmanız kurulum için yeterli oluyor. Konsola transmission-daemon yazarak uygulamanın çalışmasını sağlayabilirsiniz. Artık transmission emrinize amade. Çok basit bir kullanıma sahip olan arayüze erişmek için yapmanız gereken tek şeyse http://vpsin-ip-adresi:9091/ yazarak enter tuşuna basmanız.
Bol seed’li günler dilerim… 🙂

Güncel repo adresleri için: http://geekery.altervista.org/dokuwiki/doku.php

Ubuntu 11.04 ve Eclipse Çıkmazı!

İlk çıktığı haftalardan bugüne takip edenlerin bildiği gibi Ubuntu 11.04 kullanıyorum. Genel olarak hoşuma gittiği için bırakasımda gelmiyor ancak Unity’nin beta havasıda arada çıldırtmıyor değil. Hele benim gibi programlamayla iç içe yaşıyorsanız ve bu sizin işinizse Eclipse’de ki scrollbar’ın çıkardığı problemler sizi de çileden çıkarıyordur eminim.

Uzun zamandır bu problemi yaşıyor olmama rağmen ilginç bir şekilde çözüm arayışınada girmemiştim ancak bugün durup niye diretiyorum, eski scrollbarı kullanmanın illa bir yolu vardır, sorunsuz şekle getirilene kadar yenisi, geçip eskisini kullanayım dedim. Biraz geç oldu ama en azından hiç geri adım atmamaktan iyidir.

Benim gibi bu sorunu yaşayan arkadaşlardan işlerini görsünler sorunları düzelsinden çok ben bunu yarın bir gün unuturum diye yazma ihtiyacı hissettiğim bir yazı oldu dersem kimseye yalan söylememiş olurum. 🙂 Lafı uzatmadan söylemek gerekirse “sudo su” ile root olduktan sonra

echo “export LIBOVERLAY_SCROLLBAR=0” >> /etc/X11/Xsession.d/80overlayscrollbars

komutunu verin ve sistemden çıkıp geri geldiğinizde eski scrollbarlar sizi karşılasın. Benim gibi Unity’de direten kaç kişi var bilmiyorum ama diretenlerin işine yarayacak bir çözüm oldu.