Oncelikle klavyemde Turkce karakterler olmadigi icin yazida Turkce karakterler kullanamayacagim icin ozur dilerim.

Bu yazida Ubuntu isletim sistemi kullanicilari icin lokalde kullanmaniz icin bir uzanti yaratacagiz ve bu uzantiya sanal host acacagiz.

Kullanacagimiz Yazilimlar:
  • Apache
  • PHP
  • MySQL
  • Bind9
  • nscd
  • PHPMyAdmin
  • Python
Dikkat: Bitene kadar terminali kapatmayin. Her seferinde Root girisi yapmak zorunda kalirsiniz.

Terminali Acalim ve Root Yetkilerini Alalim
sudo -i
MySQL Server Kuralim
apt-get install mysql-server mysql-client
Kurulum esnasinda sizden Root Parolasi isteyecektir. Lutfen bos gecmeyelim. Her ne kadar lokal calisiyor olsakta guvenligi elden birakmamakta yarar var.


Apache Web Server'i Kuralim
apt-get install apache2
Kurulum tamamlandiktan sonra Internet Tarayicimizi acarak http://localhost adresine girelim. Eger karsimiza sayfa acildiysa Apache duzgun bir sehilde kurulmustur.


PHP Kurulumu ve Apache Eklentisi

apt-get install php5 libapache2-mod-php5
Apache'yi Yeniden Baslatalim
/etc/init.d/apache2 restart
Apache yeniden basladiktan sonra ornek bir PHP sayfasi yaratalim ve PHP calisiyormu kontrol edelim.


gedit /var/www/info.php
<?php
phpinfo();
?>
Simdi http://localhost/info.php adresine girelim ve PHP bilgileri gosteriliyor mu bakalim. Eger PHP Info sayfasini gorduyseniz sorun yoktur.


PHP icin MySQL ve Diger Gerekli Eklentilerin Kurulumu
apt-get install php5-mysql php5-curl php5-gd php5-idn php-pear  php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming  php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy  php5-xmlrpc php5-xsl php5-json
Apache'yi Yeniden Baslatalim
/etc/init.d/apache2 restart
Simdi yine http://localhost/info.php adresine girelim ve eklentiler kurulmus mu gorelim.


PHP artik calisir durumda ama sitelerimizi ya localhost altinda, alt klasorde denememiz gerekiyor yada her seferinde /etc/hosts dosyasini duzenleyerek kendi domainimizi olusturuyorduk.


Birazdan gosterecegim yolla istedigimiz domain uzantisi ile lokal site acmayi gosterecegim.


Bu Sistem Nasil Calisiyor?
Bu sistem lokalimiz icin bir DNS Server kurarak calisiyor. Biz aslinda bir Web Sitesini Cpanel, DA yada diger panellerin otomatik yaptigi islemleri yaparak acacagiz.

Bu sistemi yapmaniz; ilerde kendi sunucunuza panel kurmadan da site acabilmenizi saglayacak bilgileri ogrenmenizi saglayacak.

Ag Yapilandirmaniz
Bu sistemin duzgun calismasi ve agdaki diger bilgisayarlardan da erisilebilir olmasi icin ag yapilandirmanizla biraz oynamaniz gerekiyor.

Kullandigim sistem 13.04, WiFi kullaniyorum ve dili Ingilizce, bu yuzden burda yapacagim ayarlar sizin sisteminizde biraz daha farkli olabilir. Fakat temel mantigini anlarsaniz yapmakta sorun yasamazsiniz.

Not: Eger IP Ayarlarini otomatik almiyorsaniz bu asamayi gecebilirsiniz. Dogrudan DNS Ayarlamaya gidebilirsiniz.



Bu secenekten (Eger kablolu kullaniyorsaniz fis gibi gorunur) Baglanti Bilgileri (Connection Information) Secenegine girerek IP bilgilerimizi goruyoruz.



Bu bilgileri kaydedince yine ayni yerden bu sefer Baglanti Ayarlari (Edit Connection) bolumune girin.



Buradan kullandiginiz agi secerek Duzenle (Edit) diyerek asagidaki kutuyu acin.



  1. IPv4 Secenegine giriyoruz ve Method olarak Manuel seciyoruz.
  2. Ekle (Add) diyerek az once kaydettigimiz IP Adreslerini giriyoruz.
  3. Onemli: DNS Server olarak kendi IP adresimiz sonrasinda ise Google (yada hangisini kullaniyorsaniz) DNS Adreslerini girmelisiniz.
Not: Eger daha onceden otomatik kullanmiyorduysanizda 3. Adimi yapmaniz gerekmekte.


