Metehan Türkdönmez

Metehan Türkdönmez

Wordpress Geliştirici, CRO Danışmanı, Tasarımcı
TR EN

Hızlı WordPress sitesi için En iyi server yapılandırması

Bunun asla tek bir cevabı olamaz. Ama kendi sisteminizi tanıyorsanız muhtemelen kısa sürede kendiniz için iyi bir reçete çıkartabilirsiniz. Ben sadece Apache’den NGINX servera geçerek sayfa yüklemelerinde 6 saniye daha performanslı bir sonuç elde ettim. (6 saniyede açılan web sitesini ben yapmamıştım.)

  • Bu değişikliği yapmam gerektiğini 11 günde farkettim.
  • NGINX kurduktan sonra nasıl çalıştırabileceğimi öğrenmek 5 saatimi aldı.
  • Yapılandırmak mı.. (bknz: https://tr.wikipedia.org/wiki/Sisifos)

Peki bu kadar basit mi?
Asla değil.

Öncelikle başlangıç yazısı olan: WordPress ile Yüksek Performans ve SEO odaklı Web Sitesi Geliştirme Notlarım da ikinci yazıda bahsedeceğim başlıkları listelemiştim. Burada tekrar hatırlayalım;

  • Web sunucusu insandır, kod insanoğlu.
  • NGINX mi evet conf.d yi kurcaladım.
  • Apache WebSocket yazınca benim makalem çıkıyor.

Öncelikle basit localhost clientları kurup üstüne hello world yazarak yazılım öğrenmeye başladıysanız uzun yıllar basit hostingler üzerinde çalışmalar yapıyorsunuz. Panel arayüzlerindeki ayarlar da, limitleri belli paylaşımlı bir hosting üzerinde işinizi çözüyor.

Sonra yıllar geçiyor, geliştirdiğiniz sistemleri bazen aynı anda binlerce kişinin kullanabilmesi, bu sistemlerin saldırılardan korunması, tüm istekleri karşılayabilmesi vs. gerekiyor.

O zaman hemen HR departmanına bir ilan çıkmasını söyleyip ekibe bu işleri yapacak birisini almasını söylüyorsunuz ve o gelene kadar yıllık izne çıkıyorsunuz.

Genellikle böyle olmuyor.

Bir kişinin ortalama bir web sitesi ziyaretinde hangi anlarda ne kadar cpu tükettiğini bilmeniz gerekiyor. Yazdığımız kodun çalışması yetmiyor, performanslı çalışması gerekiyor. 15 MB’lık görselleri önce servera yükleyip gece 2 de tüm görselleri sıkıştıran bir zamanlanmış görev çalıştırmayı akıl ettiğimde kendimi artık usta zannetmeye başlamıştım. Ne kadar yanılmışım.

Sohbet ederken biraz da teknik örnekler verelim.

WordPress için Web sunucusu oluştururken kullanılan en popüler sistemler Apache ve NGINX’tir.

Bunların detaylı anlatımlarını yapmama gerek olduğunu düşünmüyorum, sonuçta bir eğitim içeriği oluşturmuyoruz. Ama akla gelen ilk soruyu Gemini’a sorarak başlayalım. (Yanıtları, soruların üstüne tıklayıp görüntüleyebilirsiniz.)

NGINX Apache’den neden daha performanslıdır?

Nginx’in Apache’ye kıyasla daha yüksek performans göstermesinin temel nedenleri, mimari farklılıklarından kaynaklanır:

  • Olay Tabanlı Mimari:
    • Nginx, olay tabanlı ve eşzamansız bir mimari kullanır. Bu, aynı anda binlerce bağlantıyı tek bir işlemle yönetebileceği anlamına gelir.
    • Apache ise süreç tabanlı bir mimari kullanır. Her bağlantı için yeni bir süreç oluşturur, bu da yüksek trafik altında sunucu kaynaklarının (bellek ve CPU) hızla tükenmesine neden olabilir.
  • Statik İçerik Sunumu:
    • Nginx, statik dosyaları (resimler, CSS, JavaScript) sunma konusunda oldukça etkilidir. Düşük kaynak kullanımıyla yüksek hız sağlar.
    • Apache, statik dosyaları sunabilir, ancak Nginx kadar verimli değildir.
  • Ters Vekil Sunucu ve Yük Dengeleme:
    • Nginx, ters vekil sunucu ve yük dengeleme görevlerinde mükemmel bir performans sergiler. Bu, birden fazla sunucuya gelen trafiği dağıtarak daha iyi ölçeklenebilirlik sağlar.
    • Apache’de bu özellikler modüller ile sağlanır ve Nginx kadar etkili olmayabilir.
  • .htaccess Dosyaları:
    • Apache’nin .htaccess dosyalarını kullanımı, her istekte dosyanın okunmasını gerektirdiğinden performansı olumsuz etkileyebilir. Nginx ise bu tür dosyalara bağımlı değildir ve yapılandırmayı merkezi bir dosyada tutar.

Özetle, Nginx’in olay tabanlı mimarisi ve statik içerik sunumundaki verimliliği, yüksek trafik altında bile daha iyi performans göstermesini sağlar.

Apache’nin NGINX’ten daha performanslı veya önde olduğu bir alan yok mu?

Nginx genellikle statik içerik sunma ve yüksek trafikli sitelerde daha iyi performans gösterse de, Apache’nin de bazı avantajları ve daha uygun olduğu kullanım alanları vardır:

  • .htaccess Dosyaları:
    • Apache, .htaccess dosyalarını destekler. Bu, dizin bazında yapılandırma yapma imkanı sunar. Bu sayede, web sitesi sahipleri veya geliştiriciler, sunucu yöneticisine ihtiyaç duymadan belirli dizinlerde yapılandırma değişiklikleri yapabilirler. Özellikle paylaşımlı hosting ortamlarında bu özellik oldukça kullanışlıdır.
  • Modüler Yapı:
    • Apache’nin modüler yapısı, genişletilebilirliği ve özelleştirilebilirliği artırır. 60’ın üzerinde farklı modül desteği sunar. Bu modüller sayesinde, web sunucusunun işlevselliği ihtiyaçlara göre artırılabilir.
  • Dinamik İçerik:
    • Apache, dinamik içerik işleme konusunda da oldukça güçlüdür. Özellikle PHP gibi dinamik web uygulamaları ile iyi entegre olur.
  • Geniş Uyumluluk:
    • Apache, neredeyse tüm işletim sistemlerinde sorunsuz çalışabilir. Bu, onu oldukça uyumlu bir web sunucusu yapar. Özellikle Windows tabanlı sunucularda Apache daha yaygın olarak kullanılır.
  • Kullanım Kolaylığı ve Yaygınlık:
    • Apache, uzun yıllardır kullanılan bir web sunucusu olduğundan dolayı, geniş bir kullanıcı tabanına ve kapsamlı bir dokümantasyona sahiptir. Bu, yeni başlayanlar için öğrenmeyi ve sorun gidermeyi kolaylaştırır.

Özetle, Nginx yüksek performans ve ölçeklenebilirlik gerektiren durumlar için daha uygunken, Apache daha fazla esneklik, özelleştirme ve uyumluluk sunar. Web sunucusu seçimi, projenin özel ihtiyaçlarına ve gereksinimlerine bağlı olarak değişebilir.

Bu yanıtlar su götürmez, WordPress bir site kuracaksak NGINX web sunucusu üzerinde çalıştırmak performans için pozitif etki yaratacak.

Geliştirme yaparken de geliştirme ortamlarımızı buna göre düzenleyebilirsiniz.

Web sunucusu insandır, kod insanoğlu.

Hazır kod bloklarını kullanarak ekrana bir şeyler yazdırdığım ilk günlerden, detaylı CRUD işlemleri yaptığım büyük sistemlere kadar hep gözden kaçırdığım bir şey vardı, o da bu işin mühendisliği.

Tasarlamak, mimarisini oluşturmak bir yere kadar kolaydı. Çünkü yaygın bir iş için diğer insanlar ne yaparsa ben de aynısını yapıyordum. cPanel’li olacak hosting diyordum soranlara(!).

Fakat tasarlamak ve mimari kurmak için yaygın bilgilerin yetmediği bir noktaya geldi konu. Tam bu noktada mecburen bu kod’un arkasında ne var, nerede işini görüyor, çalışıyor, oralarda neler yapabiliriz diye düşünmeye başlıyoruz.

En başta içi boş bir server kiralayıp her şeyini manuel kurmak ve entegre etmek imkansız gibi geliyordu ama ben bu aşamayı Amazon Web Services kullanarak çok daha rahat atlattım. Çalıştığım proje ölçeklenebilir bir altyapı mimarisi kurmuştu ve bu mimariyi kuran arkadaşlarla bolca sohbet etme fırsatım oldu. Bir şeylerin ne için var olduğunu öğrenmek çok önemli, çünkü o noktadan sonra hareket alanımızı anlamış oluyoruz.

Birden çok web server yoğunluğa göre açılıyor, gelen ziyaretçiler de bu web serverler üzerine dağıtılıyor, siteye kaç kişi girerse girsin site ayakta kalıyor. En ilkel ölçekleme yöntemi budur AWS’de. Yoğunluğa göre otomatik açılan makine kullanımı başına faturalandırılırsınız. Bir yerden başlamak da önemli, o sebeple bunu kullanıyorduk.

Fakat zaman içerisinde AWS modüllerini gördükçe çok daha karlı yöntemler geldi aklıma. Fakat bunun için AWS’ye tamamen bağımlı olmayı kabul etmiş oluyorsunuz. Veya bu modülleri kendi içinizde kuracak takıma sahip olmalısınız. Ki bu pek çok şirket için bile pek mümkün değil.

Ben bir AWS uzmanı değilim o sebeple ölçeklenebilir de yapsanız, single şekilde VDS’e de kursanız bir WordPress sitesi geliştirirken nasıl bir genel server konfigurasyon uygulamalıyız bunu anlatabilirim. Yeterli mi? Pek çok kişi için yeterli olacaktır.

NGINX mi evet conf.d yi kurcaladım.

Ben tek tek kurulum yönergesi yazmayacağım. Ama şu soruların Google Gemini cevaplarına bakmakta fayda var.

NGINX server kurabilmek için hangi işletim sistemine sahip bir sunucuya ihtiyacımız vardır?

NGINX web sunucusunu kurmak için çeşitli işletim sistemlerine sahip bir sunucu kullanabilirsiniz. NGINX, çok yönlülüğü ve yüksek performansı sayesinde popüler bir seçimdir ve birçok farklı platformda çalışabilir. İşte NGINX kurabileceğiniz bazı yaygın işletim sistemleri:

  • Linux dağıtımları:
    • Ubuntu
    • Debian
    • CentOS
    • Red Hat Enterprise Linux (RHEL)
    • Fedora
    • ve diğer birçok Linux dağıtımı
  • BSD türevleri:
  • macOS:
  • Microsoft Windows:

Özellikle Linux tabanlı işletim sistemleri NGINX için çok iyi ortamlardır. Linux dağıtımlarında NGINX’in kurulumu ve yapılandırılması genellikle daha kolaydır ve daha fazla özelleştirme seçeneği sunar.

SSH bağlantısı kurduktan sonra NGINX kurmak için neler yapmalıyım?

SSH bağlantısı kurduktan sonra NGINX web sunucusunu kurmak için izlemeniz gereken adımlar, kullandığınız işletim sistemine göre değişiklik gösterir. İşte yaygın işletim sistemleri için temel adımlar:

Ubuntu/Debian (APT paket yöneticisi):

  1. Paket listesini güncelleme: sudo apt update
  2. NGINX’i kurma: sudo apt install nginx
  3. NGINX’in durumunu kontrol etme: sudo systemctl status nginx
  4. NGINX’in web tarayıcısından erişilebilir olduğunu doğrulama:
    • Sunucunuzun genel IP adresini bir web tarayıcısına girin.
    • Varsayılan NGINX karşılama sayfasını görmelisiniz.

CentOS/RHEL (YUM paket yöneticisi):

  1. Paket listesini güncelleme: sudo yum update
  2. EPEL deposunu etkinleştirme (gerekirse): sudo yum install epel-release
  3. NGINX’i kurma: sudo yum install nginx
  4. NGINX’i başlatma ve sistem başlangıcında otomatik olarak başlatılmasını sağlama: sudo systemctl start nginx sudo systemctl enable nginx
  5. Güvenlik duvarında HTTP (80) ve HTTPS (443) bağlantı noktalarına izin verme:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload1

6. NGINX’in web tarayıcısından erişilebilir olduğunu doğrulama:

  • Sunucunuzun genel IP adresini bir web tarayıcısına girin.
  • Varsayılan NGINX karşılama sayfasını görmelisiniz.

Önemli Notlar:

  • Bu adımlar temel kurulum içindir. İhtiyaçlarınıza göre NGINX’i yapılandırmanız ve güvenlik ayarlarını yapmanız gerekebilir.
  • NGINX’in yapılandırma dosyaları genellikle /etc/nginx/ dizininde bulunur.
  • Güvenlik duvarı ayarlarınızı kontrol etmeyi unutmayın.

Umarım bu bilgiler yardımcı olur.

Şimdi sıra bir NGINX conf. dosyasında neler yazıyorum onları tek tek incelemekte. Bu konfigurasyon dosyasını /etc/nginx/sites-enabled/ icerisinde example.com.conf adı ile oluşturacağız. example kısmını kendinize göre özelleştirebilirsiniz.

server {
    listen 80; # HTTP (80) portunu dinle
    listen [::]:80; # IPv6 üzerinden HTTP (80) portunu dinle

    server_name example.com www.example.com;  # Sunucunun bu alan adlarına yanıt vereceğini belirt (hem example.com hem de www.example.com)

    if ($host = 'example.com') { # Eğer gelen istek 'example.com' alan adından geliyorsa
        return 301 https://www.example.com$request_uri; # 301 (kalıcı) yönlendirme ile HTTPS'e yönlendir ve www alt alan adını ekle (istek URL'sini koru)
    }

    if ($host = 'www.example.com') { # Eğer gelen istek 'www.example.com' alan adından geliyorsa
        return 301 https://www.example.com$request_uri; # 301 (kalıcı) yönlendirme ile HTTPS'e yönlendir ve www alt alan adını ekle (istek URL'sini koru)
    }
}

server { # HTTPS sunucu bloğu

        listen [::]:443 ssl http2; # IPv6 üzerinden HTTPS (443) portunu dinle, SSL ve HTTP/2 etkin
        listen 443 ssl http2; # HTTPS (443) portunu dinle, SSL ve HTTP/2 etkin
        server_name example.com www.example.com; # Sunucunun bu alan adlarına yanıt vereceğini belirt (hem example.com hem de www.example.com)

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # SSL sertifika dosyasının yolunu belirt
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # SSL özel anahtar dosyasının yolunu belirt
        ssl_session_cache shared:le_nginx_SSL:10m; # SSL oturum önbelleğini 10MB boyutunda paylaşılan bir alanda sakla
        ssl_session_timeout 1440m; # SSL oturum zaman aşımını 1440 dakika (1 gün) olarak ayarla
        ssl_session_tickets off; # SSL oturum biletlerini devre dışı bırak
        ssl_protocols TLSv1.2 TLSv1.3; # Kullanılacak SSL/TLS protokollerini belirt (TLS 1.2 ve 1.3)
        ssl_prefer_server_ciphers off; # Sunucu şifrelerini tercih etme
        ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA"; # Kullanılacak şifreleme algoritmalarını belirt
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Diffie-Hellman parametreleri dosyasının yolunu belirt (Certbot tarafından yönetilir)

location ~* \.(jpg|jpeg|png|gif|ico|webp|ttf|woff|woff2)$ { # Bu dosya uzantılarına sahip statik dosyalar için
    expires 30d; # Tarayıcı önbelleğini 30 gün olarak ayarla
    add_header Cache-Control "public, max-age=2592000, immutable"; # Tarayıcı önbellekleme kontrol başlığını ayarla (30 gün, değiştirilemez)
}

location ~* \.(css|js)$ { # Bu dosya uzantılarına sahip statik dosyalar için
    expires 30d; # Tarayıcı önbelleğini 30 gün olarak ayarla
    add_header Cache-Control "public, max-age=2592000"; # Tarayıcı önbellekleme kontrol başlığını ayarla (30 gün)
}

        root /var/www/examplecom; # Web sitesinin kök dizinini belirt
        index index.php index.html index.htm; # Dizin indeks dosyalarını belirt (öncelik sırasına göre)
        client_max_body_size 200M; # İstemci tarafından gönderilen maksimum istek boyutunu 200MB olarak ayarla

        location / { # Tüm istekler için (kök dizin)
                index index.php; # index.php dosyasını indeks dosyası olarak kullan
                try_files $uri $uri/ /index.php$is_args$args; # Dosya veya dizin yoksa, index.php dosyasını çalıştır ve sorgu parametrelerini ekle
        }

       location ~ \.php$ { # PHP dosyaları için
                include snippets/fastcgi-php.conf; # FastCGI yapılandırma dosyalarını dahil et
                fastcgi_pass unix:/run/php/php8.1-fpm.sock; # PHP-FPM soket dosyasının yolunu belirt
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # PHP betik dosyasının yolunu FastCGI'ye ilet
        }
}

Bu örnek PHP 8.1 kullandığım bir projenin nginx konfigurasyonlarını gösteriyor. Basit bir şekilde 80 ve 443 portlarını dinliyor, 443 portu için SSL ayarlarını içeriyor. 80 portuna gelen ziyaretçileri 443 portuna yönlendiriyor. Çeşitli cache ayarlarını, dosya dizin şartlarını ve dizindeki PHP kodunu çalıştırmak için fastcgi ayarlarını içeriyor.

Bunlar bilenin unuttuğu, bilmeyenin de öğrenmeye bir türlü heveslenemediği bilgiler aslında. Unutmayalım konumuz WordPress ile Yüksek Performanslı Site Yayayınlamak. NGINX yüzlerce farklı kombinasyonda özelleştirilebilir ayara sahiptir. Bu konu kendı içinde bir yazı dizisi oluşturabilir. Bu sebeple ben ortalama bir projede kullandığım NGINX konfigürasyon dosyasını paylaştım ve satırlara detaylarını ekledim.

Apache dış kapının dış mandalı mı? Apache’nin hiç mi olur yanı yok diye soranlar varsa: ‘Yazılım geliştirme reçeteleri önceden öğrenilen enstrümanlarla değil, karşınıza olur olmadık anlarda çıkan ihtiyaçlarla belirlenir.’ demek isterim.

Google’a ‘Apache WebSocket’ yazınca benim makalem çıkıyor 🙂

Bu tip durumlarda yanlış bir şey mi yapıyorum acaba diye düşünmeden edemiyorum. Mevcut kaynakları tarayıp yapmaya çalıştığım websocket kurulumu maalesef tutarlı çalışmamıştı, ben de sağlıklı çalışan kurulumu makaleye dönüştürdüm. Bahsi geçen websocket’i kurduğum bu projeyi neden Apache’den NGINX’e taşımadığımı da başka bir yazı da anlatacağım.

Sonuçta bazı konular dikeyinde çalıştıkça bu enstrümanların kullanım alanlarının farklı ve fazla olduğunu görebilirsiniz. Apache de NGINX de yeri ve zamanı gelince kullanılır. Lakin hızlı WordPress NGINX ister, SEO’cunuz htaccess (apache içindir) düzenlemek isterse bana kızmayın. NGINX’de nasıl yapacağınızı öğrenin. Yapay zeka, örnek htaccess kodunuzu NGINX için convert etmenize yardımcı olacaktır.