Rocky Linux ile LAMP Stack Kurulumu

Rocky Linux üzerinde production ortamı kuracaksanız, LAMP stack hâlâ en güvenilir ve yaygın tercihlerden biri. Red Hat tabanlı bu dağıtım, CentOS’un yerini aldıktan sonra sistem yöneticilerinin gözdesi hâline geldi. Bu yazıda sıfırdan başlayarak tam işlevsel bir LAMP ortamı kuracağız, güvenlik ayarlarını yapacağız ve gerçek dünyada karşılaşacağınız senaryolara hazırlanacağız.

Başlamadan Önce: Sistem Gereksinimleri ve Hazırlık

Rocky Linux 8 veya 9 kurulu bir sunucunuz olduğunu varsayıyorum. Minimum 1 GB RAM ve 20 GB disk alanı bu kurulum için yeterli olsa da production için en az 2 GB RAM öneririm. Ayrıca sudo yetkisine sahip bir kullanıcıyla çalışıyor olmalısınız, root ile doğrudan çalışmak iyi bir alışkanlık değil.

İlk olarak sistemi güncel hâle getirelim ve bazı temel araçları yükleyelim:

sudo dnf update -y
sudo dnf install -y wget curl vim net-tools epel-release

Firewall ve SELinux durumunu kontrol edin. Birçok yeni başlayan bu ikisini kapatıp geçiyor, ama bu büyük bir hata. Doğru yapılandırmayı öğrenmek çok daha değerli.

sudo systemctl status firewalld
sudo getenforce

SELinux Enforcing modunda olmalı. Permissive moduna geçmek ya da tamamen kapatmak güvenlik açığı oluşturur. Biz SELinux ile çalışmayı öğreneceğiz.

Apache Web Sunucusu Kurulumu

Rocky Linux depolarında Apache, httpd adıyla geliyor. Kurulum oldukça basit:

sudo dnf install -y httpd httpd-tools
sudo systemctl start httpd
sudo systemctl enable httpd

enable komutu sunucu yeniden başladığında Apache’nin otomatik olarak ayağa kalkmasını sağlar. Production ortamında bu kritik.

Firewall kurallarını eklemeyi unutmayın:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Kurulumu doğrulamak için tarayıcınızdan sunucu IP’sine gidin ya da curl kullanın:

curl -I http://localhost

HTTP/1.1 200 OK görüyorsanız Apache düzgün çalışıyor demektir.

Apache Temel Yapılandırması

/etc/httpd/conf/httpd.conf dosyası ana yapılandırma dosyasıdır. Ama production ortamında bunu doğrudan düzenlemek yerine /etc/httpd/conf.d/ dizinine özel yapılandırma dosyaları eklemeyi tercih edin. Bu sayede güncellemeler sırasında ayarlarınız kaybolmaz.

Sunucu bilgilerini gizlemek için şu ayarları yapın:

sudo vim /etc/httpd/conf/httpd.conf

Dosyada şu değerleri bulup değiştirin ya da yoksa ekleyin:

ServerTokens Prod
ServerSignature Off

Bu küçük ama önemli bir güvenlik adımı. Apache’nin versiyon bilgisini herkese açık şekilde yayınlaması gereksiz bir bilgi sızdırma.

MariaDB Kurulumu ve Güvenlik Ayarları

MySQL yerine MariaDB kullanıyoruz çünkü Rocky Linux depolarında varsayılan olarak bu geliyor ve binary uyumluluğu açısından pratikte fark yok. Rocky Linux 9’da şu şekilde kurulur:

sudo dnf install -y mariadb-server mariadb
sudo systemctl start mariadb
sudo systemctl enable mariadb

Servisin çalıştığını kontrol edin:

sudo systemctl status mariadb

Şimdi en önemli adım geliyor: güvenlik sihirbazını çalıştırmak. Bu adımı atlamayın, hiç atlamamalısınız:

sudo mysql_secure_installation

Bu sihirbaz size birkaç soru soracak:

  • Enter current password for root: İlk kurulumda boş bırakıp Enter’a basın
  • Switch to unix_socket authentication: N deyin, password authentication kullanalım
  • Change the root password: Y deyin ve güçlü bir parola belirleyin
  • Remove anonymous users: Y deyin
  • Disallow root login remotely: Y deyin, bu çok önemli
  • Remove test database: Y deyin
  • Reload privilege tables: Y deyin

Root parolasını belirledikten sonra veritabanı bağlantısını test edin:

mysql -u root -p

Uygulama için Ayrı Kullanıcı Oluşturma

