Ubuntu – Apache Rewrite Modulü Kurulumu (Etkinleştirilmesi)

Merhaba,

Ubuntu platformunda rewrite kurulumunu(etkinleştirilmesi) anlatacağım. İşinize yarayacaktır diye düşünüyorum. (apache kurulu varsayılmıştır)

Ne işe yarar bu modül?

Apache web sunucusunda URL yi yeniden yazma ve düzenleme iznini verir.

Tam olarak ne işe yaradığını öğrenmek için arşivimizdeki bu yazıyı okumanızı tavsiye ediyorum.

sudo a2enmod rewrite

Yukarıdaki komutu çalıştırarak modülü etkinleştiriyoruz. Daha sonra ilgili projenizin vhost dosyasında birkaç düzenleme yapmamız gerekecek.

sudo nano /etc/apache2/site-available/default

Açılan vhost dosyasında aşağıdaki değişiklikleri yapmanız gerekiyor. İlk açtığınızdaki durumunu ve yanına okla yapmanız gereken düzenlemeyi belirtiyorum.

AllowOverride None -> AllowOverride All

Görmüş olduğunuz tüm “AllowOverride None” ları “AllowOverride All” a çeviriyoruz ve kaydedip çıkıyoruz. Son olarak apache‘yi yeniden başlatacağız.

sudo /etc/init.d/apache2 restart

Modül artık aktifleşti. Projenizde kullanabilirsiniz, hayırlı olsun.

child pid … exit signal Segmentation fault (11) – cpanel – centos

Centos 5.5 içinde cpanel yüklü sistemde child pid … exit signal Segmentation fault (11)hatası almaktaydım. Her yerde memory’nin yetmediğini belirten , diskin tutarsız olduğunu felan söyleyen yazılar gördüm.

Bu hatayı , apache nin error loglarından görebiliyordum, son kademe log olarak burada yakalayabildim. Ancak bir detay vermiyordu.

Php 5.2 sistem, mysql 5.1 kullanıyorum.

Daha sonra hatayı tespit etmek için tüm veritabanını local bilgisayarıma aktardım, ve aynı hatayı almaya çalıştığımda, windows ortamında , (php5.3, mysql 5.5) bana “Maximum function nesting level of ‘100’ reached” diye bir hata verdi. Yani diyor ki, “içiçe 100den fazla derinliğe kadar indin, sınıra ulaştın”. Anladığım kadarıyla, php5.2 de bunu handle edebilecek bir mekanizma yok. Hatanın sebebi , sınıf içinde recursive olarak kendi sınıfından üreten bir metodun es kaza yanlış çalışması durumu vardı. Şöyle :

class X{
    function load(){
        //...bişeyler bişeyler...
        $this->load();
    }
}

Nitekim, koddan bu tarz bir döngü oluşturabilecek durumun önüne geçtim, ve hata düzeldi.

 

Apache Performans Ayarları (Performance tuning) Önerileri

Apache’de Performans ayarını yapmaya yeltenmişseniz, öyleyse bazı terimleri biliyor, bazı sorunlarla karşılaşmış, bazı sıkıntılar yaşıyor olduğunuz manasını çıkarıyorum çok rahatlıkla.

Öyle değilse de, bilgi iyidir, okuyunuz. 🙂

 

Apache, güzel(!) bir web serveri. Bir sürü de ayarı mevcut.

Burada bahsetmek istediğim konu, genel olarak hangi 3 ü 5 yapacağınız, hangi 200 yerine 50 yazacağınız ile ilgili değil. Yani hesapsal ayarlardan bahsetmeyeceğim. O apayrı ve ihtiyaca yönelik bir konu çünkü.

Peki bunlardan bahsetmeyeceksemne manası kaldı bu yazının?
Şöyle ki, Apache de performans ayarı yapmak istiyorasnız, hali hazırda yoğun çalışan bir veya birkaç apache web serveriniz olduğu yorumunu çıkarıyorum. Burada Sayısal değerler sistemden sisteme değişiklik göstermekte. Benim bir uygulamam session ve mysql bağlantısı bile kullanmadan, yoğun çalışıyorsa bu ayrı bir durum ve ayrı bir optimizasyon gerekiyor, veya veya veritabanı ve statik içerik durumu yoğun ise bu ayrı bir optimizasyon gerektiriyor.

Ben burada sadece bakış açısını izah etmeye çalıaşcağım.

Bu noktada bazı denemelerimiz oldu bunları paylaşmak isterim.

