Sunucu Yönetimi & Linux

    Ubuntu Sunucuya LAMP Kurulumu: Apache, MySQL ve PHP Adım Adım

    Sıfır Ubuntu sunucuda web sitesi yayınlamak için gereken LAMP yığınının kurulumu ve doğrulaması.

    12 dk okuma Güncellendi: 11 Ağustos 2026

    Yönetimsiz bir VDS aldınız, panelden Ubuntu kurdunuz, elinizde bir IP adresi ve bir root parolası var. SSH ile bağlandığınızda sizi boş bir komut satırı karşılıyor ve o noktada tek bir sorunun cevabı lazım: sitem burada nasıl açılacak? Cevabı LAMP kurulumu Ubuntu sunucuda dört parçadan oluşur — Linux zaten kurulu, geriye Apache (web sunucusu), MySQL (veritabanı) ve PHP (uygulama dili) kalıyor. Bu üçünü kurup birbirine bağladığınızda sunucunuz tarayıcıdan gelen isteklere cevap verebilir hâle gelir.

    Bu rehber masaüstü Ubuntu için değil, uzak bir sunucu için yazıldı. Aradaki fark göründüğünden büyük: uzak sunucuda tarayıcı yok, dolayısıyla "localhost'a git" diyerek test yapamazsınız; güvenlik duvarı varsayılan olarak 80 ve 443'ü kapatabilir; ve /var/www dizininin sahipliğini yanlış ayarlarsanız ya siteniz 403 verir ya da sunucunuzu ilk saldırıya açık hâle getirirsiniz. Aşağıda kurulumun her adımını, adımdan sonra yapılacak doğrulamayı ve o adımda en sık karşılaştığım hatayı birlikte bulacaksınız.

    Başlamadan Önce: Neye Sahip Olmanız Gerekiyor#

    LAMP kurulumuna başlamak için üç şeye ihtiyacınız var: sunucunun genel IP adresi, root ya da sudo yetkili bir kullanıcı, ve SSH erişimi. Ubuntu'nun LTS sürümlerinden biri (Server sürümü, masaüstü değil) yeterlidir. Kurulum boyunca kullanacağınız dizinler ve servis adları LTS sürümleri arasında değişmez, bu yüzden buradaki komutlar sürümden bağımsız çalışır.

    Root ile çalışmak yerine sudo yetkili normal bir kullanıcı oluşturmanızı öneririm. Sunucuyu ilk teslim aldığınızda yapılacak temel sertleştirme adımlarını ayrı ayrı ele aldığımız VDS satın alma sonrası ilk adımlar yazısındaki sırayı takip ederseniz LAMP kurulumuna daha güvenli bir zeminde başlarsınız. Yeni kullanıcı oluşturmak tek satırlık iştir:

    adduser webadmin
    usermod -aG sudo webadmin
    

    Bundan sonraki komutları bu kullanıcıyla, başında sudo ile çalıştıracağız.

    Paket Listesini Güncelleme ve Apache Kurulumu#

    İlk iş depo listesini tazelemek. Ubuntu'nun paket listesi imaj oluşturulduğu tarihe ait olduğu için, güncellemeden kurulum yaparsanız eski sürüm paketler inebilir ya da paket bulunamaz hatası alırsınız.

    sudo apt update
    sudo apt upgrade -y
    sudo apt install apache2 -y
    

    Kurulum bittiğinde Apache kendiliğinden başlar ve sistem açılışına eklenir. Doğrulayın:

    sudo systemctl status apache2
    

    Çıktıda Active: active (running) satırını görmelisiniz. Eğer inactive (dead) yazıyorsa sudo systemctl start apache2 ile başlatın; hata veriyorsa sudo journalctl -u apache2 -n 50 komutu size son 50 log satırını gösterir ve sorun neredeyse her zaman orada yazar.

    Güvenlik Duvarında 80 ve 443 Portlarını Açma#

    Apache çalışıyor olabilir ama güvenlik duvarı isteği içeri almıyorsa siteniz açılmaz — ve bu, uzak sunucuda LAMP kurulumunun en sık atlanan adımıdır. Ubuntu'da UFW kuruludur; etkinse varsayılan politikası gelen bağlantıları reddetmektir.

    sudo ufw status
    

    Status: inactive görüyorsanız güvenlik duvarı kapalıdır ve portlar zaten açıktır — ama bu iyi bir durum değil, aktif etmeden önce mutlaka SSH'a izin verin yoksa kendinizi sunucudan kilitlersiniz:

    sudo ufw allow OpenSSH
    sudo ufw allow 'Apache Full'
    sudo ufw enable
    

    Apache Full profili 80 (HTTP) ve 443 (HTTPS) portlarını birlikte açar. Sadece 80'i açan Apache profili de vardır ama ileride SSL kuracağınız için baştan ikisini açmak daha pratiktir. Kural setinin tamamını ve profillerin nasıl çalıştığını UFW güvenlik duvarı yazısında ayrıntılı anlattık.

    Sunucu sağlayıcınızın panelinde ayrı bir ağ güvenlik duvarı varsa (bazı bulut sunucularda vardır), oradan da 80/443'e izin vermeniz gerekir. İki katmanlı bir yapıda sadece birini açmak sorunu çözmez.

    Apache'yi Uzak Sunucuda Doğru Test Etme#

    Uzak sunucuda testi tarayıcıya sunucunun IP adresini yazarak yaparsınız, localhost yazarak değil. Bu ayrım Türkçe kaynakların çoğunda atlanır ve masaüstü Ubuntu için yazılmış bir rehberi takip eden kullanıcı, kendi bilgisayarında localhost'a girip "sayfa açılmıyor" diyerek kuruluma güvenini kaybeder. Sunucunun IP'sini öğrenmek için:

    curl -4 icanhazip.com
    

    Dönen IP'yi tarayıcıya http://SUNUCU_IP biçiminde yazın. Apache'nin varsayılan "Apache2 Ubuntu Default Page" sayfasını görüyorsanız web sunucusu ayakta demektir.

    Tarayıcı açılmıyorsa, sorunun Apache'de mi ağda mı olduğunu ayırmak için sunucunun kendi içinden istek atın:

    curl -I http://127.0.0.1
    

    Bu komut HTTP/1.1 200 OK dönüyorsa Apache sorunsuz çalışıyor, sorun güvenlik duvarında veya sağlayıcı tarafındadır. Komut Connection refused diyorsa Apache ayakta değildir. Bu iki satırlık ayrım, saatlerce yanlış yerde arama yapmanızı engeller.

    MySQL Kurulumu ve mysql_secure_installation#

    Veritabanı sunucusunu kurun:

    sudo apt install mysql-server -y
    sudo systemctl status mysql
    

    Kurulum bittiğinde MySQL çalışır durumdadır ama güvensizdir: anonim kullanıcılar açıktır, test veritabanı durur ve root kullanıcısının uzaktan bağlanması engellenmemiş olabilir. Bunu düzelten script paketle birlikte gelir:

    sudo mysql_secure_installation
    

    Script size sırayla sorular sorar. Cevapları şöyle vermenizi öneririm:

    SoruÖnerilen cevapNeden
    VALIDATE PASSWORD bileşeni kurulsun muYZayıf parolaların veritabanına girmesini engeller
    Parola politikası seviyesi1 (MEDIUM) veya 2 (STRONG)0 (LOW) sadece uzunluk kontrol eder, yetersiz
    Anonim kullanıcılar silinsin miYParolasız bağlanmayı kapatır
    Root uzaktan girişi kapatılsın mıYVeritabanına yalnızca sunucudan erişilsin
    Test veritabanı silinsin miYHerkesin yazabildiği örnek şema
    Yetki tabloları yeniden yüklensin miYDeğişikliklerin hemen geçerli olması için

    Modern Ubuntu sürümlerinde root kullanıcısı auth_socket eklentisiyle çalışır; yani root olarak sudo mysql yazdığınızda parola sorulmadan girersiniz. Bu bir hata değil, kasıtlı bir tasarımdır ve sunucu dışından root girişini imkânsız kılar. Uygulamanız için root kullanmayın, ayrı bir kullanıcı ve veritabanı açın:

    CREATE DATABASE sitedb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'siteuser'@'localhost' IDENTIFIED BY 'BurayaGucluBirParola';
    GRANT ALL PRIVILEGES ON sitedb.* TO 'siteuser'@'localhost';
    FLUSH PRIVILEGES;
    

    utf8mb4 karakter setini baştan seçmek önemlidir: Türkçe karakterler ve emoji dâhil her şeyi sorunsuz saklar, sonradan dönüştürmek ise tablo tablo uğraşmak demektir. Veritabanı tarafını daha ileri götürmek isterseniz MariaDB kurulumu ve güvenliği yazısındaki sertleştirme adımları MySQL için de büyük ölçüde geçerlidir.

    PHP Kurulumu ve Apache ile Bağlanması#

    PHP'yi Apache modülü ve MySQL sürücüsüyle birlikte kurun:

    sudo apt install php libapache2-mod-php php-mysql -y
    

    Bu üç paket LAMP'ın minimum PHP tarafıdır. Gerçek bir uygulama çalıştıracaksanız (WordPress, Laravel, OpenCart fark etmez) birkaç eklenti daha gerekir:

    sudo apt install php-curl php-gd php-mbstring php-xml php-zip php-intl php-bcmath -y
    

    Hangi eklentinin ne işe yaradığını bilmek, "eklenti eksik" hatası aldığınızda hangisini kuracağınızı tahmin etmenizi sağlar:

    EklentiNe için gerekir
    php-curlDış API çağrıları, ödeme entegrasyonları, güncelleme kontrolü
    php-gdGörsel yeniden boyutlandırma, küçük resim üretimi
    php-mbstringTürkçe karakterlerin doğru kesilmesi ve büyük/küçük harf dönüşümü
    php-xmlRSS, site haritası, XML tabanlı içe/dışa aktarım
    php-zipEklenti ve tema arşivlerini açma
    php-intlTarih/para biçimlendirme, çok dilli sıralama
    php-mysqlMySQL bağlantısı (bu olmadan veritabanı bağlantı hatası alırsınız)

    Kurulumdan sonra Apache'yi yeniden başlatın ve PHP sürümünü doğrulayın:

    sudo systemctl restart apache2
    php -v
    

    Dikkat: php -v komut satırındaki PHP sürümünü gösterir; Apache'nin kullandığı sürüm ayrıdır. İkisinin aynı olduğunu web üzerinden test edeceğiz.

    PHP'nin bellek limiti, yükleme boyutu ve çalışma süresi gibi ayarlarını sonradan değiştirmeniz gerekecek; hangi dosyanın hangi sürüm için geçerli olduğunu ve değişikliğin nasıl doğrulanacağını php.ini ayarları yazısında adım adım gösterdik.

    Sanal Host (Virtual Host) Tanımlama#

    Apache varsayılan olarak /var/www/html dizinini yayınlar. Tek site bile çalıştıracak olsanız kendi sanal host'unuzu tanımlamanız daha doğrudur: sonradan ikinci bir alan adı eklemek istediğinizde yapı hazır olur ve varsayılan yapılandırmayı bozmadan çalışırsınız.

    Önce site için dizin açın:

    sudo mkdir -p /var/www/ornek.com/public_html
    

    Sonra yapılandırma dosyasını oluşturun:

    sudo nano /etc/apache2/sites-available/ornek.com.conf
    

    İçeriği:

    <VirtualHost *:80>
        ServerName ornek.com
        ServerAlias www.ornek.com
        DocumentRoot /var/www/ornek.com/public_html
    
        <Directory /var/www/ornek.com/public_html>
            Options -Indexes +FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    
        ErrorLog ${APACHE_LOG_DIR}/ornek.com-error.log
        CustomLog ${APACHE_LOG_DIR}/ornek.com-access.log combined
    </VirtualHost>
    

    Buradaki üç satır kritik ve genelde yanlış yazılıyor:

    • Options -Indexes — dizin listelemeyi kapatır. Bu satır olmadan index.php bulunmayan bir klasöre girildiğinde Apache dosyaların listesini gösterir; yedek dosyalarınız, .sql dökümleriniz herkese açık olur.
    • AllowOverride All.htaccess dosyasının çalışmasını sağlar. WordPress kalıcı bağlantıları ve çoğu framework'ün yönlendirmeleri bu olmadan 404 verir.
    • Require all granted — erişime izin verir. Yazılmadığında 403 Forbidden alırsınız.

    Siteyi etkinleştirin, varsayılanı kapatın ve yapılandırmayı test edin:

    sudo a2ensite ornek.com.conf
    sudo a2dissite 000-default.conf
    sudo a2enmod rewrite
    sudo apache2ctl configtest
    sudo systemctl reload apache2
    

    configtest komutu Syntax OK dönmeden asla reload etmeyin. Hatalı yapılandırmayla reload denerseniz Apache çalışmayı sürdürür ama yeni ayarlar geçmez; restart denerseniz servis hiç kalkmayabilir. Sanal host mantığının çok siteli senaryolardaki ayrıntıları için Apache virtual host tanımlama yazısına bakabilirsiniz.

    /var/www İzinleri: Kim Sahip Olmalı#

    Web dizinine 777 vermeyin — bu, yıllardır gördüğüm en yaygın ve en pahalı hatadır. 777 izni, sunucudaki herhangi bir kullanıcının (veya ele geçirilmiş başka bir hesabın) sitenizin dosyalarını değiştirmesine izin verir; bir kez PHP dosyası yazabilen saldırgan sunucunun tamamına yönelir.

    Doğru yapı şudur: dosyaların sahibi sizin kullanıcınız, grubu Apache'nin çalıştığı www-data grubu olsun.

    sudo chown -R $USER:www-data /var/www/ornek.com
    sudo find /var/www/ornek.com -type d -exec chmod 755 {} \;
    sudo find /var/www/ornek.com -type f -exec chmod 644 {} \;
    

    Dizinler 755 (sahibi yazabilir, herkes girebilir), dosyalar 644 (sahibi yazabilir, herkes okuyabilir). PHP'nin dosya yazması gereken belirli klasörler varsa (yükleme klasörü, önbellek klasörü) yalnızca onlara grup yazma izni verin:

    sudo chmod -R 775 /var/www/ornek.com/public_html/uploads
    

    İzin bitlerinin ne anlama geldiğini ve chmod sayılarının nasıl okunacağını Linux dosya izinleri yazısında ayrıntılı anlattık.

    Kurulumun Tamamını Doğrulama ve Tipik Hatalar#

    Üç parçanın da birlikte çalıştığını tek dosyayla test edebilirsiniz. Sanal host dizinine bir PHP dosyası koyun:

    echo "<?php phpinfo();" | sudo tee /var/www/ornek.com/public_html/info.php
    

    Tarayıcıdan http://SUNUCU_IP/info.php adresine gidin. PHP bilgi sayfasını görüyorsanız Apache PHP'yi çalıştırıyor demektir; sayfada mysqli ve pdo_mysql bölümlerini arayın, varsa veritabanı sürücüsü de yerinde.

    Bu dosyayı testten hemen sonra silin. phpinfo() çıktısı PHP sürümünü, yüklü eklentileri, dosya yollarını ve bazı yapılandırma değerlerini olduğu gibi dışarıya verir; saldırganın ilk baktığı yerlerden biridir.

    sudo rm /var/www/ornek.com/public_html/info.php
    

    Karşılaşacağınız tipik hatalar ve gerçek sebepleri:

    BelirtiSebepÇözüm
    Tarayıcı bağlanamıyor80 portu kapalısudo ufw allow 'Apache Full'
    Apache varsayılan sayfası çıkıyorSanal host etkin değila2ensite + a2dissite 000-default
    PHP dosyası indiriliyorlibapache2-mod-php kurulu değilPaketi kurup Apache'yi yeniden başlatın
    403 ForbiddenRequire all granted yok veya izin hatalıYapılandırmayı ve chmod'u kontrol edin
    Dizin listesi görünüyorindex.php yok ve Indexes açıkOptions -Indexes ekleyin
    Veritabanı bağlantı hatasıphp-mysql eksik veya kullanıcı yetkisi yokPaketi kurun, GRANT satırını doğrulayın

    Alan adınızı bu sunucuya yönlendirip ilk sitenizi yayına almak sıradaki adımdır; dosya yükleme, DNS yönlendirme ve yayın sonrası kontrolleri sunucuya web sitesi yükleme yazısında uçtan uca anlattık.

    Sıkça Sorulan Sorular#

    LAMP kurulumu ne kadar sürer#

    Deneyimli bir kullanıcı için tüm kurulum 10-15 dakikadır, ilk kez yapıyorsanız doğrulama adımlarıyla birlikte yarım saat ayırın. Paket indirmeleri sunucunun bağlantı hızına bağlıdır ama toplam boyut birkaç yüz megabaytı geçmez. Süreyi uzatan şey kurulum değil, güvenlik duvarı ve DNS gibi yan adımların ilk kez yapılmasıdır. Bu yüzden komutları toplu kopyalayıp geçmek yerine her adımın sonundaki doğrulamayı çalıştırmanızı öneririm.

    MySQL yerine MariaDB kurabilir miyim#

    Evet, MariaDB MySQL ile büyük ölçüde uyumludur ve sudo apt install mariadb-server komutuyla kurulur. PHP tarafında yine php-mysql paketi kullanılır, uygulama kodunda hiçbir değişiklik gerekmez. mysql_secure_installation scripti MariaDB'de de aynı isimle gelir ve aynı soruları sorar. Hangisini seçeceğiniz büyük ölçüde tercih meselesidir; kullandığınız uygulamanın belgelerinde özel bir öneri varsa ona uyun.

    Apache mi Nginx mi kurmalıyım#

    Apache, .htaccess desteği sayesinde paylaşımlı hosting alışkanlığından gelen kullanıcılar ve WordPress gibi uygulamalar için daha kolaydır. Nginx statik dosya sunumunda ve yüksek eşzamanlı bağlantıda daha verimlidir ama yönlendirmeleri sunucu yapılandırmasından tanımlamanız gerekir. İlk sunucunuzda LAMP ile başlamak öğrenme eğrisini düşürür, ihtiyaç doğduğunda geçiş yapabilirsiniz. İki sunucunun mimari farklarını ayrı bir yazıda karşılaştırdık.

    Kurulumdan sonra siteme SSL nasıl eklerim#

    SSL için sanal host'unuzun ServerName değeri gerçek bir alan adı olmalı ve o alan adı sunucunun IP'sine yönlenmiş olmalıdır. Bu iki şart sağlandıktan sonra Let's Encrypt sertifikası Certbot ile birkaç dakikada kurulur ve Apache yapılandırmanıza 443 portlu ikinci bir sanal host bloğu ekler. Sertifika alma denemesini DNS yayılması tamamlanmadan yapmayın; doğrulama başarısız olur ve tekrar denemeler için bekleme süresi devreye girebilir.

    PHP dosyam çalışmıyor, tarayıcı indiriyor ne yapmalıyım#

    Bu, Apache'nin PHP modülünün kurulu olmadığının kesin işaretidir. sudo apt install libapache2-mod-php komutunu çalıştırıp sudo systemctl restart apache2 ile Apache'yi yeniden başlatın. Kurulu olduğu hâlde sorun sürüyorsa sudo a2enmod php8.3 benzeri bir komutla modülü etkinleştirmeniz gerekebilir; sisteminizdeki modül adını ls /etc/apache2/mods-available/ | grep php ile öğrenebilirsiniz. Modül aktifken apache2ctl -M | grep php çıktısında modül görünür.

    /var/www dizinine 777 izni vermek neden yanlış#

    777 izni dosyayı sunucudaki herkesin yazabileceği hâle getirir ve bu, tek bir güvenlik açığını tam sunucu ele geçirmeye dönüştürür. Aynı sunucuda çalışan başka bir uygulamadaki zafiyet ya da ele geçirilmiş bir FTP hesabı, sitenizin PHP dosyalarına zararlı kod ekleyebilir. Doğru yaklaşım dizinlere 755, dosyalara 644 vermek ve yalnızca gerçekten yazma gereken klasörlere grup yazma izni tanımaktır. "İzin hatası alıyorum, 777 yapayım" refleksi sorunu çözmez, sadece erteler.

    Sunucuda birden fazla site barındırabilir miyim#

    Evet, her site için ayrı bir sanal host dosyası oluşturup ayrı bir DocumentRoot dizini tanımlarsınız. Apache gelen isteğin Host başlığına bakarak hangi sanal host'un devreye gireceğine karar verir, bu yüzden tek IP üzerinde onlarca alan adı barındırabilirsiniz. Sınır teknik değil kaynaktır: her sitenin PHP süreçleri aynı CPU ve RAM'i paylaşır. Site sayısı arttıkça ayrı veritabanı kullanıcıları ve ayrı log dosyaları kullanmak sorun teşhisini kolaylaştırır.

    Kurulumu bozdum, baştan başlayabilir miyim#

    Evet, yönetimsiz bir sunucuda en hızlı toparlanma yolu işletim sistemini yeniden kurmaktır ve bu ilk günlerde tamamen normaldir. Sunucu panelinizden yeniden kurulum başlattığınızda diskteki her şey silinir, bu yüzden varsa yüklediğiniz dosyaları ve veritabanı dökümünü önce indirin. Tek tek paket kaldırmakla uğraşmak, yarım kalmış yapılandırma dosyaları yüzünden genelde daha uzun sürer. Süreci ve öncesinde alınacak yedekleri anlattığımız yazı için bakınız: sunucuya format atma.

    Kapanış#

    LAMP kurulumu aslında birbirini doğrulayan küçük adımlardan oluşur: paket listesini güncelle, Apache'yi kur, güvenlik duvarında 80/443'ü aç, IP ile test et, MySQL'i kurup mysql_secure_installation ile sertleştir, PHP'yi ve gereken eklentileri ekle, sanal host tanımla, izinleri 755/644 yap ve phpinfo() ile hepsini birlikte doğrulayıp o dosyayı sil. Bu sıra bozulduğunda hata mesajları yanıltıcı olur — 403 gördüğünüzde izne, boş sayfa gördüğünüzde PHP'ye, hiç bağlanamadığınızda güvenlik duvarına bakmak size çok zaman kazandırır.

    Bu adımları kendi sunucunuzda uygulamak istiyorsanız kök erişimi olan bir makineye ihtiyacınız var; VDS sunucu paketleri tam olarak bu senaryo için tasarlandı ve işletim sistemi seçimini sipariş sırasında yapabiliyorsunuz. Kurulum ve sertleştirmeyle uğraşmak yerine hazır bir ortamda çalışmayı tercih ederseniz Apache, PHP ve MySQL'in yapılandırılmış hâlde geldiği web hosting paketleri işi devralır. Sunucunuz sizde kalsın ama güncelleme, izleme ve güvenlik tarafını başkası üstlensin diyorsanız sunucu yönetimi hizmeti bu ikisinin arasındaki dengeyi kurar.

    lampapachekurulum

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.