18 Aralık 2013 Çarşamba

FastCGI, Nginx Yapılandırması

Bu yapılandırmayı neden kullanmam gerekti öncelikle ondan bahsedeyim. 

Bu yıl yapmaya çalıştığım işlerden biri de Haproxy için web arayüzü yazmak. Stajda Flask kullanarak yazdığım 'Hapra' uygulamasını temel alacağı ve o uygulamanın çıktıları arayüzde gerektiği için  Hapra'nın sürekli çalışır durumda olması gerekiyordu.

Sunucuya nginx'i kurduktan sonra Flask için bu işin FastCGI ile yapılabileceğini öğrendim. 

Nginx ile WSGI uygulamasını kullanmak için önce bir FastCGI sunucu gerekiyor. En çok kullanılanı Flup  olduğu için onu kurdum.
#apt-get install python-flup

Adımlar sırayla şöyle:
1. Önce Flask ile yazılan uygulamamızı /var/www altına taşımalıyız.
2. Uygulamanın içine a.fcgi dosyası oluşturup aşağıdakileri yazmalıyız.
    
#!/usr/bin/python 
from flup.server.fcgi import WSGIServer 
from yourapplication import app 

if __name__ == '__main__': 
    WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()
  
*Burada  'yourapplication' ve 'app' kısmını kendi uygulamanıza göre değiştirmelisiniz.

3. a.fcgi'ye çalışma izni vermeliyiz.

#chmod +x a.fcgi

#chown -R www-data:www-data klasoradi

4. #vim /etc/nginx/sites-enabled/default

5. Bu yapılandırma dosyasında 'location/' satırını yorum satırı yapıp aşağıdaki satırları eklemeliyiz.

location / { try_files $uri @yourapplication; } 
location @yourapplication { 
    include fastcgi_params; 
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param SCRIPT_NAME ""; 
    fastcgi_pass unix:/tmp/yourapplication-fcgi.sock; }

Son satırı değiştirip a.fcgi'de belirttiğiniz yolu yazmalısınız.

6. service nginx restart
7. su www-data

Yapılandırmadaki değişiklikten sonra nginx'i yeniden başlattık, www-data kullanıcısı olduk.

8. screen
a.fcgi arkada hep çalışır durumda olmalı. Bu yüzden screen komutunu kullandık.

9. /var/www/yourapplication/a.fcgi
Son olarak .fcgi dosyasını çalıştırdığımızda uygulamamız sürekli çalışır durumda olacaktır.

Görüşmek üzere..



 


Screen Kullanımı

Merhabalar, bu yazımda sunucuda yapılandırma yaparken kulandığım screen komutundan ve temel kullanımından bahsedeceğim.

Uzak bağlantılarda birden fazla uçbirim açmak için 'screen' komutu kullanılıyor.

Yüklü değilse,

deb paket yöneticisi kullanıyorsanız: #apt-get install screen 
rpm paket yöneticisi kullanıyorsanız: #yum install screen
dedikten sonra komutu kullanabilirsiniz.

screen                                                                                                                        

Bu komutu verdiğimizde aşağıdaki gibi bir ekranla karşılaşacağız.


Bu kısımdan sonra görülen komut satırı yeni açtığınız ekrandır.
Çalışan ekranları görmek için 'screen -ls' ya da 'screen -list' komutlarını kullanabilirsiniz.

Ctrl-a screen'de komut verileceğini belirtir.

Örneğin Ctrl-a-d ekranı arka plana atar. 'screen ls' diyerek ekranın durumunu görürüz.

Bağlanmak istediğimiz ekran için 'screen -r ekran_numarası' komutu kullanılır.

Bazı Kısayollar:

C+a+c (yeni pencere)
C+a+" (pencere listesi)
C+a+d (pencereyi arka plana alma)
C+a+0 (0 numaralı pencereye geçiş yapar)
C+a+A (isim verme)
C+a C+a (açık pencereler arasında sırayla geçiş)
C+a+n ya da space ya da p (sonraki/önceki ekran)
C+a+K ya da exit (ekranı kapatma, exit sormadan kapatır)
Ctrl-a ? (Kısayolları görüntüler)
Ctrl+A [ (Kopyala)
Ctrl+A ] (Yapıştır)

Daha çok parametresi için 'screen --help' ile sizleri başbaşa bırakıyorum.

12 Aralık 2013 Perşembe

INET-TR’13

Bu yıl 18.si düzenlenen Türkiye'de İnternet Konferansı,  9-11 Aralık tarihinde İstanbul Üniversitesi'nde gerçekleşti. Kendime kısa bir tatil ilan ettiğim için, etkinliğe Bolu'dan katıldım. 