Apache istekleri karsılarken statik veya php isteklerinde, gelen isteklerin sayısıyla birlikte parabolik olarak artan bir grafik çiziyor. gelen istek arttıkça, makina load’u artarak artıyor ve bir süre sonra sistemi kitleyebiliyor. (%95 kitliyor emin olun.)

Statik dosyalar (Resimler, css, js, vb..)

Apache php isteklerini normal bir şekilde verirken, statik içerik devreye girdiğinde içeride açtığı portları iyi yönetemiyor. Bir web sitesinin bir sayfasında genelde 1 php isteği, 40-50 tane de statik içerik isteği oluyor. Bu noktada apache den dolayı saçlarımız dökülmeye başlıyor.

Statik içerik ile ilgili noktada cache için EXPIRES headeri göndermek ilk yapılacak şey olabilir.
Browser bir içeriği cachelese bile o dosya değişmiş mi diye server a soruyor. Bu noktada bu sorgu da request olarak bir maliyet oluşturuyor. Expıre cache i ile server browser a bu dosyaya verdiğiniz süre kadar değişmeyeceğinin garantisini veriyor, ve dosyalarınız değişmeyeceğinin teyidi alındığından browser o dosya cacheinde varsa, server a hiç sormuyor.

Bir değişiklik durumu için ise, statik dosyalarınızın sonuna ?time=2938748292 şeklinde bir timestamp koyarak çekmesini sağlyabilirsiniz. Örneğin bir dosyanız var ve normalde adı header.jpg . Siz bubunu EXPIRES ile cachelemesini söylerseniz, değiştirseniz bile browser eski dosyayı yeni gibi gösterecektir. Bu noktada siz isteği header.jpg?t=23984729493 şeklinde gönderirseniz, ve dosyanızı değiştirdiğinizde , bu timestampı da değiştirirseniz, veya dosya ismine bu timestampı kaydederseniz, browser cachelediği eski dosyayı bulamayacağından, yeni dosyayı çekmiş olacaktır.

Anlatmak istediğim, siz bir dosya değiştirmedikçei sayfanıza bir kere gelen kişi, 2. sorgudan itibaren gereksiz request göndermemeye başlayacak. 1 sayfa ilk açılışta 45 statik + 1 php = 46 request dersek,2. requestten itibaren 1 requeste inecektir. Bu da CİDDİ avantaj olacaktır.

Apachedeki gereksiz modüller

Apachenizde kullanmadığınız yani gereksiz modüller açık olabilir. Bunları kapatın. Neyi kullanıp neyi kullanmadığınızı araştırmanız biraz zzaman alabilir, ama bunların da küçük de osla bir miktar etkisini görürsünüz.

Apache .htaccess desteğini kapatın

.htaccess dosyaları çeşitli server ayarlarını yapabildiğiniz dosyadır. Buna ihtiyacınız yoksa, htaccess desteğini direkt kapatın. İhtiyacınız varsa da httpd.conf seviyesinden genel olarak yapmaya özen gösterin. Yani imkan varsa hiç kullanmayın. Ama zend framework gibi frameworkler mod_rewrite vb modüllerine ihtiyaç duyuyor diyorsanız da httpd.conf seviyesinden de ihtiyazınıcı görebiirsiniz. (Tabi ki yönetimi daha zor oluyor haliyle)

Apache htaccess desteği varsa, her requestte isteğin gittiği php dosyasına kadarki klasör ailesinde (örneğin /usr/local/php/deneme/example/html/index.php php sayfasına gelen requestte, sırasıyla usr, sonra local sonra php sonra deneme sonra example sonra html klasörlerinin içinde) .htaccess dosyası var mı? varsa load et kuralları çalıştır işlemini yapıyor. bu da tekil bir isteğin gecikmesine sebep olabiliyor. Bunu da kapatmanız sizi pembe bir gökyüzüne kavuşturmayacak ama bir miktar avantaj sağlayacaktır.

Bahsetmek istediğim daha çok şey var fakat, amaç burada bakış açısı olarak, kendinizi bilgisayar yerine koyarak düşünmektir. Böyle yaparsanız, belirli seviyeye kadar performansı artırabiirsiniz. Belirli seviye dememin sebebi ise, ileride bazı performans ihtiyaçlarınıza apachenin yeterli olmayacağını farkedeceksiniz. Bu zaman ise, apache’nin yerine ne koymamız gerektiğini konuşuruz. 🙂

