İçindekiler
- 1 Moodle ve LMS Hosting Performansını Doğru Kurmak Neden Zor Geliyor?
- 2 Moodle ve Diğer LMS’ler: Performansı Asıl Ne Belirliyor?
- 3 Doğru Altyapıyı Seçmek: paylaşımlı hosting mi, VPS mi, Dedicated mi?
- 4 PHP Katmanı: Moodle Performansının İlk Ayağı
- 5 Veritabanı Katmanı: MySQL/MariaDB/PostgreSQL Ayarları
- 6 Önbellek Katmanı: Redis, OPcache ve Sayfa Önbelleği
- 7 Moodle ve LMS Özel Senaryoları: Sınav Dönemi, Dosya Depolama ve Cron
- 8 DCHost ile Moodle ve LMS Mimarisi Kurarken Yol Haritası
- 9 Özet ve Son Tavsiyeler
Moodle ve LMS Hosting Performansını Doğru Kurmak Neden Zor Geliyor?
Bir e-öğrenme platformu kurarken çoğu ekip önce müfredatı, içerik üretimini ve kullanıcı arayüzünü planlıyor. Teknik tarafta ise genellikle tek soru soruluyor: “Sunucu kaç GB RAM olsun?” Performans problemleri ise ancak ilk dönem sonu sınavında, yüzlerce öğrencinin aynı anda sınava girmeye çalıştığı anda fark ediliyor. Aslında Moodle ve benzeri tüm LMS’ler (Canvas, Open edX, Sakai, kurumsal LMS’ler vb.) için performansı belirleyen şey, yalnızca CPU ve RAM değil; PHP ayarları, veritabanı yapılandırması ve doğru önbellek stratejisi.
Biz DCHost olarak eğitim platformlarıyla çalışan çok sayıda kurumun ortamını yönetirken şunu gördük: Aynı donanım üzerinde, doğru yapılandırılmış bir Moodle ortamı, yanlış ayarlı bir ortama göre 2–3 kat daha fazla eşzamanlı kullanıcıyı rahatlıkla kaldırabiliyor. Üstelik bu fark çoğu zaman sadece birkaç php.ini, my.cnf ve Redis ayarıyla ortaya çıkıyor. Bu rehberde, Moodle ve diğer PHP tabanlı LMS’ler için hosting tarafında yapmanız gereken kritik ayarları; PHP, veritabanı ve önbellek katmanlarına odaklanarak adım adım anlatacağız.
Eğer genel mimari ve LMS seçimleri tarafında daha geniş bir çerçeve görmek isterseniz, daha önce hazırladığımız eğitim platformları için LMS hosting çözümleri rehberimizi de mutlaka inceleyin. Bu yazıda ise doğrudan performansın kalbine, yani sunucu ayarlarına odaklanacağız.
Moodle ve Diğer LMS’ler: Performansı Asıl Ne Belirliyor?
Moodle gibi LMS’ler klasik bir blog sitesinden farklıdır. Basit sayfa görüntüleme yerine şu tip yüklerle uğraşırsınız:
- Onlarca – yüzlerce öğrencinin aynı anda sınava başlaması
- Büyük boyutlu PDF, video ve sunum dosyalarının aynı anda indirilmesi
- Sürekli çalışan cron görevleri (not hesaplama, raporlar, bildirim e-postaları)
- Yoğun veritabanı yazma trafiği (soru cevapları, loglar, oturum kayıtları)
Dolayısıyla performans için şu üç katmana özellikle dikkat etmelisiniz:
- PHP katmanı: PHP sürümü, PHP-FPM havuz ayarları, bellek ve zaman limitleri, OPcache.
- Veritabanı katmanı: MySQL/MariaDB/PostgreSQL yapılandırması, indeksler, bağlantı limiti, buffer boyutları.
- Önbellek katmanı: OPcache, Redis/Memcached, sayfa/nesne önbelleği, oturum (session) depolama.
Doğru tasarlanmış bir LMS hosting ortamında bu üç katman uyumlu çalışır. Örneğin PHP tarafında her istek hızlı çalışırken, veritabanı gereksiz yere şişmez, Redis oturum kilitlenmelerini azaltır, dosya sistemi de yedek ve güvenlik tarafında sorun çıkarmaz.
Doğru Altyapıyı Seçmek: paylaşımlı hosting mi, VPS mi, Dedicated mi?
Performans ayarlarına girmeden önce, altyapı tipini netleştirmek gerekiyor. Moodle ve LMS dünyasında genel rehber şu şekilde:
- Küçük ölçek (50–100 aktif kullanıcı, kurum içi kurslar): İyi yapılandırılmış bir VPS veya kaynakları güçlü bir paylaşımlı hosting iş görebilir.
- Orta ölçek (100–500 eşzamanlı kullanıcı, yoğun sınavlar): Önerimiz, en az 4 vCPU, 8–16 GB RAM, NVMe diskli bir VPS veya ayrılmış kaynaklı çözüm.
- Büyük ölçek (500+ eşzamanlı kullanıcı, kampüs ölçeği ya da ulusal projeler): Ayrı uygulama ve veritabanı sunucuları, ayrı Redis, hatta gerektiğinde dedicated sunucu ya da çoklu VPS mimarisi.
Özellikle paylaşımlı hosting kullanıyorsanız, cPanel tarafındaki CPU, IO, EP, RAM limitleri sık sık tavan yapabilir. Bu konuda detaylı sinyalleri cPanel kaynak limitleri ve ‘Resource Limit Reached’ hatası yazımızda anlatmıştık. Moodle gibi yoğun veritabanı ve PHP işlemi üreten uygulamalarda, genellikle bir noktadan sonra VPS’e geçmek kaçınılmaz hale geliyor.
Eğer hali hazırda paylaşımlı ortamda Moodle çalıştırıyorsanız ve limitlere sürekli çarpıyorsanız, paylaşımlı hosting’den VPS’e kesintisiz geçiş rehberimiz planlama sürecinde oldukça işinize yarayacaktır. DCHost tarafında biz, bu geçişleri mümkün olduğunca sıfır kesintiyle yönetmeye odaklanıyoruz.
PHP Katmanı: Moodle Performansının İlk Ayağı
Moodle ve çoğu açık kaynak LMS, PHP üzerinde çalışır. Bu nedenle PHP katmanındaki her yanlış ayar, doğrudan yanıt süresine ve eşzamanlı kullanıcı kapasitesine yansır.
PHP Sürümü Seçimi
Yeni Moodle sürümleri, PHP 8.x serisini hedefler. Genel tavsiyemiz:
- Desteklenen en güncel PHP 8.x sürümünü kullanın (örneğin 8.1 veya 8.2).
- Eski eklentiler sebebiyle daha düşük sürümde kalmanız gerekiyorsa, mutlaka test ortamı kurun.
PHP 8.x’e geçişte dikkat etmeniz gereken detayları, PHP 8.x yükseltme kontrol listesi yazımızda uygulamalı anlattık. Oradaki FPM ve OPcache prensipleri Moodle için de birebir geçerlidir.
PHP-FPM Havuz Ayarları: pm.max_children Nasıl Hesaplanır?
PHP-FPM, her isteği bir “çocuk process” ile işler. Moodle gibi sistemlerde en sık yapılan hata, ya çok düşük ya da çok yüksek pm.max_children değeri kullanmaktır. Basit bir hesaplama yapalım:
- Önce bir test yapın ve bir Moodle isteğinin ortalama RAM tüketimini ölçün (örn. 60–80 MB).
- Sunucudaki toplam RAM’den (örneğin 8 GB) işletim sistemi, veritabanı ve Redis için pay ayırın (örn. 3–4 GB).
- Kalan RAM’i tek bir PHP sürecinin ortalama tüketimine bölün.
Örneğin:
Toplam RAM: 8 GB
OS + DB + Redis: 3 GB
PHP için kalan: 5 GB ≈ 5120 MB
Bir PHP süreci ortalama: 80 MB
pm.max_children ≈ 5120 / 80 ≈ 64
Sonuç olarak tipik bir ayar:
[moodle]
user = www-data
group = www-data
listen = /run/php/php-fpm-moodle.sock
pm = dynamic
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 500
pm.max_requests değerini 300–1000 aralığında tutmak, hafıza sızıntılarına karşı sürecin zaman zaman yenilenmesini sağlar.
php.ini Limitleri: memory_limit, max_execution_time, upload_max_filesize
Moodle’da özellikle dosya yükleme ve yedek alma işlemleri için PHP limitlerini gerçekçi değerlerde tutmalısınız:
- memory_limit: En az
256M, mümkünse512M. Çok modüllü, yoğun eklentili ortamlarda daha yüksek gerekebilir. - max_execution_time: Normal sayfa istekleri için 60 sn yeterli, ancak yedek alma / büyük raporlar için komut satırı betiklerinde daha yüksek olabilir.
- upload_max_filesize ve post_max_size: Derslerde ne kadar büyük dosyaya izin verecekseniz (örneğin 200 MB video), bu limitleri ona göre ayarlayın.
memory_limit = 512M
max_execution_time = 60
max_input_time = 60
upload_max_filesize = 200M
post_max_size = 200M
OPcache Ayarları: PHP Kodunu Sıkıştırılmış Gibi Hızlandırmak
OPcache, PHP dosyalarını derlenmiş halde bellekte tutar. LMS ortamında CPU tüketimini ciddi şekilde azaltır. Örnek bir ayar seti:
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 60
Moodle kod tabanı oldukça geniş olduğundan opcache.memory_consumption’ı 128M yerine 192–256M seviyelerinde tutmak, cache miss oranını ciddi biçimde düşürür.
Veritabanı Katmanı: MySQL/MariaDB/PostgreSQL Ayarları
LMS’lerde asıl darboğaz çoğu zaman PHP değil, veritabanıdır. Özellikle sınav dönemlerinde:
- Her soru kaydı, her cevap, her log satırı veritabanına yazılır.
- Eşzamanlı kullanıcı sayısı arttıkça, bağlantı sayısı ve kilitlenmeler (lock) artar.
Bu nedenle veritabanı sunucusunu hem kaynak hem de konfigürasyon</strong tarafında iyi ayarlamak zorundasınız.
InnoDB ve Karakter Seti Seçimi
MySQL/MariaDB tarafında Moodle için mutlaka InnoDB motorunu kullanın. Tablo motorlarını karışık kullanmak (MyISAM + InnoDB) kilit yönetimi ve çökme sonrası kurtarma süreçlerini zorlaştırır.
Karakter seti için önerimiz:
- utf8mb4 (tam Unicode desteği, emoji dâhil)
- Sıralama (collation) olarak
utf8mb4_unicode_civeya yeni sürümlerdeutf8mb4_0900_ai_ci
Temel MySQL/MariaDB Tuning Parametreleri
Detaylı bir veritabanı tuning rehberi için MySQL/InnoDB tuning kontrol listemizden yararlanabilirsiniz. Moodle senaryosu için özetle şu parametreler kritik:
- innodb_buffer_pool_size: Sunucu RAM’inin %50–70’i (sadece DB sunucusuysa). Örneğin 8 GB RAM’li DB için 4–5 GB.
- innodb_log_file_size: Yoğun yazma yapan sistemlerde 512M–1G seviyeleri mantıklı.
- max_connections: PHP-FPM’deki maksimum çocuk process sayısını (~50–100) biraz üzerinde tutun (örneğin 150–200).
- query_cache: Yeni MySQL sürümlerinde kaldırıldı, varsa devre dışı bırakın.
[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_file_size = 1G
max_connections = 200
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
sql_mode = STRICT_ALL_TABLES
Slow Query Log ve İndeksleme
Moodle, modül ve eklenti yapısı gereği bazen karmaşık SQL sorguları üretebilir. Özellikle raporlama ve log tablolarında, doğru indeksler yoksa sorgu süreleri saniyeleri bulabilir.
- slow_query_log’u aktif edin, 1 saniyeden uzun süren sorguları kaydedin.
- Düzenli aralıklarla slow query logunu analiz ederek, eksik indeksleri ekleyin.
- En hızlı büyüyen tabloları (örneğin loglar, quiz_attempts) periyodik bakımda gözden geçirin.
Veri hacmi büyüdükçe, yedekleme stratejiniz de kritik hale gelir. Bu konuda MySQL/MariaDB yedekleme stratejileri rehberimiz LMS veritabanları için de doğrudan uygulanabilir.
Önbellek Katmanı: Redis, OPcache ve Sayfa Önbelleği
Önbellekleme, Moodle performansını 2–3 kat iyileştirebilecek kadar güçlü bir araçtır. Doğru kurgulandığında hem veritabanı yükünü azaltır hem de PHP tarafındaki yanıt süresini düşürür.
OPcache: Kod Seviyesinde Önbellek
OPcache ayarlarını yukarıda anlattık; burada vurgulamak gereken nokta şu: Moodle çekirdeği ve eklentileri sık güncellenmiyorsa, opcache.revalidate_freq değerini 60–120 saniye gibi daha yüksek tutabilir, böylece her istekte dosyaları kontrol etme maliyetini düşürebilirsiniz.
Redis / Memcached: Nesne Önbelleği ve Session Depolama
Moodle, Redis’i hem cache hem de session store olarak kullanabilecek şekilde yapılandırılabilir. Bizim saha deneyimimiz, özellikle sınav dönemlerinde Redis’in:
- Veritabanı bağlantı yükünü ciddi biçimde azalttığı,
- Oturum kilitlenmelerini (session locking) minimize ettiği,
- Yanıt sürelerinde gözle görülür bir düşüş sağladığı
yönünde. Redis’in temelleri ve performansa etkisi için Redis cache’in hosting performansını nasıl artırdığını anlattığımız rehbere göz atabilirsiniz.
Tipik bir Moodle Redis yapılandırmasında:
- Redis, ayrı bir servis (mümkünse ayrı sunucu) olarak çalışır.
- Session’lar Redis’e taşınır, böylece PHP-FPM process’leri arası çakışmalar azalır.
Session’ları Redis’e Taşımak
PHP tarafında session handler olarak Redis kullanmak için:
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?database=2&prefix=moodle_sess_"
Bu sayede:
- NFS veya ortak dosya sistemine bağlı kalmazsınız.
- Session verileri RAM’de tutulduğu için okuma/yazma gecikmesi düşer.
Tam Sayfa Önbelleği ve CDN Kullanımı
Moodle gibi LMS’lerde tüm sayfaları agresif şekilde cache’lemek mümkün değildir; çünkü kullanıcıya özel içerikler, sınav durumları, sonuçlar gibi dinamik bölümler yoğundur. Yine de:
- Statik dosyalar (CSS, JS, resimler) için CDN kullanmak,
- Ders içeriği gibi sık değişmeyen sayfalar için kısa süreli (
stale-while-revalidatemantığında) önbellek
hem TTFB’yi hem de bant genişliği tüketimini önemli ölçüde azaltabilir. CDN tarafındaki maliyet ve performans dengesine ilgi duyuyorsanız, CDN trafik maliyetlerini kontrol altına alma rehberimize de göz atabilirsiniz.
Moodle’ı klasik bir içerik sitesinden ayıran en kritik farklar, yoğun eşzamanlı kullanım anları ve arka planda çalışan cron görevleridir.
Eşzamanlı Kullanıcı Hesabı: Kaç vCPU, Kaç GB RAM?
Kaba ama pratik bir kural seti:
- Hafif kullanım (sadece içerik görüntüleme, az sayıda quiz): 2 vCPU, 4 GB RAM ile ~50 eşzamanlı kullanıcı.
- Orta kullanım (düzenli quiz, ödev yükleme): 4 vCPU, 8 GB RAM ile 100–200 eşzamanlı kullanıcı.
- Ağır kullanım (büyük kampüs, sınav haftası): 8+ vCPU, 16+ GB RAM, ayrı veritabanı ve Redis.
Burada “eşzamanlı kullanıcı”yı, aynı 1–2 dakika içinde aktif işlem yapan kullanıcılar olarak düşünmek gerekir; toplam kayıtlı kullanıcı değil.
Cron Görevleri: Sakince Ama Güçlü Çalışmalı
Moodle’ın cron sistemi; not hesaplama, rapor üretme, yedek alma ve bildirim e-postaları gibi işlemleri yürütür. Tavsiyelerimiz:
- Cron’u gerçek cron ile tetikleyin, web trafiğine bırakmayın.
- Her dakikada bir çalışan bir cron girdisi kullanın:
* * * * * /usr/bin/php /var/www/moodle/admin/cli/cron.php >/dev/null 2>&1
Eğer cron görevleri sayfa istekleriyle aynı anda yoğun kaynak tüketiyorsa, ayrı bir VPS veya en azından düşük öncelikli (nice değeri yüksek) bir process olarak çalıştırmayı düşünebilirsiniz.
Dosya Depolama: Yerel Disk, NFS, Object Storage
Moodle’da ders dosyaları hızla yüzlerce GB’a çıkabilir. Burada üç temel yaklaşım var:
- Yerel NVMe disk: Küçük/orta ölçekli LMS’ler için en basit ve performanslı çözüm.
- NFS paylaşımlı depolama: Çoklu uygulama sunucusunun aynı dosya alanını kullanması gerektiğinde devreye girer, fakat yanlış kurulumda gecikme ve kilit problemleri doğurabilir.
- Object storage (S3 uyumlu): Çok büyük arşivler için idealdir; dosyalar farklı bir depoda, uygulama sunucusundan ayrık tutulur.
Object storage ve S3 uyumlu depolama tasarlarken dikkat edilmesi gerekenleri object vs block vs file storage rehberimizde detaylı anlatıyoruz. Moodle dosya alanınızı büyütmeden önce bu yazıya da göz atmanızı öneririz.
Güvenlik ve İlk Gün Ayarları
Performans kadar önemli bir diğer konu da güvenlik. Özellikle öğrencilerin kişisel verileri, sınav soruları ve notlar söz konusu olduğunda, tek bir zafiyet çok büyük sorunlara yol açabilir. Yeni bir Moodle/LMS kurarken, ilk günden yapılması gereken hosting güvenlik ayarları kontrol listemizi adım adım uygulamanız, hem performansı koruyacak hem de saldırı yüzeyini minimize edecektir.
DCHost ile Moodle ve LMS Mimarisi Kurarken Yol Haritası
Şimdiye kadar anlattıklarımızı pratik bir yol haritasına dökelim. DCHost üzerinde tipik bir Moodle/LMS ortamını kurgularken şu adımları izlemeyi öneriyoruz:
1. Doğru Sunucu Tipini Seçin
- Başlangıç / Pilot ortam: 2–4 vCPU, 4–8 GB RAM, NVMe diskli bir VPS.
- Canlı kurum içi kullanım: 4–8 vCPU, 8–16 GB RAM, ayrı veritabanı VPS’i veya güçlü tek VPS.
- Büyük kurum / üniversite: Ayrı uygulama, veritabanı ve Redis sunucuları; isteğe bağlı olarak object storage entegrasyonu.
2. PHP Katmanını LMS’e Göre Optimize Edin
- PHP 8.x sürümünü kullanın, FPM havuz ayarlarını ölçüm yaparak belirleyin.
- OPcache’i en az 128–256 MB bellekle etkinleştirin.
memory_limit,upload_max_filesizevemax_execution_timedeğerlerini ders içeriklerinize göre ayarlayın.
PHP tarafındaki genel optimizasyon prensipleri için, PHP-FPM, OPcache ve Redis ile sunucu tarafı optimizasyon rehberimizi Moodle açısından da referans olarak kullanabilirsiniz.
3. Veritabanını Gerçekçi Yük İçin Hazırlayın
- MySQL/MariaDB’de InnoDB ve utf8mb4 kullanın.
- Veri hacmine göre
innodb_buffer_pool_size’ı RAM’in %50–70’i seviyesine getirin. - Slow query logu açarak düzenli indeksleme ve sorgu iyileştirmesi yapın.
- Yedeklemeyi otomatikleştirip, geri dönüş testlerini ihmal etmeyin.
4. Redis ile Önbellek ve Session Yönetimini Güçlendirin
- Redis’i ayrı bir servis veya VPS olarak konumlandırın.
- PHP session’larını Redis’e taşıyın, Moodle’ın cache store’larını Redis’e yönlendirin.
- Alarm ve izleme kurarak Redis’in bellek kullanımını ve gecikmesini takip edin.
5. İzleme, Loglama ve Kapasite Planlama
Performansı “hissetmek” yetmez, ölçmek gerekir. Özellikle:
- CPU, RAM, disk IO, ağ trafiği grafikleri
- Veritabanı bağlantı sayısı ve yavaş sorgu sayısı
- PHP-FPM havuzundaki bekleyen istek (queue) durumu
gibi metrikleri düzenli takip ederek, bir sonraki sınav dönemi öncesinde kapasite arttırma kararlarını veriyle verebilirsiniz.
Özet ve Son Tavsiyeler
Moodle ve diğer LMS’ler için performans denince akla genellikle “daha fazla RAM, daha çok CPU” geliyor. Ancak DCHost tarafında yüzlerce proje deneyiminden biliyoruz ki, çoğu zaman asıl farkı yaratan doğru PHP, veritabanı ve önbellek ayarlarıdır. PHP-FPM havuzunu gerçek yük testlerine göre ayarlamak, OPcache’i yeterli bellekle çalıştırmak, MySQL/MariaDB tarafında InnoDB ve buffer pool’u doğru boyutlandırmak ve mutlaka Redis ile oturum/nesne önbelleği kullanmak; aynı donanımda 2–3 kat daha fazla eşzamanlı kullanıcıyı sorunsuz şekilde taşımanıza imkân verir.
Bir sonraki sınav döneminde “site açılmıyor” paniğini yaşamamak için, bu rehberdeki ayarları adım adım uygulayıp, üzerine kendi kurumunuzun kullanıcı alışkanlıklarına göre ufak ince ayarlar yapmanızı öneriyoruz. Eğer hangi noktadan başlamanız gerektiği konusunda kararsızsanız, ortamınızı birlikte gözden geçirip DCHost VPS, dedicated sunucu veya colocation çözümlerimizden hangisinin sizin senaryonuza en uygun olduğunu beraber netleştirebiliriz.
Doğru yapılandırılmış bir Moodle/LMS ortamı, sadece hızlı ve stabil çalışmakla kalmaz; aynı zamanda sürdürülebilir maliyet, güçlü güvenlik ve kolay yönetim sağlar. Altyapıyı bir kez sağlam kurduğunuzda, enerjinizi öğrencilerinize ve içerik kalitesine ayırmak çok daha kolay hale gelir.
