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.