Yüksek trafiğe sahip web siteleri, hizmetlerin özel bir yapılandırmasını gerektirir. Seçilen hizmete bağlı olarak, VPS sunucusunun yüksek performans elde edilmesi için öneriler bulunmaktadır.
Sadece kaynakları artırmak, VPS sunucusunun yüksek performansını elde etmek için yeterli değildir; hizmetlerin de yapılandırılması gerekir.
Varsayılan olarak, hizmetler düşük ila orta seviyede trafiğe sahip tipik projeler için uygun temel ayarlara sahiptir.
Netlik sağlamak için, ziyaret kriterlerini belirleyeceğiz:
- Düşük web sitesi trafiği: Ayda 10.000 ziyarete kadar (günde yaklaşık 300 ziyaret, her 5 dakikada 1 ziyaret).
- Orta seviye web sitesi trafiği: Ayda 10.000 ila 90.000 ziyaret—ortalama 50.000 ziyaret/ay (günde yaklaşık 1.600 ziyaret, dakikada 1 ziyaret).
- Yüksek web sitesi trafiği: Ayda 100.000 ziyaret ve üzeri, yani dakikada 2 ziyaret ve daha fazla.
Nginx'in vekil web sunucusu olarak ve php-fpm'nin (bu durumda php8.3-fpm) ana işleyici olarak kullanıldığı bir yapılandırmayı inceleyelim.
Linux Debian 12 çalıştıran, 6 CPU çekirdeği, 8 GB RAM ve 50 GB SSD'ye sahip bir VPS sunucusu kullandık.
Özellikle php8.3-fpm için performansı optimize edeceğiz. Varsayılan yapılandırma ile bir bağlantı analiz betiği çalıştırdık ve birkaç dakika içinde istek oranı saniyede 9 isteikten 5 isteğe düştü. 5 dakika daha geçtikten sonra performans saniyede 1,5 isteğe düştü ve hizmet tıkanmaya başladı, kısa süre sonra Bad Gateway hatası verdi.
Bu arada, sunucu yükü önemli ölçüde artmadı ve istekleri işlemek için hala yeterli kaynak vardı.
1. Yeni php-fpm Yapılandırma Dosyası
/etc/php/8.3/fpm/pool.d/domain.conf yolunda yeni bir yapılandırma dosyası oluşturun.
Eski dosyayı www.conf.bak olarak yeniden adlandırın—bu, dosyanın kullanılmasını engeller, ancak gerekirse .bak uzantısını kaldırarak geri dönebilirsiniz.
2. Yapılandırma Ayrıntıları
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; Process manager
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
pm.max_spawn_rate = 32
pm.process_idle_timeout = 10s
; Connection settings
listen.backlog = 65535
listen.allowed_clients = 127.0.0.1
; Timeouts
request_terminate_timeout = 30s
request_slowlog_timeout = 5s
slowlog = /var/log/php8.3-fpm/slow.log
; Status monitoring
pm.status_path = /fpm-status
ping.path = /ping
ping.response = pong
; Logging
access.log = /var/log/php8.3-fpm/access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}dms"
catch_workers_output = yes
decorate_workers_output = no
; Security
security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8
clear_env = no
; Performance tweaks
rlimit_files = 65535
rlimit_core = unlimited
; PHP settings
php_admin_value[error_log] = /var/log/php8.3-fpm/error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 32M
php_admin_value[max_execution_time] = 30
php_admin_value[session.gc_maxlifetime] = 1440
3. Ek Ayarlar
Eğer günlük dizini mevcut değilse, oluşturun:
mkdir -p /var/log/php8.3-fpm
3.1 Yapılandırma Yorumları
- listen = 127.0.0.1:9000 - Nginx yapılandırmasıyla eşleşmelidir veya tam tersi.
- pm.max_children = 50 - Kullanılabilir RAM'e bağlıdır (her bir alt süreç için 50 MB → PHP için yaklaşık 2 GB).
- pm.start_servers = 10 - pm.max_children ’ın yaklaşık %20’si.
- pm.max_requests = 500 - Bellek sızıntısını önlemek için 500 istekten sonra işçileri yeniden başlatır (ziyaretçiler için fark edilmez ve çalışmayı etkilemez).
- request_terminate_timeout = 30s - Takılı kalan istekleri sonlandırır.
- request_slowlog_timeout = 5s - Yavaş istekleri günlüğe kaydeder.
- slowlog = /var/log/php8.3-fpm/slow.log
CMS tabanlı siteler için yavaş istek günlüğü, bir çağrı yığını göstereceği için çok faydalı olmayabilir, ancak isteklerin başlangıç ve bitiş zaman aralığı hakkında faydalı bilgiler sağlayabilir.
/fpm-status ’ü izlemek için nginx sunucu bloğuna aşağıdakileri ekleyin:
location = /fpm-status {
allow 127.0.0.1; # Yalnızca yerel erişime izin ver
allow 192.168.10.100; # Veya güvenilir ağınız
deny all; # Diğer herkesi engelle
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
Çıktı aşağıdaki içeriğe sahip olacaktır:
pool: www
process manager: dynamic
start time: 04/Jun/2025:18:16:50 +0000
start since: 814
accepted conn: 239
listen queue: 0
max listen queue: 0
listen queue len: 128
idle processes: 9
active processes: 1
total processes: 10
max active processes: 3
max children reached: 0
slow requests: 0
4. Yeni Yapılandırmayı Uygulama
Yapılandırma dosyasını hatalar için kontrol edin:
php-fpm8.3 -t
Hata yoksa, servisi yeniden başlatın:
systemctl restart php8.3-fpm
5. Yeniden Test Etme
Yeni yapılandırma ile benzer testlerde CPU yükü belirgin şekilde arttı, ancak performans birkaç dakika sonra sadece %20 azaldı (saniyede 9 istekten 7 isteğe) ve sabitlendi. Tüm istekler (25 dakika boyunca yaklaşık 10.000 istek, yani dakikada 400 istek veya saniyede yaklaşık 7 istek) 200 durum koduyla başarıyla işlendi.
Aynı anda test yapılırken ve web sitesinin sayfalarında gezinirken, görsel olarak performansın belirgin şekilde daha hızlı olduğu fark edildi. Bu web hizmeti yapılandırmasıyla, sunucu kaynakları artık daha önce olduğu gibi boşta kalmıyor, tamamen kullanılıyor.