Root kullanıcısını asla web uygulamanızda kullanmayın. Her uygulama için ayrı bir veritabanı kullanıcısı oluşturun ve sadece ihtiyacı olan yetkiyi verin. Bu en az yetki prensibi olarak bilinir:

sudo mysql -u root -p

MariaDB komut satırında:

CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'GucluBirParola123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

utf8mb4 karakter seti önemli çünkü emoji ve bazı özel karakterleri düzgün saklayabilmek için standart utf8 yeterli değil. Türkçe karakterler için de bu ayar daha güvenilir.

PHP Kurulumu

Bu noktada Rocky Linux’un güzel bir özelliğinden yararlanıyoruz: Application Streams. Farklı PHP versiyonları arasında geçiş yapabilirsiniz. Hangi versiyonların mevcut olduğunu görelim:

sudo dnf module list php

PHP 8.1 veya 8.2 kullanmanızı öneririm. Eski PHP versiyonları güvenlik güncellemesi almıyor ve modern framework’ler artık eski versiyonları desteklemiyor. PHP 8.2 için:

sudo dnf module enable php:8.2 -y
sudo dnf install -y php php-mysqlnd php-fpm php-json php-common php-mbstring php-xml php-zip php-gd php-curl php-opcache

Kurduğumuz eklentilere bakalım:

  • php-mysqlnd: MariaDB/MySQL bağlantısı için zorunlu
  • php-fpm: PHP FastCGI Process Manager, performans için kritik
  • php-mbstring: Çok baytlı karakter işleme, Türkçe için önemli
  • php-gd: Görsel işleme fonksiyonları
  • php-opcache: PHP betiklerini önbelleğe alarak performansı artırır
  • php-zip: ZIP dosyası işleme
  • php-curl: HTTP istekleri için

PHP-FPM Yapılandırması

PHP-FPM’i Apache ile birlikte kullanmak performansı önemli ölçüde artırır. PHP-FPM’i başlatın:

sudo systemctl start php-fpm
sudo systemctl enable php-fpm

/etc/php-fpm.d/www.conf dosyasında bazı ayarları kontrol edin. Özellikle user ve group değerlerinin apache olduğundan emin olun:

sudo grep -E "^user|^group" /etc/php-fpm.d/www.conf

PHP’nin düzgün çalıştığını test etmek için bir info dosyası oluşturun, ama bunu production’da bırakmayın:

sudo bash -c 'echo "<?php phpinfo(); ?>" > /var/www/html/info.php'

Tarayıcıdan http://sunucu-ip/info.php adresine gidin. PHP bilgi sayfasını görüyorsanız kurulum başarılı. Testi bitirdikten sonra bu dosyayı silin:

sudo rm /var/www/html/info.php

Virtual Host Yapılandırması

Gerçek bir ortamda tek sunucuda birden fazla site çalıştırmanız gerekebilir. Virtual host yapılandırması bunun için kullanılır. Örnek bir site için yapılandırma oluşturalım:

sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/log/httpd/example.com
sudo chown -R apache:apache /var/www/example.com
sudo chmod -R 755 /var/www/example.com

Şimdi virtual host yapılandırma dosyasını oluşturun:

sudo vim /etc/httpd/conf.d/example.com.conf

Dosya içeriği:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html
    DirectoryIndex index.php index.html

    ErrorLog /var/log/httpd/example.com/error.log
    CustomLog /var/log/httpd/example.com/access.log combined

    <Directory /var/www/example.com/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch .php$>
        SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Options -Indexes kritik bir güvenlik ayarı. Bu olmadan dizinde index dosyası olmadığında Apache tüm dosyaları listeleyebilir, bu da bilgi sızıntısına yol açar.

Yapılandırma sözdizimini kontrol edin ve Apache’yi yeniden yükleyin:

sudo apachectl configtest
sudo systemctl reload httpd

SELinux Yapılandırması

SELinux ile çalışırken web dizinleri için doğru context’i ayarlamak gerekiyor. Yeni oluşturduğunuz dizinlerin context’ini kontrol edin:

ls -Z /var/www/

Yeni oluşturulan dizinlerin context’ini ayarlayın:

sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/example.com(/.*)?"
sudo restorecon -Rv /var/www/example.com/

PHP uygulamanızın veritabanına bağlanabilmesi için:

sudo setsebool -P httpd_can_network_connect_db 1

Eğer uygulamanızın ağ bağlantısı yapması gerekiyorsa (örneğin harici API çağrıları):

sudo setsebool -P httpd_can_network_connect 1

SELinux loglarını izlemek için audit2why ve audit2allow araçlarını kullanabilirsiniz. Bir şey çalışmıyorsa büyük ihtimal SELinux engelliyor:

