Yeni bir Ubuntu sunucu kurduğunuzda, web uygulamaları çalıştırabilmek için genellikle ilk yapmanız gereken şey LAMP stack kurmaktır. LAMP; Linux, Apache, MySQL (ya da MariaDB) ve PHP’den oluşan, dünyada en yaygın kullanılan web sunucu ortamıdır. WordPress, Drupal, Laravel gibi onlarca popüler uygulama bu stack üzerinde koşar. Bu yazıda Ubuntu 22.04 LTS üzerinde LAMP kurulumunu adım adım, gerçek dünya senaryolarıyla anlatacağım.
Kuruluma Başlamadan Önce
Sunucunuza root ya da sudo yetkisi olan bir kullanıcıyla bağlandığınızı varsayıyorum. Kuruluma geçmeden önce sistemin paket listesini güncelleyelim. Bu adımı atlarsanız eski sürüm paketler kurulabilir, sonradan gereksiz baş ağrısı yaşarsınız.
sudo apt update && sudo apt upgrade -y
Sunucunuzun hostname’ini de kontrol etmenizi öneririm. Özellikle birden fazla sunucu yönetiyorsanız hangi makinede olduğunuzu bilmek önemlidir.
hostnamectl
Apache Kurulumu
Apache, dünyanın en çok kullanılan web sunucularından biridir. Kurulumu son derece basittir.
sudo apt install apache2 -y
Kurulum tamamlandıktan sonra Apache’nin çalışıp çalışmadığını kontrol edin:
sudo systemctl status apache2
Eğer servis çalışmıyorsa elle başlatın:
sudo systemctl start apache2
sudo systemctl enable apache2
enable komutu, sunucu yeniden başladığında Apache’nin otomatik olarak ayağa kalkmasını sağlar. Bunu unutmak klasik bir hatadır. Sunucu reboot edildiğinde web sitesi neden çalışmıyor diye saatlerce araştırmak zorunda kalmadan önce bu adımı yapmak işinizi kolaylaştırır.
Güvenlik Duvarı Ayarları
Ubuntu’da UFW (Uncomplicated Firewall) kullanılıyorsa Apache için gerekli portları açmanız gerekir.
sudo ufw allow 'Apache Full'
sudo ufw status
Apache Full profili hem HTTP (80) hem de HTTPS (443) portlarını açar. Sadece HTTP trafiğine izin vermek istiyorsanız Apache profilini kullanabilirsiniz.
Tarayıcınızda sunucunuzun IP adresine girdiğinizde “Apache2 Ubuntu Default Page” sayfasını görüyorsanız Apache başarıyla çalışıyor demektir.
Apache Yapılandırması Hakkında Birkaç Not
Apache’nin ana yapılandırma dosyası /etc/apache2/apache2.conf dosyasıdır. Virtual host dosyaları ise /etc/apache2/sites-available/ dizininde tutulur. Web sitenizin dosyaları varsayılan olarak /var/www/html/ altına konur. Ancak birden fazla site barındırıyorsanız her site için ayrı dizin oluşturmanızı öneririm; örneğin /var/www/sirketadi.com/html/ şeklinde.
MySQL Kurulumu
MySQL yerine MariaDB de kullanabilirsiniz. MariaDB, MySQL’in topluluk tarafından geliştirilen bir fork’udur ve Ubuntu’nun resmi repolarında yer alır. Performans açısından küçük-orta ölçekli projeler için aralarında kayda değer bir fark yoktur. Bu yazıda MySQL ile devam edeceğim.
sudo apt install mysql-server -y
Kurulum bittikten sonra MySQL’i güvenli hale getirmek için mysql_secure_installation scriptini çalıştırın. Bu script; root şifresi belirlemenizi, anonim kullanıcıları silmenizi, uzaktan root girişini devre dışı bırakmanızı ve test veritabanını kaldırmanızı sağlar.
sudo mysql_secure_installation
Script sizi adım adım yönlendirir. Sorulara verdiğiniz cevaplar önemlidir:
- VALIDATE PASSWORD PLUGIN: Güçlü şifre politikası zorunluluğu. Üretim sunucusu için “Yes” seçin.
- Remove anonymous users: Kesinlikle “Yes” deyin.
- Disallow root login remotely: Güvenlik için “Yes” deyin.
- Remove test database: “Yes” deyin, gereksiz bir yük.
- Reload privilege tables: “Yes” deyin.
MySQL’e bağlandığınızda bir sorunla karşılaşabilirsiniz. Ubuntu 22.04’te MySQL root kullanıcısı varsayılan olarak auth_socket eklentisini kullanır, yani şifre yerine sistem kullanıcısını doğrular. Bu yüzden MySQL konsoluna şöyle girebilirsiniz:
sudo mysql
Veritabanı ve Kullanıcı Oluşturma
Gerçek dünyada root kullanıcısını uygulamalarınız için kullanmamalısınız. Her uygulama için ayrı veritabanı ve kullanıcı oluşturun. Örneğin bir WordPress sitesi kuruyorsunuz:
CREATE DATABASE wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'GucluBirSifre123!';
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
CHARACTER SET utf8mb4 kullanmak önemlidir. Emoji ve özel karakterleri destekler, Türkçe karakterlerde sorun yaşamazsınız. Bunu baştan doğru yapmazsanız daha sonra karakter seti dönüşümü yapmak gerçekten can sıkıcı olur.
PHP Kurulumu
PHP, LAMP stack’in son halkasıdır. Ubuntu 22.04 repolarında PHP 8.1 bulunur. Ancak bazı uygulamalar farklı PHP sürümleri gerektirebilir. Önce standart kurulumu yapalım, ardından sürüm yönetiminden bahsedeceğim.
sudo apt install php libapache2-mod-php php-mysql -y
Bu komut temel PHP kurulumunu yapar. Ancak çoğu web uygulaması ek PHP modülleri gerektirir. Yaygın olarak kullanılan modülleri şöyle kurabilirsiniz:
sudo apt install php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip php-bcmath -y
Her modülün ne işe yaradığını kısaca açıklayayım:
- php-curl: URL’lerden veri çekme, API istekleri için gereklidir
- php-gd: Görüntü işleme (resim yeniden boyutlandırma, thumbnail oluşturma)
- php-mbstring: Çok baytlı karakter dizileri, Türkçe karakter desteği için kritik
- php-xml: XML dosyalarını okuma/yazma işlemleri
- php-xmlrpc: XML-RPC protokolü desteği
- php-soap: SOAP web servisleri
- php-intl: Uluslararasılaştırma fonksiyonları
- php-zip: ZIP dosyası oluşturma ve açma
- php-bcmath: Yüksek hassasiyetli matematik işlemleri
Modülleri kurduktan sonra Apache’yi yeniden başlatın:
sudo systemctl restart apache2
PHP Versiyonunu Doğrulama
php -v
PHP’nin doğru çalıştığını test etmek için basit bir info dosyası oluşturabilirsiniz. Not: Bu dosyayı test sonrası mutlaka silin, sunucu hakkında hassas bilgiler içerir.
sudo nano /var/www/html/info.php
Dosyaya şunu yazın:
<?php phpinfo(); ?>
Tarayıcınızda http://sunucu-ip/info.php adresine gidin. PHP bilgilerini gösteren renkli sayfayı görürseniz PHP çalışıyor demektir. Test bittikten sonra dosyayı silin:
sudo rm /var/www/html/info.php
PHP Yapılandırması
PHP’nin yapılandırma dosyası /etc/php/8.1/apache2/php.ini yolunda bulunur. Bazı temel ayarları production ortamı için değiştirmenizi öneririm:
sudo nano /etc/php/8.1/apache2/php.ini
Değiştirmenizi önerdiğim ayarlar:
- upload_max_filesize: Varsayılan 2M, büyük dosya yükleyen siteler için artırın (örn: 64M)
- post_max_size: upload_max_filesize’dan büyük olmalı (örn: 128M)
- max_execution_time: Varsayılan 30 saniye, uzun süren işlemler için artırabilirsiniz
- memory_limit: Varsayılan 128M, yoğun uygulamalar için 256M veya daha fazlası gerekebilir
- display_errors: Production’da mutlaka
Offyapın, hata mesajları güvenlik açığı yaratır - error_log: Hataları dosyaya kaydedin:
/var/log/php_errors.log
Değişikliklerden sonra Apache’yi yeniden başlatmayı unutmayın.
Virtual Host Yapılandırması
Tek IP üzerinde birden fazla web sitesi çalıştırmak istiyorsanız Apache Virtual Host kullanmanız gerekir. Bu, gerçek dünya senaryolarında neredeyse her zaman karşılaştığınız bir durumdur.
Örnek olarak sirketim.com adında bir site için yapılandırma yapalım. Önce dizin yapısını oluşturun:
sudo mkdir -p /var/www/sirketim.com/html
sudo chown -R $USER:$USER /var/www/sirketim.com/html
sudo chmod -R 755 /var/www/sirketim.com
Basit bir index sayfası oluşturun:
echo '<h1>Sirketim.com Calisiyor!</h1>' | sudo tee /var/www/sirketim.com/html/index.html
Şimdi Virtual Host yapılandırma dosyasını oluşturun:
sudo nano /etc/apache2/sites-available/sirketim.com.conf
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName sirketim.com
ServerAlias www.sirketim.com
DocumentRoot /var/www/sirketim.com/html
ErrorLog ${APACHE_LOG_DIR}/sirketim.com_error.log
CustomLog ${APACHE_LOG_DIR}/sirketim.com_access.log combined
<Directory /var/www/sirketim.com/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Virtual host’u etkinleştirin ve varsayılan siteyi devre dışı bırakın:
sudo a2ensite sirketim.com.conf
sudo a2dissite 000-default.conf
sudo a2enmod rewrite
sudo systemctl reload apache2
a2enmod rewrite komutu Apache’nin mod_rewrite modülünü etkinleştirir. WordPress ve benzeri uygulamaların .htaccess dosyaları bu modül olmadan çalışmaz. Çok sık karşılaşılan bir sorun olduğu için özellikle belirtmek istedim.
phpMyAdmin Kurulumu (Opsiyonel)
Veritabanlarını komut satırından yönetmek istemiyorsanız phpMyAdmin kullanabilirsiniz. Ancak phpMyAdmin’i sadece ihtiyaç duyduğunuzda kurun ve gerektiğinde erişimi IP ile kısıtlayın.
sudo apt install phpmyadmin php-mbstring -y
Kurulum sırasında web sunucusu seçimi sorulduğunda apache2‘yi seçin ve boşluk tuşuyla işaretleyin, ardından Tab ile OK’e geçin. Veritabanı yapılandırması için dbconfig-common seçeneğini kabul edin.
phpMyAdmin’i Apache’ye bağlamak için:
sudo phpenmod mbstring
sudo systemctl restart apache2
Güvenlik için phpMyAdmin’e .htaccess ile ek şifre koruması eklemenizi öneririm. Public sunucularda phpMyAdmin’i açık bırakmak, brute force saldırılarına davetiye çıkarmaktır.
LAMP Stack’i Test Etme
Tüm bileşenlerin birlikte çalıştığını doğrulamak için veritabanına bağlanan bir PHP scripti yazalım. Bu, entegrasyonun doğru kurulduğunu teyit etmenin en pratik yoludur.
sudo nano /var/www/html/dbtest.php
<?php
$servername = "localhost";
$username = "wp_user";
$password = "GucluBirSifre123!";
$dbname = "wordpress_db";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Baglanti hatasi: " . $conn->connect_error);
}
echo "MySQL baglantisi basarili! PHP versiyonu: " . phpversion();
$conn->close();
?>
Tarayıcıda http://sunucu-ip/dbtest.php adresine gidip “MySQL baglantisi basarili!” mesajını görüyorsanız LAMP stack tam anlamıyla çalışıyor demektir. Testi bitirdikten sonra bu dosyayı da silmeyi unutmayın!
sudo rm /var/www/html/dbtest.php
Sık Karşılaşılan Sorunlar ve Çözümleri
Yıllar içinde LAMP kurulumlarında tekrar tekrar gördüğüm sorunları ve çözümlerini paylaşayım.
Apache Başlamıyor
Genellikle yapılandırma dosyasında sözdizimi hatası olduğunda Apache başlamaz. Şu komutla hataları görebilirsiniz:
sudo apache2ctl configtest
“Syntax OK” çıkıyorsa sorun başka bir yerdedir. Log dosyalarına bakın:
sudo tail -f /var/log/apache2/error.log
PHP Modülleri Yüklenmiyor
Bazen modül kurulumundan sonra PHP modülünü ayrıca etkinleştirmeniz gerekir:
sudo phpenmod modul-adi
sudo systemctl restart apache2
MySQL’e Bağlanılamıyor
Eğer uygulamanız MySQL’e bağlanamıyorsa önce MySQL servisinin çalışıp çalışmadığını kontrol edin:
sudo systemctl status mysql
Ardından kullanıcı yetkilerini kontrol edin:
sudo mysql
SHOW GRANTS FOR 'wp_user'@'localhost';
403 Forbidden Hatası
Bu hata genellikle dosya izinleri yanlış ayarlandığında ortaya çıkar. Web sunucusu dosyalarınızı okuyabilmeli:
sudo chown -R www-data:www-data /var/www/sirketim.com/html
sudo chmod -R 755 /var/www/sirketim.com
PHP dosyaları için 644, dizinler için 755 izni standart yaklaşımdır.
SSL Sertifikası Ekleme
Production ortamında HTTP üzerinden çalışmak artık kabul edilebilir değil. Let’s Encrypt ile ücretsiz SSL sertifikası kurmak son derece kolaydır.
sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d sirketim.com -d www.sirketim.com
Certbot, Apache yapılandırmanızı otomatik olarak güncelleyecek ve HTTPS yönlendirmesini ayarlayacaktır. Sertifikalar 90 günde bir yenilenir. Otomatik yenilemeyi test etmek için:
sudo certbot renew --dry-run
Certbot kurulumu sırasında otomatik bir cron job oluşturulur. Sertifika yenileme konusunda ayrıca bir şey yapmanıza gerek kalmaz.
Performans İpuçları
LAMP stack kurulumunu tamamladıktan sonra temel performans iyileştirmelerini de uygulamanızı öneririm.
Apache için mod_deflate ve mod_headers modüllerini etkinleştirmek sayfa yükleme hızını ciddi ölçüde artırır:
sudo a2enmod deflate headers expires
sudo systemctl restart apache2
MySQL için innodb_buffer_pool_size ayarını sunucunuzun RAM’ine göre optimize edin. Genellikle toplam RAM’in %50-70’i verilmesi önerilir. 4GB RAM’li bir sunucuda şöyle ayarlayabilirsiniz:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Dosyaya [mysqld] bölümü altına ekleyin:
innodb_buffer_pool_size = 2G
query_cache_type = 1
query_cache_size = 64M
PHP tarafında OPcache kullanmak PHP scriptlerinin çalışma hızını önemli ölçüde artırır. Ubuntu’da genellikle kurulumla birlikte gelir ancak aktif olduğundan emin olun:
php -m | grep opcache
OPcache listelenmiyorsa etkinleştirin:
sudo phpenmod opcache
sudo systemctl restart apache2
Log Yönetimi
Sistem yöneticisi olarak logları takip etmek işin önemli bir parçasıdır. LAMP bileşenlerinin log dosyaları:
- Apache erişim logları:
/var/log/apache2/access.log - Apache hata logları:
/var/log/apache2/error.log - MySQL logları:
/var/log/mysql/error.log - PHP hata logları:
php.ini‘de belirlediğiniz yol
Canlı log takibi için:
sudo tail -f /var/log/apache2/access.log /var/log/apache2/error.log
logrotate Ubuntu’da varsayılan olarak kurulu gelir ve Apache loglarını otomatik rotate eder. Yapılandırmasını görmek için:
cat /etc/logrotate.d/apache2
Sonuç
Ubuntu’da LAMP stack kurulumu görünürde basit gibi görünse de, her adımın neden yapıldığını anlamak ilerleyen süreçte sorunları çok daha hızlı çözmenizi sağlar. Güvenlik duvarı ayarları, veritabanı kullanıcı izinleri, PHP modülleri, Virtual Host yapılandırması ve SSL sertifikası bir bütün olarak düşünülmeli. “Çalışıyor, oldu” demek yerine doğru yapılandırmayı baştan kurmak, ilerideki baş ağrılarını büyük ölçüde azaltır.
Bu yazıda anlattıklarım temel bir LAMP kurulumu için yeterli. Ama iş yoğunlaştıkça Nginx, Redis, Varnish gibi ek araçlara ihtiyaç duyabilirsiniz. Bunların üzerine de ileride yazılar yazacağım. Herhangi bir adımda takılırsanız yorumlarda sorun, elimden geldiğince yardımcı olmaya çalışırım.