En Kolay Linux – Turnkey Linux

Eğer PHP ile web yazılımı geliştirmiş ve ya geliştirme altyapısını merak etmişseniz, mutlaka kendi bilgisayaranıza Ubuntu ve ya herhangi başka bir linux dağıtımı kurup Apache-MySQL-PHP kurulumları yapmayı denemişsinizdir. Bu macera kimi zaman hüsranla ve “bununla uğraşılmaz” nidalarıyla, kimi zamansa yorgun gözler ama başarmış olmanın gururu ve bilgi birikimi ile biter. Ben bir zamanlar ikisini de yaşamış ve sonunda kurulum yapmıştım 🙂

Geçen aylar içerisinde yine bir yazılım geliştirme platformu kurma ihtiyacım doğduğu için, önce kendi bilgisayarıma dual-boot ile xubuntu kurarak, LAMP (Linux Apache MySQL PHP) platformunu kurmaya başladım. Başlarda biraz zorlansam da, takıldığım noktaları eski tecrüblerimden hatırlayarak aşabildim ve Ubuntu’nun da artık daha kolaylaşmış yapısı sayesinde kurulum yapabildim. Fakat arkadaşım Arda Başoğlu‘nun beni uyarmasıyla, tekerleği tekrar keşfetme hatasına düştüğümü gördüm (bunun için kendisine ayrıca teşekkürler). İhtiyacım olan proje, benzer problemler yaşayan bazı insanların hazırladığı bir proje olan Turnkey Linux ile işte böyle tanıştım.

Turnkey Linux, belirli bir ihtiyacı karşılayan ufak linux sistemlerinden oluşuyor. Bu linux sistemlerinde, ihtiyacımız olan platform ile ilgili uygulamalar kurulmuş ve genel ayarları yapılmış şekilde bulunuyor. Ayrıca bu sistemler ister direkt kurulum için ISO formatında, ister sanallaştırma için ODF ve VMDK gibi formatlarda dağıtılıyor. Turnkey Linux projesinde kullanabileceğimiz birçok kategori ve birçok uygulama bulunuyor, örneğin web yazılım geliştirme kategorisinde LAMP, Ruby On Rails, Google App Engine gibi platformları içeren sistemler mevcut. Sadece veritabanına ihtiyaç duyuyorsanız, MySQL ve PostgreSQL veritabanı sistemlerini de indirip kullanabilirsiniz.

Örnek olarak aşağıda LAMP (Linux Apache Mysql PHP) platformunun VirtualBox ile sanal makina olarak Windows işletim sistemine sahip bir makinada kurulmasını anlattım.

Kurulum

Turnkey Linux anasayfasına girin ve Apps menüsünden Web Development kategorisinde LAMP Stack isimli uygulamayı bulun. Detaylarda indirme linklerinden More Builds(OVF) linkini tıkladıktan sonra açılan indirme ekranında ismi ovf.zip olarak biten dosyayı indirin. Bir yandan VirtualBox programının son sürümünü Windows işletim sistemi için indirip kurun.

VirtualBox kurulumun yaptıktan sonra indirilen arşiv dosyasını bir klasöre açın. VirtualBox programında File->Import Appliance diyerek Appliance Import Wizard’ı açın. Az önce arşivden çıkarttığınız dosyalardan .ovf formatındaki dosyayı bu ekranda seçin ve devam edin. Sonraki ekranda VirtualBox  bu sistem  için geçerli sanal makina ayarlarını gösterecektir. Bu ayarlardan sadece Virtual Disk Image ayarını değiştirmenizi tavsiye ederim, varsayılan olarak  C:\ diskini kullandığı için ve eğer bu diskte yeterli yeriniz yoksa sorun olabilir. Diğer ayarları değiştirmeden Import derseniz yeni sanal makina başlatmaya hazır oluyor.

Oluşan yeni sanal makinayı VirtualBox Manager ekranındaki listeden artık görebilirsiniz. Şimdi bu makinayı başlatmak ve bazı ayarlarını yapmak gerekiyor. Sanal makinayı seçtikten sonra start derseniz sanal makina açılmaya başlayacaktır. Makinamız açılırken  Turnkey Linux Hub platformu sayfasına gidin ve kayıt olun. Kayıt olmak zorunlu değil,  her bir sanal makina için dinamik DNS hizmetinden faydalanmayı sağlayacağı için kayıt olmanızı tavsiye ederim. Ayrıca eğer isterseniz sanal makinaları Amazon Elastic Cloud (EC2) sisteminde otomatik olarak yedekleme şansınız olacak. Turnkey Linux Hub platformu OpenID desteklediği için Google hesabınızla bile kayıt olabilirsiniz. Kayıt olduktan sonra giriş yaptığınızda User Profile ekranına girin, Login Details sekmesinde API Key alanını göreceksiniz. Bu bilgiyi birazdan kullanacağız.