sudo tail -f /var/log/audit/audit.log | grep denied

OPcache Yapılandırması

PHP OPcache performans için çok önemli. /etc/php.d/10-opcache.ini dosyasını düzenleyin:

sudo vim /etc/php.d/10-opcache.ini

Production için önerilen ayarlar:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.save_comments=1
  • opcache.memory_consumption: OPcache için ayrılan MB cinsinden bellek
  • opcache.max_accelerated_files: Önbellekte tutulacak maksimum dosya sayısı
  • opcache.revalidate_freq: PHP dosyası değişikliklerinin kaç saniyede bir kontrol edileceği

Bu ayarları yaptıktan sonra PHP-FPM’i yeniden başlatın:

sudo systemctl restart php-fpm

MariaDB Performans Ayarları

Varsayılan MariaDB ayarları küçük sistemler için bile yetersiz kalabiliyor. /etc/my.cnf.d/ dizinine yeni bir yapılandırma dosyası ekleyin:

sudo vim /etc/my.cnf.d/performance.cnf
[mysqld]
# Temel performans ayarları
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# Bağlantı ayarları
max_connections = 150
connect_timeout = 10
wait_timeout = 28800

# Sorgu önbelleği (MariaDB 10.3 ve öncesi için)
query_cache_type = 1
query_cache_size = 64M
query_cache_limit = 2M

# Karakter seti
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
  • innodb_buffer_pool_size: Sunucunuzun toplam RAM’inin %50-70’ini buraya verin, en kritik InnoDB ayarı
  • innodb_flush_log_at_trx_commit: 2 değeri performans ve güvenilirlik arasında iyi bir denge
  • max_connections: Çok yüksek tutmayın, her bağlantı bellek tüketir

MariaDB’yi yeniden başlatın:

sudo systemctl restart mariadb

Log Yönetimi ve İzleme

Production ortamında log yönetimi çok önemli. Apache loglarını düzenli takip etmek güvenlik açıklarını ve performans sorunlarını erken tespit etmenizi sağlar.

Gerçek zamanlı hata takibi için:

sudo tail -f /var/log/httpd/error_log
sudo tail -f /var/log/httpd/example.com/error.log

PHP hatalarını görmek için PHP-FPM loglarına bakın:

sudo tail -f /var/log/php-fpm/www-error.log

MariaDB slow query log’unu aktif etmek için /etc/my.cnf.d/performance.cnf dosyasına ekleyin:

slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 2

2 saniyeden uzun süren sorgular loglanacak. Bu değeri kendi uygulamanıza göre ayarlayın.

Otomatik Güvenlik Güncellemeleri

Production sunucularda güvenlik güncellemelerini manuel takip etmek zor. dnf-automatic paketini yükleyin:

sudo dnf install -y dnf-automatic

Sadece güvenlik güncellemelerini otomatik indirip uygulamak için /etc/dnf/automatic.conf dosyasını düzenleyin:

sudo vim /etc/dnf/automatic.conf

Şu değerleri ayarlayın:

apply_updates = yes
upgrade_type = security
emit_via = stdio

Servisi aktif edin:

sudo systemctl enable --now dnf-automatic.timer

Sonuç

Rocky Linux üzerinde kurduğumuz bu LAMP stack, production ortamına hazır bir temel sunuyor. Apache, MariaDB ve PHP’yi sadece kurmakla kalmadık; güvenlik ayarlarını, performans optimizasyonlarını ve izleme altyapısını da yapılandırdık.

Özetlemek gerekirse şu kritik noktalara dikkat edin:

  • SELinux’u kapatmayın, doğru yapılandırın
  • Her uygulama için ayrı veritabanı kullanıcısı oluşturun
  • phpinfo() gibi hassas bilgi yayınlayan dosyaları production’da bırakmayın
  • OPcache ve MariaDB performans ayarlarını sunucu kaynaklarınıza göre düzenleyin
  • Log rotasyonu ve izlemeyi baştan kurun
  • Otomatik güvenlik güncellemelerini aktif edin

Bu kurulum WordPress, Laravel, CodeIgniter gibi popüler PHP uygulamaları için sağlam bir zemin oluşturur. Bir sonraki adım olarak Let’s Encrypt ile SSL sertifikası kurmayı ve Apache yapılandırmanıza HTTP’den HTTPS’e otomatik yönlendirme eklemeyi düşünebilirsiniz. HTTPS olmadan hiçbir web uygulaması production’a çıkmamalı, bu artık standart bir gereksinim.

Yorum yapın