Nginx ve PHP-FPM Havuzları ile Ubuntu 13.04 VPS Üzerinde Performans Optimizasyonu
Bir web uygulamasının performansı, kullanıcı deneyimi ve işletme başarısı için kritik öneme sahiptir. Özellikle sınırlı kaynaklara sahip bir Sanal Özel Sunucu (VPS) üzerinde çalışırken, her bir sistem kaynağının verimli kullanılması hayati hale gelir. Bu makale, Ubuntu 13.04 işletim sistemine sahip bir VPS üzerinde Nginx web sunucusu ve PHP-FPM (FastCGI Process Manager) havuzlarını kullanarak PHP tabanlı uygulamaların performansını nasıl optimize edebileceğinizi detaylı bir şekilde açıklayacaktır. Ubuntu 13.04 eski bir sürüm olsa da, burada açıklanan temel optimizasyon prensipleri modern sistemlerde de geçerliliğini korumaktadır. Amacımız, sunucunuzun daha fazla isteği daha hızlı ve daha güvenilir bir şekilde işleyebilmesini sağlamaktır.
Nginx, yüksek performanslı, hafif ve olay tabanlı mimarisi sayesinde Apache gibi geleneksel sunuculara göre daha az kaynak tüketerek daha fazla eşzamanlı bağlantıyı yönetebilen popüler bir web sunucusudur. PHP-FPM ise, PHP betiklerini Nginx gibi web sunucularıyla hızlı ve verimli bir şekilde iletişim kurmasını sağlayan bir FastCGI uygulamasıdır. Bu iki teknolojinin doğru yapılandırılması, PHP uygulamalarınızın hızını ve kararlılığını önemli ölçüde artırabilir.
Nginx Kurulumu ve Temel Yapılandırma
Nginx, hafif yapısı ve yüksek performansıyla modern web sunucularının vazgeçilmez bir bileşenidir. Ubuntu 13.04 üzerinde Nginx’i kurmak ve temel yapılandırmasını optimize etmek, performans yolculuğumuzun ilk adımıdır.
Ubuntu 13.04 Üzerine Nginx Kurulumu
Nginx’i Ubuntu 13.04’e kurmak oldukça basittir. Öncelikle paket listelerinizi güncellemeli ve ardından Nginx paketini yüklemelisiniz:
sudo apt-get update
sudo apt-get install nginx
Kurulum tamamlandıktan sonra Nginx servisi otomatik olarak başlayacaktır. Çalışıp çalışmadığını kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
sudo service nginx status
Eğer her şey yolundaysa, bir web tarayıcısından VPS’inizin IP adresini ziyaret ettiğinizde “Welcome to nginx!” mesajını görmelisiniz.
Nginx Temel Yapılandırma Dosyası (nginx.conf) Optimizasyonu
Nginx’in ana yapılandırma dosyası /etc/nginx/nginx.conf adresinde bulunur. Bu dosyada yapacağımız bazı değişiklikler, sunucunuzun kaynakları daha verimli kullanmasını sağlayacaktır.
# /etc/nginx/nginx.conf dosyasından örnekler ve açıklamalar
user www-data; # Nginx'in hangi kullanıcı ve grup altında çalışacağını belirler. Güvenlik için önemlidir.
worker_processes auto; # İşçi süreçlerinin sayısı. 'auto' genellikle CPU çekirdek sayınıza eşittir.
# Yüksek trafikli siteler için CPU çekirdek sayısına eşit veya 2 katı olarak ayarlanabilir.
# Her işçi süreci kendi başına bağımsızdır ve eşzamanlı bağlantıları işler.
pid /run/nginx.pid; # Nginx'in ana süreç kimliğini (PID) tuttuğu dosya.
events {
worker_connections 1024; # Her bir işçi sürecinin aynı anda işleyebileceği maksimum bağlantı sayısı.
# Bu değer, sunucunun dosya tanımlayıcı (file descriptor) limitine (ulimit -n) bağlıdır.
# Örneğin, ulimit -n 65535 ise, worker_connections 1024 * worker_processes
# toplam bağlantı kapasitesini belirler.
multi_accept on; # Yeni bağlantıları kabul etmek için bir işçi sürecinin aynı anda birden fazla bağlantı
# kabul etmesini sağlar. Yüksek trafikli sunucular için faydalıdır.
use epoll; # Linux sistemler için en verimli olay işleme yöntemidir. FreeBSD için kqueue, Solaris için /dev/poll.
}
http {
## Temel Ayarlar ##
sendfile on; # Doğrudan çekirdekten dosya göndermeyi etkinleştirir. Diskten ağa veri kopyalama sürecini hızlandırır.
tcp_nopush on; # sendfile ile birlikte kullanıldığında, TCP paketlerini doldurarak ağ verimliliğini artırır.
tcp_nodelay on; # TCP gecikmesini azaltır, küçük veri paketlerinin hemen gönderilmesini sağlar.
keepalive_timeout 65; # Kalıcı bağlantıların ne kadar süre açık kalacağını belirler. Daha yüksek değerler
# daha az bağlantı kurulumu, ancak daha fazla kaynak tüketimi anlamına gelebilir.
types_hash_max_size 2048; # MIME tiplerinin hash tablosu boyutu.
server_tokens off; # Nginx sürüm numarasını hata sayfalarında ve HTTP başlıklarında gizler. Güvenlik için önemlidir.
## Günlükleme Ayarları ##
# access_log /var/log/nginx/access.log; # Erişim günlüklerini kaydeder. Yüksek trafikli sitelerde
# disk G/Ç'sini azaltmak için kapatılabilir veya farklı bir sunucuya gönderilebilir.
error_log /var/log/nginx/error.log warn; # Hata günlüklerini kaydeder. 'warn' seviyesi, sadece uyarı ve üzeri
# hataları kaydeder. 'error' veya 'crit' seviyeleri daha az detay kaydeder.
## Gzip Sıkıştırma ##
gzip on; # Gzip sıkıştırmayı etkinleştirir. Bant genişliğini azaltır ve yükleme sürelerini iyileştirir.
gzip_vary on; # Proxy sunucularının sıkıştırılmış ve sıkıştırılmamış içerikleri önbelleğe almasını sağlar.
gzip_proxied any; # Tüm proxy isteği türleri için gzip sıkıştırmayı etkinleştirir.
gzip_comp_level 6; # Sıkıştırma seviyesi (1-9). 6 genellikle iyi bir denge sunar.
gzip_buffers 16 8k; # Sıkıştırma için kullanılan tampon sayısı ve boyutu.
gzip_http_version 1.1; # Hangi HTTP protokolü versiyonları için gzip'in etkin olacağını belirler.
gzip_min_length 256; # Sıkıştırılacak minimum yanıt boyutu. Çok küçük dosyaları sıkıştırmak maliyetli olabilir.
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# Sıkıştırılacak MIME türleri.
## Önbellekleme ##
# statik dosyalar için tarayıcı önbelleklemesi
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml|html)$ {
expires 30d; # Bu dosya türlerinin tarayıcıda 30 gün boyunca önbelleğe alınmasını sağlar.
log_not_found off; # Bulunamayan statik dosyalar için hata günlüğü kaydını kapatır.
}
## Diğer Ayarlar ##
client_max_body_size 100M; # İstemciden gelen maksimum istek gövdesi boyutu (örneğin dosya yüklemeleri için).
# client_body_buffer_size 128k; # İstemci isteği gövdesi için tampon boyutu.
# client_header_buffer_size 1k; # İstemci başlığı için tampon boyutu.
# large_client_header_buffers 4 8k; # Büyük istemci başlıkları için tampon sayısı ve boyutu.
include /etc/nginx/conf.d/*.conf; # Ek yapılandırma dosyalarını dahil eder.
include /etc/nginx/sites-enabled/*; # Sanal host yapılandırmalarını dahil eder.
}
Değişiklikleri yaptıktan sonra Nginx yapılandırmasını test etmeyi ve servisi yeniden başlatmayı unutmayın:
sudo nginx -t
sudo service nginx restart
PHP-FPM Kurulumu ve Detaylı Havuz Yapılandırması
PHP-FPM, PHP betiklerinin Nginx ile verimli bir şekilde iletişim kurmasını sağlayan kritik bir bileşendir. Doğru yapılandırılmış PHP-FPM havuzları, uygulamanızın performansını ve kararlılığını doğrudan etkiler.
PHP-FPM Kurulumu
Ubuntu 13.04 üzerinde PHP 5 ve PHP-FPM’i kurmak için aşağıdaki komutları kullanabilirsiniz:
sudo apt-get install php5-fpm php5-cli
Kurulum tamamlandıktan sonra PHP-FPM servisi otomatik olarak başlayacaktır. Durumunu kontrol etmek için:
sudo service php5-fpm status
php.ini Optimizasyonu
PHP’nin ana yapılandırma dosyası olan php.ini (genellikle /etc/php5/fpm/php.ini adresinde bulunur), PHP betiklerinin çalışma şeklini belirler. Performans ve güvenlik için bazı önemli ayarlar:
; /etc/php5/fpm/php.ini dosyasından örnekler
memory_limit = 128M ; Bir betiğin kullanabileceği maksimum bellek miktarı.
; Uygulamanızın ihtiyacına göre artırılabilir (örn. 256M, 512M).
; Ancak, çok yüksek değerler bellek tükenmesine yol açabilir.
max_execution_time = 30 ; Bir betiğin çalışmasına izin verilen maksimum süre (saniye).
; Uzun süren işlemler için bu değeri artırmanız gerekebilir.
; Ancak, sonsuz döngüleri önlemek için dikkatli olun.
upload_max_filesize = 20M ; İzin verilen maksimum dosya yükleme boyutu.
post_max_size = 20M ; HTTP POST ile gönderilebilecek maksimum veri boyutu.
; upload_max_filesize değerinden büyük veya ona eşit olmalıdır.
date.timezone = Europe/Istanbul ; PHP'nin kullanacağı zaman dilimi. Performans değil,
; ancak doğru tarih/saat işlemleri için önemlidir.
; OPcache (PHP 5.5+ ile gelir, 13.04'te manuel kurulum gerekebilir veya APC kullanılabilir)
; Eğer yüklüyse, opcode önbellekleme performansı büyük ölçüde artırır.
; php5-opcache paketini yüklemeniz gerekebilir: sudo apt-get install php5-opcache
; [opcache]
; opcache.enable=1
; opcache.memory_consumption=128 ; Önbellek için ayrılan bellek (MB).
; opcache.interned_strings_buffer=8 ; Dahili dizeler için bellek (MB).
; opcache.max_accelerated_files=4000 ; Önbelleğe alınabilecek maksimum dosya sayısı.
; opcache.revalidate_freq=60 ; Dosya değişikliklerini kontrol etme sıklığı (saniye).
; opcache.fast_shutdown=1 ; Hızlı kapanma modunu etkinleştirir.
; Güvenlik
cgi.fix_pathinfo=0 ; ÇOK ÖNEMLİ! Bu ayar, Nginx ile PHP-FPM kullanırken güvenlik açığını önler.
; Nginx'in fastcgi_param SCRIPT_FILENAME ayarıyla birlikte kullanılmalıdır.
; 0 olarak ayarlanması, Nginx'in PHP betiklerini yorumlama şeklini düzeltir
; ve zararlı URL'lerin çalıştırılmasını engeller.
realpath_cache_size = 32M ; Gerçek yol önbelleği boyutu. Özellikle çok sayıda dosya içeren
; uygulamalar (örn. CMS'ler) için performansı artırır.
realpath_cache_ttl = 3600 ; Gerçek yol önbelleği girişlerinin ömrü (saniye).
php.ini dosyasında yaptığınız değişikliklerin geçerli olması için PHP-FPM servisini yeniden başlatmalısınız:
sudo service php5-fpm restart
PHP-FPM Havuz Yapılandırması (www.conf) ve Performans Ayarları
PHP-FPM, farklı uygulamalar veya kullanıcılar için ayrı havuzlar oluşturmanıza olanak tanır. Ana havuz yapılandırma dosyası genellikle /etc/php5/fpm/pool.d/www.conf adresindedir. Bu dosyadaki ayarlar, PHP-FPM süreçlerinin nasıl yönetileceğini belirler.
; /etc/php5/fpm/pool.d/www.conf dosyasından örnekler
[www] ; Havuz adı
user = www-data ; PHP süreçlerinin çalışacağı kullanıcı.
group = www-data ; PHP süreçlerinin çalışacağı grup.
; Nginx ile PHP-FPM arasındaki iletişim yöntemi.
; Unix soketleri (unix:/var/run/php5-fpm.sock) TCP soketlerine (127.0.0.1:9000) göre
; daha az overhead'e sahiptir ve yerel iletişim için daha hızlıdır.
listen = /var/run/php5-fpm.sock
; Soket izinleri. Nginx'in bu sokete erişebilmesi için doğru ayarlanmalıdır.
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; Süreç yöneticisi (Process Manager) ayarları. Bu, en kritik optimizasyon noktalarından biridir.
; pm = dynamic: Süreçler dinamik olarak oluşturulur ve sonlandırılır.
; Bellek tasarrufu sağlar, ancak yeni isteklerde hafif gecikme yaşanabilir.
; pm = static: Sabit sayıda süreç her zaman çalışır.
; Daha hızlı yanıt süreleri, ancak daha fazla bellek tüketimi.
; pm = ondemand: Süreçler sadece istek geldiğinde oluşturulur ve belirli bir süre boşta kaldıktan sonra sonlandırılır.
; En çok bellek tasarrufu sağlar, ancak en yüksek gecikmeye sahip olabilir.
; Çoğu VPS için 'dynamic' iyi bir başlangıç noktasıdır. Yüksek trafikli sunucular veya
; sürekli yüksek yük altında çalışan uygulamalar için 'static' daha iyi olabilir.
pm = dynamic
pm.max_children = 50 ; Maksimum çocuk (child) süreci sayısı.
; Bu değer, sunucunuzun RAM'ine ve PHP betiklerinizin bellek tüketimine bağlıdır.
; Hesaplama: (Toplam RAM - Nginx/DB/OS RAM) / (Ortalama PHP süreci belleği)
; Örneğin, 1GB RAM'iniz varsa ve PHP süreci ortalama 30MB kullanıyorsa:
; (1024MB - 200MB) / 30MB = ~27. Max çocuk sayısını buna göre ayarlayın.
; Çok yüksek bir değer, sunucunuzun belleğinin tükenmesine yol açabilir.
pm.start_servers = 5 ; PHP-FPM başladığında oluşturulacak çocuk süreci sayısı.
pm.min_spare_servers = 5 ; Boşta bekleyen minimum çocuk süreci sayısı.
pm.max_spare_servers = 35 ; Boşta bekleyen maksimum çocuk süreci sayısı.
; min_spare_servers ve max_spare_servers arasındaki fark,
; yük değişimlerine uyum sağlamak için PHP-FPM'in esnekliğini belirler.
; max_spare_servers, max_children değerinden küçük olmalıdır.
; Süreç başına maksimum istek. Belirli sayıda istekten sonra süreçleri yeniden başlatır.
; Bellek sızıntılarını önlemeye yardımcı olabilir.
pm.max_requests = 500
; Bir betiğin çalışmasına izin verilen maksimum süre. Bu süre aşıldığında betik sonlandırılır.
; php.ini'deki max_execution_time'a benzer, ancak FPM seviyesinde uygulanır.
request_terminate_timeout = 30s
; Yavaş betiklerin günlüğe kaydedilmesi için eşik süresi.
; Bu süreyi aşan betikler slow log dosyasına kaydedilir ve performans sorunlarını tespit etmeye yardımcı olur.
request_slowlog_timeout = 5s
slowlog = /var/log/php5-fpm-slow.log
; PHP betiklerinin çalışacağı kök dizin. Güvenlik için önemlidir.
; open_basedir = /var/www/html/:/tmp/
; Ortam değişkenlerini ayarlayabilirsiniz.
; env[HOSTNAME] = $HOSTNAME
; env[PATH] = /usr/local/bin:/usr/bin:/bin
; env[TMP] = /tmp
; env[TMPDIR] = /tmp
; env[TEMP] = /tmp
Değişiklikleri kaydettikten sonra PHP-FPM servisini yeniden başlatın:
sudo service php5-fpm restart
Nginx ve PHP-FPM Entegrasyonu ve Sanal Host Yapılandırması
Nginx’in PHP-FPM ile doğru şekilde iletişim kurması için sanal host (server block) yapılandırmasında özel ayarlar yapılması gerekir.
Nginx Sanal Host Yapılandırması
Web sitenizin yapılandırma dosyası genellikle /etc/nginx/sites-available/default veya /etc/nginx/sites-available/your_site_name.conf adresinde bulunur. Yeni bir site için bir dosya oluşturup sites-enabled dizinine symlink oluşturmanız önerilir.
# /etc/nginx/sites-available/your_site_name.conf dosyasından örnek
server {
listen 80; # HTTP isteklerini dinler.
listen [::]:80; # IPv6 isteklerini dinler.
server_name your_domain.com www.your_domain.com; # Alan adınızı buraya yazın.
root /var/www/html/your_site_folder; # Web sitenizin kök dizini.
index index.php index.html index.htm; # Varsayılan dizin dosyaları.
# Nginx'in önbellekleme ve güvenlik için statik dosyaları nasıl işleyeceğini belirler.
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml|html)$ {
expires 30d; # Tarayıcı önbelleklemesi için.
log_not_found off;
}
# Ana dizin ve alt dizinler için PHP betiklerini işler.
location / {
try_files $uri $uri/ =404; # Eğer dosya veya dizin bulunamazsa 404 döndürür.
# PHP tabanlı CMS'ler (WordPress, Joomla) için
# try_files $uri $uri/ /index.php?$args; kullanılabilir.
}
# PHP dosyalarını PHP-FPM'e iletmek için yapılandırma.
location ~ \.php$ {
include snippets/fastcgi-php.conf; # Genellikle Ubuntu'da bulunan standart bir yapılandırma dosyası.
# Alternatif olarak aşağıdaki satırları doğrudan yazabilirsiniz.
# Eğer snippets/fastcgi-php.conf kullanmıyorsanız, bu satırları ekleyin:
fastcgi_pass unix:/var/run/php5-fpm.sock; # PHP-FPM ile iletişim için Unix soketi kullanır.
# Eğer PHP-FPM TCP portunda dinliyorsa: fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; # FastCGI parametrelerini içerir.
}
# Güvenlik: .ht* dosyalarına erişimi engeller.
location ~ /\.ht {
deny all;
}
# Log dosyaları (isteğe bağlı, genel nginx.conf'ta da ayarlanabilir)
access_log /var/log/nginx/your_site_access.log;
error_log /var/log/nginx/your_site_error.log warn;
}
Yeni yapılandırmayı etkinleştirmek için bir sembolik bağlantı oluşturun ve Nginx’i yeniden yükleyin:
sudo ln -s /etc/nginx/sites-available/your_site_name.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo service nginx reload
Güvenlik İpuçları
* cgi.fix_pathinfo=0: php.ini dosyasında bu ayarın 0 olduğundan emin olun. Bu, Nginx’in SCRIPT_FILENAME parametresini doğru bir şekilde işlemesini sağlayarak, zararlı kullanıcıların /.php/malicious.jpg gibi URL’ler aracılığıyla PHP betiklerini çalıştırmasını engeller.
* fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;: Nginx yapılandırmanızda bu parametrenin doğru şekilde ayarlandığından emin olun. Bu, PHP-FPM’e hangi betiği çalıştırması gerektiğini kesin olarak bildirir.
* Kullanıcı ve İzinler: Nginx ve PHP-FPM’in www-data gibi ayrıcalıksız bir kullanıcı altında çalıştığından emin olun. Web kök dizininizin (örneğin /var/www/html/your_site_folder) doğru izinlere sahip olduğundan (Nginx kullanıcısının okuma, PHP-FPM kullanıcısının yazma izinleri) emin olun.
Ek Optimizasyon Teknikleri
Nginx ve PHP-FPM’i yapılandırmak önemli bir adımdır, ancak daha kapsamlı bir performans artışı için ek teknikler de uygulanabilir.
Önbellekleme (Caching) Stratejileri
Önbellekleme, performansı artırmanın ve sunucu yükünü azaltmanın en etkili yollarından biridir.
* PHP Opcode Önbellekleme (OPcache / APC): PHP betikleri her istekte yorumlanır. Opcode önbellekleyiciler (PHP 5.5+ ile OPcache, daha eski sürümler için APC), betiklerin derlenmiş “opcode” formunu bellekte saklayarak tekrar derleme ihtiyacını ortadan kaldırır. Bu, PHP işleme süresini önemli ölçüde azaltır. php.ini bölümünde bahsedilen OPcache ayarlarını kontrol edin.
* Nginx FastCGI Önbelleği: Nginx, PHP-FPM’den gelen tam yanıtları (HTML çıktısı gibi) önbelleğe alabilir. Bu, belirli bir URL için aynı içeriğin defalarca PHP tarafından işlenmesini önler. Özellikle statik veya nadiren değişen sayfalar için çok etkilidir.
# nginx.conf veya server bloğunuzda
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# PHP location bloğunuzda
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_cache my_cache; # Tanımladığınız önbelleği kullanır.
fastcgi_cache_valid 200 30m; # 200 durum kodlu yanıtları 30 dakika önbelleğe alır.
fastcgi_cache_valid 404 1m; # 404 durum kodlu yanıtları 1 dakika önbelleğe alır.
fastcgi_cache_bypass $http_pragma $http_authorization; # Belirli başlıklar varsa önbelleği atla.
fastcgi_no_cache $http_pragma $http_authorization; # Belirli başlıklar varsa önbelleğe alma.
add_header X-FastCGI-Cache $upstream_cache_status; # Önbellek durumunu HTTP başlığına ekler.
}
Bu ayarları kullanmadan önce /var/cache/nginx/fastcgi_cache dizinini oluşturmanız ve Nginx kullanıcısına yazma izinleri vermeniz gerekebilir: sudo mkdir -p /var/cache/nginx/fastcgi_cache && sudo chown www-data:www-data /var/cache/nginx/fastcgi_cache.
* Tarayıcı Önbellekleme: Statik dosyalar (CSS, JS, resimler) için Nginx’te expires başlıklarını kullanarak tarayıcıların bu dosyaları belirli bir süre önbelleğe almasını sağlayın. Bu, tekrarlanan ziyaretlerde sayfa yükleme sürelerini önemli ölçüde azaltır. (Nginx yapılandırmasında zaten bahsedildi.)
* Uygulama Seviyesi Önbellekleme: Veritabanı sorguları, nesneler veya oturum verileri gibi dinamik içerikleri önbelleğe almak için Redis veya Memcached gibi bellek içi önbellek sistemleri kullanın. Bu, veritabanı yükünü azaltır ve uygulamanın yanıt süresini hızlandırır.
Veritabanı Optimizasyonu
Çoğu PHP uygulaması bir veritabanı kullanır. Veritabanı performansı, genel uygulama hızını doğrudan etkiler.
* MySQL/MariaDB Yapılandırması (my.cnf):
* innodb_buffer_pool_size: InnoDB tabloları için ayrılan ana bellek miktarı. Mevcut RAM’in %50-70’i kadar ayarlanması genellikle iyi bir başlangıçtır.
* query_cache_size: Tekrarlanan sorguların sonuçlarını önbelleğe alır. Ancak, yüksek yazma yükü olan sistemlerde performansı düşürebilir, bu nedenle dikkatli kullanılmalıdır. Modern MySQL/MariaDB sürümlerinde genellikle devre dışı bırakılır.
* key_buffer_size: MyISAM tabloları için indeks arabellek boyutu.
* max_connections: Maksimum eşzamanlı veritabanı bağlantısı sayısı.
* Sorgu Optimizasyonu: Yavaş çalışan sorguları tespit edin (MySQL slow query log). İndeksleme, sorguları yeniden yazma ve gereksiz JOIN işlemlerinden kaçınma gibi tekniklerle sorgu performansını artırın.
* Veritabanı İndeksleri: Sıkça sorgulanan sütunlara indeksler eklemek, sorgu hızını önemli ölçüde artırır.
Sistem Kaynakları ve İzleme (Monitoring)
Optimizasyon sürekli bir süreçtir. Sunucunuzun kaynak kullanımını izlemek, darboğazları tespit etmek ve ayarları ince ayar yapmak için kritik öneme sahiptir.
* İzleme Araçları:
* htop veya top: CPU, bellek ve çalışan süreçleri gerçek zamanlı olarak izler.
* vmstat: Bellek, disk, takas ve CPU aktivitesini raporlar.
* iostat: Disk G/Ç performansını izler.
* netstat: Ağ bağlantılarını ve istatistiklerini gösterir.
* nginx_stub_status: Nginx’in temel istatistiklerini (aktif bağlantılar, istekler vb.) sağlar. Nginx yapılandırmanızda etkinleştirmeniz gerekebilir:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1; # Sadece localhost'tan erişime izin ver.
deny all;
}
* PHP-FPM Status Page: PHP-FPM’in havuz istatistiklerini (aktif süreçler, boşta süreçler, kuyruk boyutu) gösterir. www.conf dosyasında etkinleştirilir: pm.status_path = /status. Nginx’te de buna erişim izni vermeniz gerekir.
* Günlük (Log) Analizi:
* Nginx erişim ve hata günlükleri (/var/log/nginx/).
* PHP-FPM yavaş günlükleri (slowlog ayarı ile belirlenen dosya). Yavaş çalışan betikleri tespit etmek için çok değerlidir.
* Veritabanı yavaş sorgu günlükleri.
SSL/TLS Optimizasyonu
HTTPS kullanımı günümüzde bir standarttır. SSL/TLS yapılandırmasını optimize etmek hem güvenlik hem de performans açısından önemlidir.
* ssl_protocols ve ssl_ciphers: Yalnızca güvenli ve modern protokolleri (TLSv1.2, TLSv1.3) ve güçlü şifreleme paketlerini kullanın. Ubuntu 13.04’teki Nginx sürümü eski olabileceği için TLSv1.3 desteği olmayabilir, bu durumda TLSv1.2’ye odaklanın.
ssl_protocols TLSv1.2; # TLSv1.3 için Nginx 1.13.0+ gerekir.
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
* ssl_session_cache ve ssl_session_timeout: SSL oturum önbelleklemesi, tekrar eden bağlantılarda el sıkışma (handshake) süresini kısaltır.
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
* ssl_stapling on;: OCSP Stapling, tarayıcıların sertifika iptal durumunu doğrudan sunucudan almasını sağlayarak ek bir sorgu yapmasını önler ve SSL el sıkışmasını hızlandırır.
* HSTS (HTTP Strict Transport Security): Tarayıcılara sitenize her zaman HTTPS üzerinden bağlanmaları gerektiğini bildiren bir başlık ekleyin.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Sonuç
Ubuntu 13.04 VPS üzerinde Nginx ve PHP-FPM havuzlarını optimize etmek, web uygulamanızın performansını ve kararlılığını önemli ölçüde artırabilir. Bu makalede ele alınan Nginx ve PHP-FPM yapılandırma ayarları, php.ini optimizasyonları, önbellekleme stratejileri, veritabanı ipuçları ve izleme yöntemleri, sunucunuzun daha fazla isteği daha verimli bir şekilde işlemesini sağlayacak temel prensipleri sunmaktadır.
Unutulmamalıdır ki, her uygulamanın ve sunucu ortamının kendine özgü ihtiyaçları vardır. Bu nedenle, burada belirtilen değerler bir başlangıç noktasıdır ve uygulamanızın gerçek yükü, bellek tüketimi ve kullanıcı trafiği göz önünde bulundurularak ince ayarlar yapılmalıdır. Sürekli izleme ve test etme, optimal performansı sürdürmek için kritik öneme sahiptir. Eski bir işletim sistemi olan Ubuntu 13.04 üzerinde çalışıyor olsanız bile, bu optimizasyon prensiplerini uygulamak, mevcut kaynaklarınızdan en iyi şekilde yararlanmanıza yardımcı olacaktır. Güvenlik güncellemelerinin eksikliği nedeniyle eski sistemlerin üretim ortamında kullanılmaması gerektiğini de hatırlatmakta fayda var; ancak bu makaledeki prensipler, performans optimizasyonunun temelini oluşturur.