Hava şartları ve İstanbul'un trafiği berbattı. Çomü'den katılanlarla Kongre Merkezi'nde buluştum. (+Necdet Yücel, +Ebru Akagunduz, +Esra Altintas, +Berk Güreken, +Faruk Uzun, +Feyza Yavuz, +Ayşe Melike Yurtoğlu ve +yeliz taneroğlu )

Sabahki +Ebru Akagunduz ve Tülin İzer'in "Linux Çekirdeğine Nasıl Katkı Verilir?" sunumunu ne yazık ki kaçırdım. Ama buradan benim gibi izleyebilirsiniz :)  

Öğleden sonra +Çağdaş Direk'in "Müzik ve Medya Dünyası için Özgür Yazılımlar" sunumuna katıldım. Sunumda Teknolojik aletler geliştikçe ses kalitesindeki değişimin nasıl olduğundan, yazılımsal ve donanımsal olarak bu kaliteyi nasıl değiştirebileceğimizden, geliştirilen yazılımlardan ve özelliklerinden bahsedildi. Müzikle ilgilendiğimden benim için yararlı geçen bir sunumdu.

Bir de "Toplumsal Olaylar, Sosyal Medya ve Hukuk" paneline katıldım. 
Konuşmacılar: Ebru Baranseli(Moderatör), Başak Purut(Ekşi Sözlük), Hande Kuday,Efkan Bolaç, Gökhan Ahi(Bilgi Üniversitesi).  Toplumsal olaylar sırasında sosyal medya kullanımından, kullanıcıların yasal haklarından bahsedilen panel, soru-cevap şeklinde sona erdi. 

Elazığ'dan kalkıp gelen, twitterdan bildiğim +sümeyye Bazna ile burada tanıştık. Çok da memnun oldum:)

Etkinlikten sonra +Kaan Ozdincer de bize katıldı. Kadıköy'de otobüs saatine kadar bolca muhabbet etme fırsatımız oldu.

Yine çok eğlendiğim, 'iyi ki de gitmişim' dediğim bir etkinlik oldu :)



30 Kasım 2013 Cumartesi

Özgür Web Teknoloji Günleri 2013

Geçtiğimiz hafta Yeditepe Üniversitesi'nde gerçekleşen 'Özgür Web Teknoloji Günleri' hakkında ben de birşeyler yazmak istedim.

Etkinliğe +Necdet Yücel ve +Ebru Akagunduz ile birlikte katıldık. ÇOMÜ'den daha çok öğrenci ile katılmak isterdik ama vize dönemi bitmemişti.

Bu sene etkinliğin genel konusu ölçeklenebilirlikti. Konuşmalar 3 salonda paralel olarak yapıldı. İlk gün birkaç sunum dinledim. Katılımcıların fazla olduğunu söyleyemeyeceğim.

Etkinliğin ikinci günü Ebru ile birlikte konuşma yaptık. Ebru, Yakından Eğitim'de geliştirdiği Couchbase Nagios eklentisinden bahsetti. Ben de staj dönemimde +Kaan Ozdincer ile üzerinde çalıştığımız Haproxy kitaplığından ve web uygulamasından bahsettim. 

İlk kez bir topluluk karşısına çıkıp birşeyler anlattım. İtiraf etmeliyim ki dışarıdan göründüğü kadar kolay değilmiş. Ne kadar heyecanlansam da benim için çok güzel bir deneyim oldu. Sonraki konuşmalarımda bu kadar heyecanlanmam sanırım :)

Etkinlikten sonra mezunlarla bolca zaman geçirdik. Benim için hem faydalı hem de çok eğlenceliydi.




3 Kasım 2013 Pazar

Qmail Kurulumu

Merhabalar, geçen yazımda biraz Qmail'den bahsetmiştim. Kurulumu bitirince nasıl olduğunu paylaşayım istedim.

Qmail'i kurmadan önce hostname(e-posta sunucu ismi) DNS sunucuda kayıtlı ve sorgulanabilir olmalı. Ayrıca bazı yazılımların kurulu olması gerekiyor.

ucspi-tcp: Tcp tetikleyicisidir. Gelen tcp isteklerini dinleyip, istekler için uygun programları çalışmaları için tetikler.

Yazılımı kurmak için önce buradan indirelim.

#gunzip ucspi-tcp-0.88.tar.gz
#tar -xf ucspi-tcp-0.88.tar
#cd  ucspi-tcp-0.88
#make setup check