LAMP platformunu içeren sanal makina  hazır ve root şifresini soruyor olacak. Bu şifreyi çok dikatli seçin, hem zor olsun hem de unutmayın. Sakın 123456 vermeyin 🙂 Root şifresini ssh ile shell girişi yaptığımızda da kullanacağız. Root şifresini belirledikten sonra MySQL root şifresini soracaktır. Bu şifre için de zor ama unutmayacağınız bir şifre seçin. Root kullanıcısı MySQL sisteminde her şey yetkili tek kullanıcıdır.

Bu iki şifreyi belirledikten sonra sistem az önce belirttiğimiz API Key bilgisi soracaktır. Bu bilgiyi vermek ve ya kayıt olmak zorunda değilsiniz. Eğer API Key bilgisini yazarsanız sonraki ekranda otomatik yedekleme için gerekli shell komutunu gösterecektir, fakat yedekleme sadece Amazon ile gerekli entegrasyonu hesabınızda yaparsanız sağlanıyor. Komutu gösteren ekrandan sonra, dinamik DNS hizmeti için sizden bir internet adresi isteyecektir. Burada seçeceğimiz adres {sunucumunadresi}.tklapp.com formatında olmak ve daha önce kimsenin seçmediği bir adresi olmak zorunda. Eğer bu şartları sağlıyorsa, bundan sonra internetten bu adresi yazan herhangi birisi makinanıza erişebilecektir. Üstelik IP adresiniz değişse bile, bu adres otomatik olarak sanal makina her başladığında güncellenecektir. Güncelleme yazılımının detaylarına erişmek isterseniz şu adresi kontrol edebilirsiniz.

İnternet adresi belirledikten sonra, sistem güvenlik güncellemeleri yapacağını belirtecek ve sizden onay isteyecektir. Güvenlik güncelleştirmelerini geçmeyin ve güncellemelerin bitmesini bekleyin. Güncelleştirmeler de bittiğinde karşınıza gelen ekranda sistemimizde erişebileceğimiz linkleri gösteren bir ekran gelecektir. Gördüğünüz gibi sanal makina ağda kendisini yeni bir istemci olarak göstererek  otomatik olarak farklı bir IP adresi aldı. Şu an sanal makina yerel ağdan artık erişilebilir duruma geldi. Ayrıca ekrandaki linklerde bir yönetim paneli linki de göreceksiniz, bu yönetim paneli daha önce belirlediğiniz root şifresi ile giriş kabul ediyor ve sistemin tüm ayarlarını bu görsel web arayüzü üzerinden de yapabiliyorsunuz. Oldukça rahat değil mi 🙂

Sanal makinanın  internetten de erişilebilmesi için sadece ona dinamik dns atamak yeterli değil. Ayrıca bazı router ayarları da yapmak gerekiyor. Şu adresten router markanızı bulup, 80 portunu sanal makinanın IP adresine yönlendirirseniz, internetten de erişilebilir duruma gelecektir. Dikkat edilmesi gereken başka bir nokta da, sanal makinanıza atadığınız internet adresini yerel ağınızdan denemeyin. Mesela telefonunuzdan 3G ile internet adresini açmayı deneyin. Eğer yerel ağınızdan denerseniz router sayfasına yönlenirsiniz 🙂

Bazı Turnkey Linux uygulamaları konusunda  daha detaylı yazıları ileride yazacağım.  Yeni Linux sunucunuz hayırlı olsun !

apache mod_rewrite ile URL yeniden yazma

Bir çok web yazılımcısı, URL’den doğrudan kullanmış olduğu değişkenleri, veya çalışma stilini, veya istemediği dosyalara erişimi kısıtlamak ister. Ya da sadece Arama motoru optimizasyonu (SEO) için geliştirme yapmak ister. Nitekim Apache’nin sunduğu mod_rewrite modülü ile URL’lerin tekrardan işlenmesi mümkün. Nasıl mı?