DNS Server (BIND9) Kurulumu
apt-get install bind9 dnsutils
Kurulum tamamlandiktan sonra Bind icin ayaralar yapmamiz gerekmektedir. Ben uzanti olarak loc kullaniyorum ve ayarlarim loc uzanti icin. Sizde istediginiz uzantiyi ayarlayabilirsiniz.


cd /etc/bind
Yukardaki kod ile Bind ayarlarinin oldugu dizine gireriz.


gedit named.conf.default-zones
Bu kod ile varsayilan alanlari duzenleyebilecegimiz dosya acilir. Bu dosyada


zone "localhost" {
    type master;
    file "/etc/bind/db.local";
};
kodunu bularak altina


zone "loc" {
    type master;
    file "/etc/bind/db.loc";
};
kodlarini ekleyin ve kaydedip cikalim.


Not: Eklediginiz kodlardaki loc alanlari (zone "loc" ve db.loc) uzantimizi belirliyor.


gedit db.loc
kodu ile uzantimizin yapilandirmasini yapalim.


;
; BIND data file for local loopback interface
;
$TTL    604800
@    IN    SOA    localhost. root.localhost. (
                  2        ; Serial
             604800        ; Refresh
              86400        ; Retry
            2419200        ; Expire
             604800 )    ; Negative Cache TTL
;
@    IN    NS    localhost.
@    IN    A    127.0.0.1
@    IN    AAAA    ::1

*    IN    A    192.168.2.222
Bu kodlarda 192.168.2.222 adresi sizin kendi lokal ip adresiniz olmali.


Bu dosyayida kaydedip cikalim.


NSCD Programini Kuralim (DNS onbellegini temizler)
apt-get install nscd
BIND9'u ve NSCD'yi Yeniden Baslatalim
/etc/init.d/bind9 restart
/etc/init.d/nscd restart
Host Dosyalari icin Dizin Belirleme
Ileride yedek almak veya dosyalar ile daha rahat calismak icin ben MySQL dosyalari, Apache ayarlari ve site dosyalari icin tek bir dizin kullaniyorum. Hatta bu dizin bende ayri bir SSD bolumu.


Simdi anlatacagim yerlerde kullandigim dizinleri asagida aciklayacagim.


/host: Root (/) icinde host ile alakali verileri tuttugum dizin
/host/mysql: MySQL veri tabanlarini burada tutuyorum.
/host/settings: Apache icin site ayarlari burada bulunuyor.
/host/sites: Site dosyalari burada bulunuyor.
/host/programs: Host acmak ve yeniden baslatmak icin yazdigim Python programciklari burada bulunuyor.


Host Dizini Acma
cd /
mkdir /host
mkdir /host/settings
mkdir /host/sites
mkdir /host/programs
mkdir /host/mysql
chmod -R 777 /host
Not: Bundan sonra ben site dosyalari icin bu dizini kullanacagim fakat siz kendi istediginiz dizini ayarlayabilirsiniz.