!! Glibc'nin 2.3.1 ve daha üst versiyonunu kullanıyorsanız (ldd --version ile öğrenebilirsiniz) "#make setup check" demeden önce error.h dosyasında "extern int errno;" satırını "#include <errno.h>" diye değiştirmelisiniz. 

daemontools: Unix servis yönetim programıdır. Duran servis varsa 'run' betiği ile servisi yeniden başlatır. Multilog sistem günlüklerini tutar. Belirlenen buyutu aşarsa günlükleri arşivler. Bu yazılımı da kurmadan önce '/package' diye bir dizin oluşturalım.

#mkdir -p /package
#chmod 1755 /package

Erişim iznini  1755 ile "drwxr-xr-t" haline geldi. Burada 't' sticky bitin belirlendiğini gösteriyor. Bu sayede sadece dosya sahibi erişimde değişiklik yapabilir ve dosyayı silebilir.

Şimdi yazılımı  package dizinine indirip kuralım. 

#cd /package
#gunzip daemontools-0.76.tar.gz
#tar -xpf  daemontools-0.76.tar
#rm daemontools-0.76.tar
#cd admin/daemontools-0.76
#./package/install

Yine Glibc'nin 2.3.1 üstü versiyonunu kullanıyorsanız son komuttan önce "/package/admin/daemontools-0.76/src/error.h" dosyasında "extern int errno;" satırını "#include <errno.h>" diye değiştirmelisiniz.

Kurulumdan sonra daemontools çalışıyor mu diye bakmak istersek:

#ps aux| grep svscan

Qmail için /var/qmail dizinini oluşturalım.

#mkdir /var/qmail

Qmail çeşiti görevleri yürütmek için sistem kullanıcı ve gruplarına ihtiyaç duyar. Nedeni de qmail yazarı D.J.Bernstein'in sistem kütüphanelerine güvenmemesi.Derlemeden önce UID'ler tespit edilip program içine gömülür. Bu nedenle gerekli kullanıcı ve gruplar oluşturulmalı.

#groupadd nofiles
#useradd -g nofiles -d /var/qmail qmaild
#useradd -g nofiles -d /var/qmail/alias alias
#useradd -g nofiles -d /var/qmail qmaill
#useradd -g nofiles -d /var/qmail qmailp

#groupadd qmail
#useradd -g qmail -d /var/qmail qmailq
#useradd -g qmail -d /var/qmail qmailr
#useradd -g qmail -d /var/qmail qmails

Şimdi qmail'i indirip aşağıdaki komutları verelim.

#gunzip qmail-1.03.tar.gz
#tar -xf  qmail-1.03.tar
#cd qmail-1.03
#make setup check

Derlemeden sonra Qmail'i yapılandırmalıyız. Eğer DNS ayarları düzgün çalışıyorsa "#./config" ile yapılandırma başlatılır.

DNS geçici nedenlerle çalışmıyorsa host ismini bulamadığından olabilir.

#./config-fast host adı.alan adı

Şimdi de açılış betiklerini oluşturalım.

#vi /var/qmail/rc

#!/bin/sh
exec env - PATH="/var/pmail/bin:$PATH"  \
qmail-start "`cat /var/qmail/control/defaultdelivery`"

E-postanın nasıl dağıtılacağı da defaultdelivery dosyasından okunacak.

# echo ./Maildir/ > /var/qmail/control/defaultdelivery

rc dosyasının da izinlerini verelim.

#chmod 755 /var/qmail/rc

Qmail servisleri için supervise dizinleri ve günlük dizinleri oluşturalım.

#mkdir -p /var/qmail/supervise/qmail-send/log
#mkdir -p /var/qmail/supervise/qmail-smtpd/log
#mkdir -p /var/qmail/supervise/qmail-smtpd
#chown -R qmaill /var/log/qmail

Her biri için çalıştırma betikleri oluşturalım.

#vi /var/qmail/supervise/qmail-send/run

#!/bin/sh
exec /var/qmail/rc

#vi /var/qmail/supervise/qmail-smtpd/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \
/usr/local/bin/multilog t /var/log/qmail/smtpd

#vi /var/qmail/supervise/qmail-smtpd/run

#!/bin/sh
QMAILDUID= `id -u qmaild`
NOFILESGID= `id -g qmaild`
MAXSMTPD= `cat /var/qmail/control/concurrencyincoming`
exec /usr/local/bin/softlimit -m 8000000 \
/usr/local/bin/tcpserver -v -H -R -l 0 -x \
/etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1

concurrencyincoming, aynı anda tcp sunucusu tarafından kabul edilecek bağlantı sayısını belirler.

