Nginx ve Apache Optimizasyonu ve Bakımı: Farklı Senaryolar İçin Yapılandırma Rehberi
Web sunucusu optimizasyonu, bir projenin performansı ve sürdürülebilirliği açısından kritik öneme sahiptir. Nginx ve Apache, dünya çapında en çok kullanılan web sunucularıdır. Ancak her sunucunun kaynakları ve trafik yükü farklı olduğundan yapılandırmalar da buna göre şekillendirilmelidir. Bu makalede düşük kaynaklı ve anlık 5 ziyaretçili sunucudan, yüksek kaynaklı ve anlık 50.000 ziyaretçili dev projelere kadar örneklerle Nginx ve Apache optimizasyonu ve bakımı konusunu ele alıyoruz. Ayrıca ters proxy kullanımı ile ilgili avantaj ve dezavantajlara da değineceğiz.
1. Düşük Trafikli (Anlık 5 Ziyaretçi) Sunucular İçin Optimizasyon
Nginx Ayarları:
- Worker Processes: Sunucunun CPU çekirdeği sayısına göre
auto
olarak ayarlanabilir. - Worker Connections:
1024
gibi düşük seviyelerde tutulabilir. - Gzip: Aktif edilerek bant genişliği tasarrufu sağlanır.
- Client Body Buffer Size ve Timeouts: Yüksek tutulmamalı, varsayılan ayarlar çoğu zaman yeterlidir.
- Cache: Küçük boyutlu bir
fastcgi_cache
veyaproxy_cache
kullanılabilir.
Apache Ayarları:
- Prefork veya Event MPM: Az trafik için
event
tercih edilmelidir. - MaxRequestWorkers: 10-20 arası olabilir.
- KeepAlive: Açık tutularak 2-3 saniye timeout belirlenebilir.
- Log Seviyeleri: Fazla detaylı loglama yerine
warn
seviyesi tercih edilmeli.
Bakım ve Önlemler:
- Haftalık log temizliği.
- Günlük otomatik güncelleme kontrolleri.
- Kullanılmayan modüllerin devre dışı bırakılması.
2. Yüksek Trafikli (Anlık 50.000 Ziyaretçiye Çıkabilen) Sunucular İçin Optimizasyon
Nginx Ayarları:
- Worker Processes: CPU çekirdeği kadar.
- Worker Connections: En az
65535
. - Proxy Cache: Yüksek trafikli sitelerde kesinlikle kullanılmalı. Disk I/O yüksek olacağından NVMe disk tercih edilmeli.
- Rate Limiting: DDOS saldırılarına karşı belirli oranlarda sınırlama konulmalı.
- Tuning:
sendfile
,tcp_nopush
,tcp_nodelay
aktif edilmeli.
Apache Ayarları:
- Event MPM: Yüksek trafikte en stabil yapılandırma.
- ServerLimit ve MaxRequestWorkers: Yüksek değerlere çekilmeli (ör. 500-1000).
- Timeout: 30 saniyenin altında tutulmalı.
- Mod_cache: Apache için kullanılacaksa RAM bazlı cache tercih edilmeli.
Bakım ve Takip:
- Zabbix, Grafana gibi sistemlerle anlık kaynak kullanımı izleme.
- Haftalık log rotasyonu.
- Her ay yapılandırma gözden geçirmesi.
3. Ters Proxy Kullanımı: Avantaj ve Dezavantajlar
Avantajları:
- Yük Dengeleme: Trafik yükünü arkadaki uygulama sunucularına dengeli dağıtır.
- Önbellekleme: Ters proxy üzerinden gelen istekler cache’den daha hızlı yanıtlanabilir.
- Güvenlik: Gerçek uygulama sunucularını dışa kapatır, IP’leri gizler.
- SSL Offloading: SSL sertifika sürecini proxy üstünden yönetmek, uygulama sunucularını rahatlatır.
Dezavantajları:
- Ekstra Katman: Yanlış yapılandırılırsa ek gecikme yaratır.
- Kaynak Kullanımı: Ters proxy sunucusu da kaynak tüketir ve doğru donanım ister.
- Debug Süreçleri: Sorun çözümünde katman sayısı artar.
4. Senaryo Bazlı Örnek Yapılandırma
A) Küçük Proje (Blog veya Kurumsal Site)
- Nginx + PHP-FPM + Küçük Cache Yapılandırması.
- KeepAlive açık, timeout 5 sn.
- Haftalık bakım.
B) E-Ticaret Sitesi (Yoğun Trafikli)
- Ters proxy olarak Nginx; arka planda Apache veya Node.js.
- Cache + CDN entegrasyonu.
- Rate Limiting + Fail2Ban aktif.
- Günlük monitör ve analiz raporları.
C) Haber Sitesi (Çok Yüksek Trafik)
- Ana sunucular arasında load balancer.
- Yüksek performanslı proxy_cache.
- Cloudflare veya benzeri CDN zorunlu.
- Sunucu bazında Redis/Memcached.
Örnek Apache Yapılandırma Dosyası (apache.conf) – Orta Trafikli Proje
Orta düzey trafiğe sahip, örneğin günde 20.000-50.000 arası ziyaretçi alan bir web projesi için aşağıdaki örnek apache.conf dosyası kullanılabilir. Bu yapılandırma, hem performansı hem de stabiliteyi hedefler.
ServerRoot "/etc/apache2"
Listen 80
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
<IfModule mpm_event_module>
ServerLimit 256
StartServers 4
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 64
MaxRequestWorkers 512
MaxConnectionsPerChild 5000
</IfModule>
Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain text/html text/xml text/css application/json application/javascript application/xml application/rss+xml application/atom+xml image/svg+xml
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
</IfModule>
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
</IfModule>
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
Debian Üzerinde Çalışan Apache için Özel Yapılandırma (PHP-FPM ve ProxyPass Senaryoları)
1. Apache + PHP-FPM için Örnek Yapılandırma
PHP-FPM kullanıyorsanız Apache üzerinde mod_proxy_fcgi
modülü ile PHP-FPM’e yönlendirme yapabilirsiniz.
apache.conf örneği:
ServerRoot "/etc/apache2"
Listen 80
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
<IfModule mpm_event_module>
ServerLimit 256
StartServers 4
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 64
MaxRequestWorkers 512
MaxConnectionsPerChild 5000
</IfModule>
<VirtualHost *:80>
ServerName siteadi.com
DocumentRoot /var/www/siteadi.com/public
<Directory /var/www/siteadi.com/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Not: PHP-FPM soket yolu
/run/php/php8.2-fpm.sock
olarak Debian 11 ve sonrası için varsayılan geliyor. Sizde farklı ise kontrol edin.
2. Apache Ters Proxy (ProxyPass) için Örnek Yapılandırma
Sık kullanılan durum önde Nginx arkada Apache olan yapılandırmasıdır ama bazen proje özelinde farklı ayarlamalar gerekebilir.
Eğer Apache’yi Nginx veya başka bir servis önünde ters proxy olarak kullanmak istiyorsanız veya Apache’nin bir backend olarak çalışmasını istiyorsanız aşağıdaki gibi kullanabilirsin:
apache.conf ProxyPass örneği:
<VirtualHost *:80>
ServerName api.siteadi.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
ErrorLog ${APACHE_LOG_DIR}/api_error.log
CustomLog ${APACHE_LOG_DIR}/api_access.log combined
</VirtualHost>
Bu yapılandırma; 80 portundan gelen tüm istekleri 8080 portundaki uygulamaya yönlendirir.
Sonuç
Nginx ve Apache optimizasyonu, ziyaretçi sayısı ve sunucu kaynaklarına göre esnek şekilde yapılandırılmalıdır. Az trafik için minimalist ayarlar yeterli olurken, yoğun trafik altında yüksek performanslı, ölçeklenebilir ve güvenli yapılandırmalara ihtiyaç vardır. Ters proxy kullanımı, doğru yapıldığında sunucu yükünü ve maliyetleri azaltır; ancak yanlış yapılandırıldığında performans sorunlarına neden olabilir. Dolayısıyla sunucu yönetiminde dikkatli planlama, sürekli izleme ve periyodik bakım en önemli başarı anahtarıdır.