Örneğin sitenizin adresi www.deneme.com olsun.
www.deneme.com/test.php?lang=tr&limit=100&action=list şeklinde bir URL niz var. Bu URL’nin sonucu olarak da sitede türkçe dilinde 100 adet şarkı listelenmiş olsa bütün değişkenlerimiz apaçık ortada her an değiştirilmeye veya kurcalanmaya hazır beklemiş olurlar.
Bu URL’yi mod_rewrite ile www.deneme.com/tr/100/list şeklinde değiştirebiliriz. Ya da başka bir kural belirleriz buna göre yeniden oluştururuz.
Bir arama motorunun bu sayfa ile ilgili düşünceleri pek de iç açıcı olmayabilir. Sebebi Url’de içerik ile ilgili bir şeyin olmaması.

Url şöyle olursa şık olur :
www.deneme.com/gunumuzun_en_iyi_100_türkçe_sarkisi-100_tr_list.html
Böyle olduğunda sondaki .html tamamen yalancı bir ek, 100_tr_list kısmında aslında değişkenlerimizi göndermiş oluyoruz, ondan önceki kısımda ise arama motorlarıın aradığı şeyi bulduğu hakkında bilgisini kuvvetlendirmiş oluyoruz. URL de ve sitede aynı içeriği bulması, sizin arma sonuçlarında bir miktar dha yukarlarda olmanıza imkan verebilir.

Kullanıcmı :

  • Apache de mod_rewrite modülünü açmanız gerekiyor. (httpd.conf içinde genellikle önünde # işareti ile comment’lenmiş oluyor)
  • httpd.conf içerisinde ilgili web klasörünüz için ayarlarda .htaccess in kullanımının açılması gerekiyor.   AllowOverride all diyerek açılıyor. (Daha fazla detay için lütfen apache allowoverride seçenekleri)
  • belirtilen sitenizin index.php sinin yanına .htaccess dosyası oluşturulması gerekiyor. Bu dosya RewriteEngine on  (yeniden yazma motorunu devreye alır)RewriteCond   %{REQUEST_URI} (yeniden yazma için regexp ifadesi (örn: .html yazarsanız .html gördüğü tüm durumlar yeniden yazma çalışır))
    RewriteRule  ([^/]+)-_-([^/]+)_([^/]+)(.html)/?$ (yönlenmesini istediğiniz sayfa. Burada $1 , $2 diye $ karakterinden önce gruplanmış kısmı değişken olarak kullanabilirsiniz. ) [L] (burada da çeşitli ifadeler ile yeniden yazma işleminin tekrarlanmasını, tekrarlanmamasını, vs.. gibi özelliklerini ayarlayabilirsiniz.)

Basit bir şekilde bir yeniden yazma işlemi şöyle olur.
RewriteEngine on
# aşağıdaki 2 satır request_uri nin içinde ahmet.html diye bir şey geçiyorsa, onu mehmet.html ye yönlendirir.
RewriteCond   %{REQUEST_URI} ahmet.html
RewriteRule  mehmet.html

RewriteRule Komutunu öğrenmiş olduğunuz için mutlu olabilirsiniz. Bununla birlikte rewriteCond ile sınırlarınızı bariz bir şekilde genişletebilirsiniz. Çünkü bu komut ile yapabileceklerinizin sınırı bariz bir şekilde artıyor. Yazılım diline yük olabilecek şeyleri, Server (Apache) tarafından kolayca halledebiliyorsunuz. RewriteCond bildiğimiz if manasına geliyor.

Komut şu şekilde çalışıyor :

RewriteCond String Condition
String bir server değişkeni olabilir veya düz string olabilir.
Condition (durum) kısmı bir regular expression deseni olabilir.
Aşağıdaki örnekte de remote_Addr değeri 123.45.67.89 olan (IP si bu olan) bir kişiye ne olursa olsun, engellendin.html gösterilmesini sağlayan kod bulunuyor.

RewriteCond %{REMOTE_ADDR} 123.45.67.89

RewriteRule .* engellendin.html [R]

Server değişkenlerinden en kullanışlılarını liste halinde vermek istiyorum (Bunlar örneğin ilki %{HTTP_USER_AGENT} şeklinde kullanılıyor) :

Not : Eğer Bu değişkenlerin içinde ne olduğunu bilmiyorsanız veya merak ediyorsanız, phpinfo() fonksiyonu ile bu değişkenleri görebilirsiniz. Keza aynı değişkenler php tarafından da kullanılamaktadır.