MySQL Database Tasima (Zorunlu Degil ama Yararli Oluyor)
/etc/init.d/mysql stop
cp -pr /var/lib/mysql/* /host/mysql/
chown -R mysql:mysql /host/mysql
Burada MySQL Dizinini yeni dizine kopyaladik. Fakat bunu MySQL'e tanitmadik. Simdi onu yapalim:
gedit /etc/mysql/my.cnf
datadir degiskenini bulup kendimizinki ile degistirelim ve kaydedip cikalim.

datadir= /host/mysql
Apparmor Ayarlari (MySQL icin)

gedit /etc/apparmor.d/usr.sbin.mysqld
Bu dosyada


/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
kodlarini bulup


/host/mysql/ r,
/host/mysql/** rwk,
ile degistirelim ve kaydedip cikalim.


Apparmor ve MySQL Yeniden Baslatalim

/etc/init.d/apparmor reload
/etc/init.d/mysql start
Apache Ayarlari
cd /etc/apache2
Komutu ile Apache ayar dizinine girelim.


gedit apache2.conf
Kodu ile apache ayarlari dosyasini acalim ve en altina

Include /host/settings/
ekleyelim.

Artik sanal siteler icin gerekli ayarlari tamamladik.

Ilk Sanal Sitemiz
Artik loc (yada kullandiginiz uzanti) uzantili siteler acabiliriz.

cd /host/settings
gedit phpmyadmin
Kodlari ile phpMyAdmin icin bir site olusturmak ile baslayabiliriz.

Acilan Gedit penceresi icine asagidaki kodlari ekleyelim.

<VirtualHost *:80>
    ServerAdmin mail@adresim.com
    ServerName phpmyadmin.loc
    ServerAlias www.phpmyadmin.loc
    DocumentRoot /host/sites/phpmyadmin/www
    ErrorLog /host/sites/phpmyadmin/logs/error.log
    CustomLog /host/sites/phpmyadmin/logs/enter.log combined
</VirtualHost>
Kaydedip ciktiktan sonra gerekli dizinleri acalim.

cd /host/sites
mkdir phpmyadmin
mkdir phpmyadmin/www
mkdir phpmyadmin/logs
chmod -R 777 phpmyadmin
Bu adresten (http://www.phpmyadmin.net/home_page/index.php) phpMyAdmin indirelim. Nautilus (Dosya Yoneticisi) ile Downloads (Indirilenler) Dizinine gidelim ve phpMyAdmin-4.0.4-all-languages.zip dosyasina sag tiklayarak Extract Here (buraya cikar) diyelim.

Simdi phpMyAdmin-4.0.4-all-languages adli bir dizin olusmus olamli. O Dizine girelim ve icindekilerin hepsini /host/sites/phpmyadmin/www icine kopyalayalim.

Apache'yi Yeniden Baslatalim
/etc/init.d/apache2 restart
Simdi http://www.phpmyadmin.loc adresine girelim ve sitemizin calistigini gorelim.

Not: Eger sayfa bulunamiyor hatasi aliyorsaniz bir kac kez CTRL+F5 yaparak sayfaya ulasabilirsiniz.

phpMyAdmin Yapilandirmasi
phpMyAdmin su anda yapilandirilmamis sekilde, biz onu yapilandirmamiz gerek.

Terminalden

cd /host/sites/phpmyadmin/www
Komutu ile phpMyAdmin dosyalarinin oldugu dizine girelim ve

mkdir config
chmod o+rw config
cp config.sample.inc.php config/config.inc.php
chmod o+w config/config.inc.php
Komutlari ile yazilabilir config dizin olusturalim ve icine ornek ayar dosyasi atalim.

phpMyAdmin Kurulumuna Baslayalim
http://www.phpmyadmin.loc/setup adresine girelim ve Yeni Sunucu baglantisina tiklayalimdirek Kaydet diyelim.

Asagida Yapılandırma dosyası alaninda localhost icin ayarlar gelmis olamli, ordan varsayilan dilinizi secerek ve Kaydet diyelim.

Simdi terminalden asagidaki komutlari calistirmamiz gerekiyor.

mv config/config.inc.php .
chmod o-rw config.inc.php
rm -rf config
Simdi http://www.phpmyadmin.loc adresine girerek MySQL Root ile giris yapabiliriz. (Kullanici adi: root Sifre: MySQL Kurarken girdiginiz sifre)

Yeni Site Acmak ve Kolay Server Baslatma Icin Python Programi
cd /host/programs
gedit restart.py
Kodlarini calistirarak restart.py programina basliyoruz.

Not: Python yazarken bosluklarin onemi vardir. O yuzden kopyala/yapistir yaptiginizda veya elle girerken bosluklerin dogru yapilandirilmis oldugundan emin olun. (Eger program calismazsa asagida gorludugu gibi olacak sekilde bosluklari silip yetine TAB koyun.)

#!/usr/bin/env python
#-*-coding:utf-8-*-

from os import system

def restart():
    system('/etc/init.d/apache2 restart')
    system('/etc/init.d/bind9 restart')
    system('/etc/init.d/nscd restart')

if __name__ == '__main__':
    restart()
Kaydedip cikalim ve terminalde asagidaki komutu calistirarak izinleri verelim.

chmod 777 restart.py
Asagidaki kod ile calisip calismadigini deneyelim.

./restart.py
Not: Normalde terminali acar acmaz asagidaki komutu yazarak calistirabilirsiniz.

sudo /host/programs/restart.py
Bu Program Ne Ise Yariyor?
Eger bir nedenden dolayi Apache'yi yeniden baslatacaksaniz yada DNS onbellegini temizlemeniz gerekiyorsa bu programcik kolaylik sagliyor.

Python MySQL Destegi
apt-get install python-mysqldb
Yeni Site Acma Programcigi
gedit sh.py
Kodunu calistirarak sh.py (Sanal Host) programcigina basliyoruz.

#!/usr/bin/env python
#-*-coding:utf-8-*-

from sys import exit, argv
from os import makedirs, system
from restart import restart
import MySQLdb

class Host(object):

    def __init__(self):
        len_argv = len(argv);
        if len_argv > 1:
            if argv[1] == 'restart':
                restart()
                exit()
            self.domain = argv[1]
            if len_argv > 2 and (argv[2] == 'Y' or argv[2] == 'y'):
                if len_argv == 4:
                    self.mysql(argv[3])
                else:
                    self.mysql(False)
        else:
            self.domain = raw_input('Domain: ')
            db = raw_input('Database? (Y/N): ')
            if db == 'Y' or db == 'y':
                 self.mysql(raw_input('Password: '))
        
         if not self.domain:
             print 'Domain adı olmadan olmaz!!!'
             exit()

        self.mkdirs()
        self.apache()
        self.index()
        self.settings()

         exit()

    def apache(self):
        dosya = open('/host/settings/' + self.domain, 'w')
        dosya.write('<VirtualHost *:80>\n\tServerAdmin mail@adresiniz.com\n\tServerName ' + self.domain + '.loc\n\tServerAlias www.' + self.domain + '.loc\n\tDocumentRoot /host/sites/' + self.domain + '/www\n\tErrorLog /host/sites/' + self.domain + '/logs/error.log\n\tCustomLog /host/sites/' + self.domain + '/logs/enter.log combined\n</VirtualHost>')
        dosya.close()

    def mkdirs(self):
        makedirs('/host/sites/' + self.domain + '/logs')
        makedirs('/host/sites/' + self.domain + '/www')

    def index(self):
        dosya = open('/host/sites/' + self.domain + '/www/index.php', 'w')
        dosya.write('<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset="utf-8">\n\t\t<title>' + self.domain + ' kullanıcısının sitesi açıldı</title>\n\t</head>\n\t<body>\n\t\t<? echo "Merhaba Dünya"; ?>\n\t</body>\n</html>')
        dosya.close()

    def mysql(self, password):
        if not password:
            password = 'Var Sayilan Parola'

        bag = MySQLdb.connect('localhost', 'root', 'MySQL Root Parolasi')
        im = bag.cursor()

        database = self.domain + '_db'

        im.execute('CREATE DATABASE ' + database)
        im.execute('GRANT ALL ON ' + database + '.* TO ' + self.domain + '@localhost IDENTIFIED BY \'' + password + '\'')
        im.execute('FLUSH PRIVILEGES')

        bag.commit()
        bag.close()

    def settings(self):
        system('ln -s /host/sites/phpmyadmin/www /host/sites/' + self.domain + '/www/phpmyadmin')
        system('chmod -R 777 /host/sites/' + self.domain)
        restart()

host = Host()
Yukardaki kodlarda kalin yazilan yerleri kendinize gore duzenleyin ve kaydedip cikin.

chmod 777 sh.py
Kodu ile izinleri verin ve

./sh.py
kodu ile programi calistirin. Eger calisirsa size Domain adini (www ve .loc olmadan) girmenizi, ardindan database acmak isteyip istemediginizi ardinda da bu database icin vermek istediginiz parolayi soracaktir.

Not: Eger database istemezseniz parola sormaz ve parola kismini bos gecerseniz programda belirtiginiz varsayilan parola database icin parola olur.

Kisayol:
Eger kendi database sifreniz ile acmak istiyorsaniz:
./sh.py domainadi Y mysql_parolasi
Eger varsayilan database sifreniz ile acmak istiyorsaniz:
./sh.py domainadi Y
Eger database olmadan acmak istiyorsaniz
./sh.py domainadi
Not: Normalde terminali acar acmaz asagidaki komutu yazarak calistirabilirsiniz.

sudo /host/programs/sh.py
Kisayol:
Eger kendi database sifreniz ile acmak istiyorsaniz:
sudo /host/programs/sh.py domainadi Y mysql_parolasi
Eger varsayilan database sifreniz ile acmak istiyorsaniz:
sudo /host/programs/sh.py domainadi Y
Eger database olmadan acmak istiyorsaniz
sudo /host/programs/sh.py domainadi


Acilan Database Adi ve Kullanici Adi
Acilan database adiniz domainadiniz_db seklindedir ve bu database icin acilan kullanci domainadiniz seklindedir.

Not:Bu her domain icine otomatik olarak phpmyadmin kisayolu olusturulur. Buraya ulasmak icin http://www.domainadiniz.loc/phpmyadmin adresini kullanabilirsiniz. Kullanci adi olarak domainadiniz ve sifresi icin belirlediginiz sifre yada varsayilan sifre kullanilabilir.

Sistemin Son guzelligi:
Eger /host/settings/domainadiniz dosyasina girip
ServerAlias www.domainadiniz.loc
kismini
ServerAlias *.domainadiniz.loc
olarak degistiriseniz tum sub domainler sizin sitenizi acacaktir. Bu sekilde wildcard kullanabilirsiniz.

Not: Bu uzanltili sitelere agdaki diger bilgisayarlardan girmek icin o bilgisayarda DNS olarak ilk siraya sizin IP Adresinizi vermeniz gerekmektedir.

Iyi gunlerde kullanmaniz dilegi ile. Bol Linux'lu Gunler

Saygilarimla
Umurcan Gorur
AdAjans - Simturk