#echo 150 > /var/qmail/control/concurrencyincoming
#chmod 644 /var/qmail/control/concurrencyincoming

#vi /var/qmail/supervise/qmail-smtpd/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \
/usr/local/bin/multilog t /var/log/qmail/smtpd

Bu betiklere çalışma hakkı verelim.

#chmod 755 /var/qmail/supervise/qmail-send/run
#chmod 755 /var/qmail/supervise/qmail-send/log/run
#chmod 755 /var/qmail/supervise/qmail-smtpd/run
#chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

Daemontools tarafından çalıştırılsın istiyorsak /service dizinine link oluşturmalıyız.

#ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service

qmailctl betiği çalışıyorsa link oluşturduktan sonra qmail çalışacaktır. Çalışmıyorsa qmailctl başlatılır.

#qmailctl start

Sunucu kendi üstünden SMTP ile e-posta teslimine izin vermek için /etc/tcp.smtp'ye şu satırları ekleyelim.

#echo 127.:allow,RELAYCLIENT= >> /etc/tcp.smtp
#tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp </etc/tcp.smtp

Alias Tanımları:

Qmail kurulumunda en az 3 alias tanımlanmalı.
postmaster: Sistem yöneticisine yönlendirilmeli.
mailer-daemon: Geri dönen e-postalar için standart alıcı.
root: Sistem yöneticisine yönlendirilmeli.

#echo aybuke > /var/qmail/alias/.qmail-root
#echo aybuke > /var/qmail/alias/.qmail-postmaster
#echo aybuke > /var/qmail/alias/.qmail-mailer-daemon
#chmod 644 /var/qmail/alias/.*

#qmailctl start

#qmail stat (4 servis de başlamış olmalı)

Kullanıcı Hesabı Açma:

#groupadd personel
#useradd -g personel -d /home/personel/olric olric
#/var/qmail/bin/maildirmake /home/personel/olric/Maildir
#echo ./Maildir/ > /home/personel/olric/.qmail
#chown -Rolric:personel /home/personel/olric/Maildir
#chown -Rolric:personel /home/personel/olric/.qmail

Test etmek için "#/var/qmail/bin/qmail-inject" diyoruz.Burada yerel kullanıcıya da uzak bir sunucuya e-posta gönderimi yaplabilir.

Deneme takibi için de :
#tail -f /var/log/qmail/current komutunu kullanabiliriz.

Daha ayrıntılı bakmak isteyenler için: http://cr.yp.to/ adresini önerebilirim.
Ayrıca Türkçe kaynak için de benim de okuduğum İsmail Yenigül, Barış Şimşek ve Huzeyfe Önal'ın Qmail kitabını tavsiye ederim.

Kolay gelsin.

23 Ekim 2013 Çarşamba

Bootstrap'a Giriş

Bootstrap, hızlı ve daha kolay web uygulaması ya da sitesi geliştirmek için çokça tercih edilen bir frameworktür. 
"Mark Otto" ve "Jacob Thornton" tarafından oluşturulmuş ve hala sürdürülüyor. Twitter, Bootstrap'ı  Apache 2 ile lisanslayarak açık kaynak yapmış.

İndirmek için 3 seçenek:

1. git clone git://github.com/twbs/bootstrap.git
2. bower install bootstrap
3. son sürüm için tıklayın.

İçerik:

bootstrap/
├── css/
│   ├── bootstrap.css
│   ├── bootstrap.min.css
│   ├── bootstrap-theme.css
│   └── bootstrap-theme.min.css
├── js/
│   ├── bootstrap.js
│   └── bootstrap.min.js
└── fonts/
    ├── glyphicons-halflings-regular.eot
    ├── glyphicons-halflings-regular.svg
    ├── glyphicons-halflings-regular.ttf
    └── glyphicons-halflings-regular.woff
 

Bu dosyalardan yararlanabilmek için oluşturmak istediğimiz HTML sayfasını bootstrap klasörünün içine taşımalıyız. 

Şimdik basit bir giriş sayfası tasarlayalım. 
Önce DOCTYPE'ı tanıtalım, html taglarımızı yazalım ve bootstrap'ı kullanabilmek için yolunu ekleyelim.


Head kısmına sayfa başlığını da ekleyelim.
    <title>Hello Bootstrap</title> 

