Komutları üretim sunucusunda çalıştırmadan önce yedek alın ve mümkünse bir test ortamında deneyin. Yönetim erişiminizi (SSH, panel) kaybetmemek için ayar değişikliklerinde açık bir ikinci oturum bulundurun.
Bu rehberde ne yapacağız?
Web sitesi performansının büyük kısmı üç basit ayara bağlıdır: PHP kodunun her istekte yeniden derlenmemesi (OPcache), aktarılan verinin sıkıştırılması (gzip ve brotli) ve tarayıcının değişmeyen dosyaları yeniden indirmemesi (önbellek başlıkları). Bu rehberde üçünü de Nginx ve Apache için yapılandırıp etkisini komutlarla ölçeceğiz.
Rehber, kendi sunucusunda web sitesi yöneten veya müşterilerine hosting hizmeti veren sistem yöneticilerine hitap eder. Uygulama ve test yaklaşık 40-60 dakika sürer. Komutlar Debian/Ubuntu ve RHEL tabanlı (AlmaLinux, Rocky) sistemlerde çalışır; PHP yollarındaki SÜRÜM ifadesini kendi PHP sürümünüzle değiştirin.
Gereksinimler
- PHP-FPM ile çalışan bir Nginx veya Apache web sunucusu, sudo yetkili kullanıcı
- Üretimde HTTPS ile sunulan en az bir test sitesi (example.com örneğinde olduğu gibi)
- Başlıkları görmek için curl komutu
- Yapılandırma dosyaları için yedek alma alışkanlığı
Adım adım OPcache, sıkıştırma ve önbellek ayarları
1. Mevcut performans durumunu ölçün
Değişiklik yapmadan önce başlangıç değerlerini kaydedin ki iyileşmeyi gösterebilesiniz. curl ile toplam süre ve aktarılan boyutu görün.
curl -s -o /dev/null -w 'sure: %{time_total}s boyut: %{size_download} bayt\n' https://example.com/
curl -sI -H 'Accept-Encoding: gzip, br' https://example.com/ | grep -i -E 'content-encoding|cache-control|expires'content-encoding veya cache-control satırı yoksa ilgili özellik kapalıdır.
2. OPcache'i etkinleştirin ve ayarlayın
OPcache, PHP betiklerinin derlenmiş halini bellekte tutar. Çoğu dağıtımda PHP ile birlikte gelir, ancak etkin olduğundan emin olun. Ayarları ayrı bir ek dosyada tutmak paket güncellemelerinde güvenlidir: Debian için /etc/php/SÜRÜM/fpm/conf.d/90-opcache-ayar.ini, RHEL için /etc/php.d/90-opcache-ayar.ini.
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 2validate_timestamps açıkken PHP dosya değişikliklerini belirli aralıkla kontrol eder; sürüm yayınlarını kontrollü yaptığınız bir ortamda bunu 0 yapıp her dağıtım sonrası PHP-FPM'i yeniden yüklemek ek performans sağlar.
# Debian / Ubuntu
sudo php-fpmSÜRÜM -t && sudo systemctl reload phpSÜRÜM-fpm
# AlmaLinux / Rocky
sudo php-fpm -t && sudo systemctl reload php-fpm3. Nginx'te gzip ve brotli sıkıştırmasını açın
Metin tabanlı dosyalar (HTML, CSS, JavaScript, JSON, SVG) sıkıştırmadan büyük kazanç sağlar. Resimler (JPEG, PNG, WebP) zaten sıkıştırılmış olduğu için listeye eklenmez. Aşağıdaki dosyayı /etc/nginx/conf.d/sikistirma.conf olarak oluşturun.
gzip on;
gzip_vary on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_proxied any;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml image/svg+xml;Brotli, gzip'e göre genellikle daha küçük çıktı verir ama Nginx'te ek modül gerektirir. Dağıtımınızın deposunda hazır bir brotli modül paketi varsa onu kurun (Debian ve Ubuntu'da libnginx-mod-http-brotli-filter ve libnginx-mod-http-brotli-static adlarıyla bulunabilir); yoksa modülü kendiniz derlemek yerine gzip ile devam etmek bakım açısından daha güvenlidir. Modül yüklüyse aynı dosyaya şunu ekleyin:
brotli on;
brotli_comp_level 5;
brotli_types text/plain text/css text/xml application/json application/javascript application/xml image/svg+xml;sudo nginx -t && sudo systemctl reload nginx4. Apache'de mod_deflate ve mod_brotli kullanın
Apache'de gzip için mod_deflate, brotli için mod_brotli (Apache 2.4.26 ve üzerinde) kullanılır. Debian ve Ubuntu'da modülleri a2enmod ile açın; RHEL tabanlı sistemlerde httpd paketinde varsayılan olarak yüklü gelir, ayrıca bir şey etkinleştirmeniz gerekmez.
# Debian / Ubuntu
sudo a2enmod deflate brotli headers expiresArdından sıkıştırma kurallarını Debian'da /etc/apache2/conf-available/sikistirma.conf, RHEL'de /etc/httpd/conf.d/sikistirma.conf dosyasına yazın.
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/json application/javascript image/svg+xml
</IfModule>
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/css text/xml application/json application/javascript image/svg+xml
</IfModule># Debian / Ubuntu
sudo a2enconf sikistirma
sudo apachectl configtest && sudo systemctl reload apache2
# AlmaLinux / Rocky
sudo apachectl configtest && sudo systemctl reload httpd5. Statik dosyalar için önbellek başlıklarını ayarlayın
Dosya adında sürüm veya karma (hash) bulunan statik dosyalar uzun süre önbelleğe alınabilir. Adı sabit kalan dosyalar için ise kısa süre veya doğrulamalı önbellek kullanın; aksi halde ziyaretçiler eski dosyayı görebilir. Nginx için örnek:
location ~* \.(css|js|woff2|svg|webp|jpg|jpeg|png|gif|ico)$ {
expires 30d;
add_header Cache-Control public;
access_log off;
}Dosya adlarına sürüm eklemiyorsanız 30 gün yerine daha kısa bir süreyle başlayın. Dikkat: location içindeki add_header, üst bloklardaki add_header satırlarını (ör. HSTS) devre dışı bırakır; onları burada yeniden yazın veya bu satırı kaldırın (expires zaten Cache-Control ekler). Apache için eşdeğer ayar:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css A2592000
ExpiresByType application/javascript A2592000
ExpiresByType text/javascript A2592000
ExpiresByType image/webp A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType font/woff2 A2592000
</IfModule>Burada A2592000, erişimden itibaren 2592000 saniye (30 gün) anlamına gelir.
Doğrulama
Sıkıştırmanın çalıştığını curl ile doğrulayın. Gzip için:
curl -sI -H 'Accept-Encoding: gzip' https://example.com/ | grep -i content-encoding
curl -s -o /dev/null -w 'indirilen: %{size_download} bayt\n' -H 'Accept-Encoding: gzip' https://example.com/
curl -s -o /dev/null -w 'ham: %{size_download} bayt\n' https://example.com/Beklenen sonuç: content-encoding: gzip (veya brotli açıksa br) satırının görünmesi ve sıkıştırılmış boyutun ham boyuttan belirgin biçimde küçük olmasıdır. OPcache için FPM yapılandırmasını kontrol edin:
sudo php-fpmSÜRÜM -i | grep -E '^opcache\.(enable|memory_consumption|validate_timestamps)'RHEL tabanlı sistemlerde komut php-fpm -i biçimindedir. Beklenen sonuç: opcache.enable değerinin 1 olması ve belirlediğiniz bellek ayarlarının görünmesidir. Önbellek başlıkları için statik dosyada cache-control veya expires satırı görmelisiniz.
Sık karşılaşılan sorunlar
- Belirti: Sıkıştırma açık olduğu halde content-encoding görünmüyor. Çözüm: İstek başlığında Accept-Encoding gönderildiğinden, dosya türünün gzip_types listesinde olduğundan ve dosyanın gzip_min_length değerinden büyük olduğundan emin olun.
- Belirti: Kod güncellendi ama site eski sürümü gösteriyor. Çözüm: validate_timestamps kapalıysa dağıtım sonrası PHP-FPM'i yeniden yükleyin; açıksa revalidate_freq süresini bekleyin.
- Belirti: Statik dosya değişti ama ziyaretçiler eskisini görüyor. Çözüm: Dosya adına sürüm veya karma ekleyin ya da önbellek süresini kısaltın.
- Belirti: OPcache bellek yetersizliği nedeniyle performans düşüyor. Çözüm: memory_consumption ve max_accelerated_files değerlerini artırın, çok sayıda site varsa bunu toplam PHP dosya sayısına göre belirleyin.
Güvenlik ve bakım notları
- Sıkıştırmayı gizli bilgi içeren ve kullanıcıya özel dinamik yanıtlarda dikkatle kullanın; HTTPS üzerinde sıkıştırmanın BREACH benzeri saldırı sınıflarına açılabileceğini bilin ve CSRF belirteçlerini yanıt içinde rastgeleleştirin.
- Özel veya kullanıcıya bağlı sayfalarda Cache-Control: private veya no-store kullanın; paylaşımlı önbelleklerde hassas içeriğin saklanmasını önleyin.
- OPcache durum sayfalarını veya betiklerini internete açık bırakmayın; yapılandırma ve dosya yolları bilgisi sızdırabilir.
Sık sorulan sorular
Gzip mi brotli mi kullanmalıyım?
Brotli genellikle daha küçük çıktı verir, ancak modül gerektirir ve sıkıştırma maliyeti biraz daha yüksektir. Ortamınız destekliyorsa ikisini birlikte açmak en iyi sonucu verir; tarayıcı hangisini desteklerse ona göre yanıt alır, brotli yoksa gzip yeterlidir.
OPcache her zaman açık olmalı mı?
Üretim ortamında neredeyse her zaman evet. Geliştirme ortamında kod değişikliklerini anında görmek için validate_timestamps açık ve kısa revalidate_freq ile kullanılabilir; ancak OPcache'i tamamen kapatmak çoğu zaman gereksiz bir performans kaybıdır.
Önbellek başlıkları SEO'yu etkiler mi?
Doğrudan bir sıralama faktörü olarak değil, sayfa hızı ve kullanıcı deneyimi üzerinden dolaylı etkiler. Tekrar ziyaretlerde daha az veri indirilmesi sayfa yükleme süresini düşürür; bu da genel performans ölçümlerinize olumlu yansır.
İlgili sözlük terimleri
Bu kategorideki diğer rehberler
- MariaDB yavaş sorgu günlüğü ve temel optimizasyonMariaDB yavaş sorgu günlüğünü açın, yavaş sorguları dumpslow ile analiz edin, EXPLAIN ile indeks eksiklerini bulun ve temel optimizasyonla veritabanı yükünü güvenle azaltın.
- CDN veya ters vekil arkasında gerçek istemci IP adresini alma (Nginx ve Apache)CDN veya ters vekil arkasında Nginx ve Apache günlüklerinde, PHP ve güvenlik araçlarında gerçek istemci IP adresini görmek için realip ve remoteip modüllerini güvenli biçimde yapılandırın.
- php.ini güvenlik ayarlarıphp.ini güvenlik ayarlarını uygulayın: expose_php, disable_functions, open_basedir, hata gösterimi, oturum çerezleri ve dosya yükleme limitlerini PHP-FPM üzerinde güvenle sıkılaştırın.
- WordPress sertleştirme rehberi (hosting tarafından)WordPress sitelerini hosting tarafından sertleştirin: dosya izinleri, wp-config ayarları, yükleme dizininde PHP engeli, WP-CLI ile bütünlük kontrolü ve güncelleme düzeni.