Body kısmında bir form oluşturalım.  "well" sınıfı Bootstrap'ın içerisinde yer alıyor.
Sonra kullanıcı adı ve parolası etiketlerini oluşturuyoruz. Altına bir text alanı oluşturuyoruz. Son olarak da giriş butonu ekliyoruz. Burada "span3" text kutusunun 3 birim olacağını anlatıyor, "placeholder" ise text kutusunun içine kısa bir açıklama için kullanılabilir.
  
    <form class="well">
     <label>Username:</label>
     <br />
     <input type="text" class="span3" placeholder="Username" />
     <br />
     <label>Password:</label>
     <br />
     <input type="text" class="span3" placeholder="Password">
     <br />
     <br />
     <button class="btn btn-primary">Login</button>
     </form>

Son olarak sayfamız:



Bir de listeleri kullanalım.

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>Hello Bootstrap</title>
    <link type="text/css" rel="stylesheet" href="css/bootstrap.css">
  </head>


  <body>
  <ul class="nav nav-list">
   <li><a href="#"> Home</a></li>
   <li><a href="#"> Profil</a></li>
   <li><a href="#"> Message</a></li>
   <li><a href="#"> Log Out</a></li>
  </ul>
  <script src="js/bootstrap.js"></script>
  </body>
</html>


Son olarak da ızgaralar ile küçük bir uygulama yapalım.

<!DOCTYPE html>
<html>
<head>
    <title>Hello Bootstrap</title>
    <link href="css/bootstrap.min.css" rel="stylesheet" />

    <style>
    .row > div {
        background-color: #dedef8;
        box-shadow: inset 1px -1px 1px #444, inset -1px 1px 1px #444;
    }
    </style>

</head>
<body>
    <div class="container">

        <h1>Hello Bootstrap</h1>

        <div class="row">

            <div class="col-md-3">
                <p>Part 1</p>
            </div>

            <div class="col-md-9">

                <div class="row">
                    <div class="col-md-6">
                        <p>Part 2</p>
                    </div>
                    <div class="col-md-6">
                        <p>Part 3</p>
                    </div>
                </div>

                <div class="row">
                    <div class="col-md-6">
                        <p>Part 4</p>
                    </div>
                    <div class="col-md-6">
                        <p>Part 5</p>
                    </div>
                </div>

            </div>

        </div>

    </div>
</body>
</html>
 
Burada farklı olarak style tagları içinde satırların özelliklerini yazdık.Daha sonra <div> tagları ile ızgaraları istediğimiz şekilde ekleyebiliriz. Çıktımız da aşağıdaki gibi olmalı.

 
 
 

20 Ekim 2013 Pazar

Qmail Hakkında


Merhabalar, bu yazımda sizlere Qmail'i tanıtmak istedim. Qmail Kitabı'nı bayramda okumaya başladım ancak yapılandırma kısmı bitmedi. Tam bitirdikten sonra ayrıntısıyla  kurulum ve yapılandırmasını da yazacağım.

E-posta servisinin sunucu-istemci mimarisinde çalışmasını sağlayan MTA, MUA, LDA gibi programlar vardır.

MTU(Mail User Agent): Kullanıcının bir e-posta sunucusu kullanarak e-posta alıp, göndermesini sağlayan yazılımlardır. Thunderbird, Outlook vs. e-posta istemcisidir.

MTA(Mail Transfer Agent): SMTP(Simple MaiI Transfer Protocol) kullanarak aldığı e-postayı diğerine ileten ya da  iletilen e-postayı teslim alan yazılımlardır. Qmail, Sendmail, Postfix örnek verilebilir.

LDA(Local Delivery Agent): Hedef e-posta adresi yerelde tanımlı olduğunda, LDA gelen e-postayı sistemde ilgili yere yazar.

Qmail, Dan Bernstein (D.J.B.) tarafından Sendmail'in yerine başka bir MTA kullanılsın diye Sendmail'deki güvenlik açıkları nedeni ile yazılmıştır. 

Yazarı güvenlik açığı bulan ilk kişiye 500$ ödül vereceğini söylemiş. Bildirisine buradan ulaşabilirsiniz. Henüz ödülü kazanan birileri çıkmamış.

Qmail; E-posta alma, gönderme, SMTP servisini çalıştırma gibi işler için ayrı programlar çalışmaktadır. Sendmail'de ise bu işi yapan tek bir program bulunmaktadır. Karmaşık ve uzun kodlarda hata olma olasılığı fazladır ve okunabilirliği zordur. Bu da Qmail'in güvenli ve basit olduğunu gösterir. 

Qmail Lisansı: Kodları istediğiniz şekilde kullanabilir ancak değişiklik yaptığınızda izinsiz dağıtamazsınız. 

Qmail'i altyapısında kullanan bazı e-posta sunucuları:

Yahoo! Mail
Mynet Mail
Superonline
Gmail
Network Solutions
PayPal/Confinity...