Takip et

Giriş: Web Sitesi Hit Sayacı Nedir ve Neden Redis Kullanmalıyız?

Giriş: Web Sitesi Hit Sayacı Nedir ve Neden Redis Kullanmalıyız? Bir web sitesi hit sayacı, sitenizi ziyaret eden kullanıcı sayısını veya

Giriş: Web Sitesi Hit Sayacı Nedir ve Neden Redis Kullanmalıyız?

Bir web sitesi hit sayacı, sitenizi ziyaret eden kullanıcı sayısını veya belirli bir sayfanın kaç kez görüntülendiğini takip eden basit ama etkili bir araçtır. Geleneksel olarak, bu tür sayaçlar genellikle bir veritabanı (MySQL gibi) veya dosya sistemine (metin dosyası) dayanır. Ancak, yüksek trafikli sitelerde bu yöntemler performans darboğazlarına yol açabilir:

* Veritabanı Yükü: Her sayfa yüklemesinde veritabanına yazma işlemi, veritabanı sunucusunda önemli bir yük oluşturabilir ve yanıt sürelerini yavaşlatabilir.
* Dosya Okuma/Yazma: Dosya tabanlı çözümler, disk G/Ç işlemleri nedeniyle yavaş olabilir ve eşzamanlı erişimde kilitlenme sorunları yaşayabilir.

İşte tam bu noktada Redis devreye giriyor. Redis, açık kaynaklı, bellek içi bir veri yapısı deposudur. Bir veritabanı, önbellek ve mesaj aracısı olarak kullanılabilir. Redis’in hit sayacı için ideal olmasının başlıca nedenleri şunlardır:

* Hız: Verileri bellekte tuttuğu için inanılmaz derecede hızlı okuma ve yazma işlemleri sunar.
* Atomik İşlemler: Sayaç artırma (INCR) gibi işlemler atomik olarak gerçekleştirilir, bu da eşzamanlı erişimlerde veri tutarlılığını garanti eder.
* Basit Veri Yapıları: String, Hash, List, Set, Sorted Set gibi çeşitli veri yapıları sunar. Sayaçlar için String veya Set (benzersiz ziyaretçiler için) idealdir.
* Düşük Gecikme: Ağ gecikmesi minimumdur, bu da her sayfa yüklemesinde hızlı bir şekilde sayaç güncellemeyi mümkün kılar.

Bu rehberde, PHP’yi kullanarak Ubuntu 20.04 üzerinde Redis destekli, hızlı ve ölçeklenebilir bir web sitesi hit sayacını nasıl kuracağınızı adım adım göstereceğiz.

Ortam Kurulumu: Ubuntu 20.04 Üzerinde Gerekli Bileşenlerin Hazırlanması

Hit sayacımızı kurmaya başlamadan önce, Ubuntu 20.04 sunucumuzda gerekli yazılımları yüklememiz ve yapılandırmamız gerekiyor.

Sistem Güncelleme

İlk olarak, sunucunuzdaki paket listelerini güncelleyelim ve mevcut paketleri yükseltelim:

sudo apt update
sudo apt upgrade -y

Nginx Web Sunucusu Kurulumu

Web sitenizi barındırmak için Nginx’i kullanacağız. Nginx, yüksek performanslı ve hafif bir web sunucusudur.

sudo apt install nginx -y

Kurulumdan sonra Nginx servisinin çalıştığından emin olun:

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

Eğer bir güvenlik duvarı (UFW) kullanıyorsanız, Nginx’e gelen HTTP (80) ve HTTPS (443) trafiğine izin vermeniz gerekebilir:

sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS' # Eğer SSL kullanacaksanız
sudo ufw enable # Eğer UFW etkin değilse

PHP ve Gerekli Modüllerin Kurulumu

Web sitesi mantığımızı PHP ile yazacağız. Nginx ile PHP’nin düzgün çalışması için php-fpm‘e ve Redis ile iletişim kurmak için php-redis modülüne ihtiyacımız var.

sudo apt install php-fpm php-cli php-redis -y

Kurulumdan sonra PHP-FPM servisinin çalıştığından emin olun:

sudo systemctl start php7.4-fpm # Ubuntu 20.04 varsayılan PHP sürümü 7.4'tür.
sudo systemctl enable php7.4-fpm
sudo systemctl status php7.4-fpm

Redis Sunucusu Kurulumu

Şimdi Redis sunucusunu kuralım.

sudo apt install redis-server -y

Redis servisinin çalıştığından emin olun:

sudo systemctl start redis-server
sudo systemctl enable redis-server
sudo systemctl status redis-server

Redis’in düzgün çalıştığını test etmek için redis-cli komutunu kullanabilirsiniz:

redis-cli ping

Çıktı olarak PONG almalısınız.

Redis Güvenliği (İsteğe Bağlı ama Önemli)

Varsayılan olarak Redis, şifre koruması olmadan çalışır. Üretim ortamlarında Redis’i güvence altına almanız şiddetle tavsiye edilir. Redis yapılandırma dosyasını düzenleyerek bir parola belirleyebilirsiniz:

sudo nano /etc/redis/redis.conf

Dosya içinde requirepass kelimesini arayın ve yorum satırını kaldırarak güçlü bir parola belirleyin:

# requirepass foobared
requirepass SizinGucluParolanizBurada

Değişiklikleri kaydedip çıktıktan sonra Redis servisini yeniden başlatın:

sudo systemctl restart redis-server

Artık Redis’e bağlanırken parolanızı kullanmanız gerekecek:

redis-cli -a SizinGucluParolanizBurada

Hit Sayacı Mantığının PHP ve Redis ile Uygulanması

Şimdi PHP ve Redis kullanarak sayaç mantığını oluşturalım. İki tür sayım yapacağız: toplam sayfa görüntülemesi ve benzersiz ziyaretçi sayısı (IP adresine göre).

PHP Hit Sayacı Dosyasını Oluşturma

Web sunucunuzun kök dizininde (genellikle /var/www/html/ veya özel bir sanal host dizini) counter.php adında bir dosya oluşturalım.

sudo nano /var/www/html/counter.php

İçeriğini aşağıdaki gibi doldurun:

connect($redisHost, $redisPort);

    // Eğer parola varsa, kimlik doğrulaması yapın
    if (!empty($redisPassword)) {
        $redis->auth($redisPassword);
    }

    // Toplam hit sayısını artır
    $totalHits = $redis->incr($totalHitsKey);

    // Benzersiz ziyaretçi sayısını kaydet (IP adresine göre)
    $visitorIp = $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN_IP'; // Kullanıcının IP adresini al
    $redis->sAdd($uniqueVisitorsKey, $visitorIp); // IP'yi benzersiz kümesine ekle

    // Benzersiz ziyaretçi sayısını al
    $uniqueVisitors = $redis->sCard($uniqueVisitorsKey);

    // Başarılı yanıt
    echo json_encode([
        'status' => 'success',
        'total_hits' => $totalHits,
        'unique_visitors' => $uniqueVisitors
    ]);

} catch (RedisException $e) {
    // Redis bağlantı veya işlem hatası
    http_response_code(500); // Internal Server Error
    echo json_encode([
        'status' => 'error',
        'message' => 'Redis hatası: ' . $e->getMessage()
    ]);
} catch (Exception $e) {
    // Diğer genel hatalar
    http_response_code(500);
    echo json_encode([
        'status' => 'error',
        'message' => 'Genel hata: ' . $e->getMessage()
    ]);
}

?>

Kod Açıklaması:

* header('Content-Type: application/json');: Bu, tarayıcıya veya çağıran uygulamaya bir JSON yanıtı gönderdiğimizi bildirir.
* Redis Bağlantısı: new Redis() ile bir Redis istemcisi oluşturulur ve connect() ile sunucuya bağlanılır. Eğer Redis’e parola koyduysanız, auth() metoduyla kimlik doğrulaması yapılması zorunludur.
* $totalHitsKey: Toplam sayfa görüntülemesini tutan Redis anahtarı.
* $uniqueVisitorsKey: Benzersiz ziyaretçilerin IP adreslerini tutan Redis Set anahtarı.
* $redis->incr($totalHitsKey);: Redis’teki $totalHitsKey değerini atomik olarak bir artırır ve yeni değeri döndürür. Eğer anahtar yoksa, 0 olarak başlatır ve sonra 1’e artırır.
* $_SERVER['REMOTE_ADDR']: Ziyaretçinin IP adresini almak için kullanılır.
* $redis->sAdd($uniqueVisitorsKey, $visitorIp);: $uniqueVisitorsKey adlı Redis Set’ine ziyaretçinin IP adresini ekler. Set’ler sadece benzersiz elemanları tuttuğu için, aynı IP birden fazla kez eklense bile Set içinde sadece bir kez bulunur.
* $redis->sCard($uniqueVisitorsKey);: $uniqueVisitorsKey adlı Redis Set’indeki eleman sayısını (yani benzersiz ziyaretçi sayısını) döndürür.
* json_encode(...): PHP dizisini JSON formatına dönüştürerek istemciye gönderir.
* try-catch blokları: Redis bağlantı veya diğer olası hataları yakalamak ve kullanıcıya anlamlı bir hata mesajı sunmak için kullanılır.

Dosyayı kaydettikten sonra, PHP-FPM’in bu dosyayı okuyabilmesi için doğru dosya izinlerine sahip olduğundan emin olun:

sudo chown www-data:www-data /var/www/html/counter.php
sudo chmod 644 /var/www/html/counter.php

Web Sitenize Sayacı Entegre Etme ve Görüntüleme

Şimdi oluşturduğumuz counter.php dosyasını Nginx üzerinden erişilebilir hale getireceğiz ve web sitemizin ana sayfasında bu sayaç değerlerini görüntüleyeceğiz.

Nginx Sanal Host Yapılandırması

Nginx’in PHP dosyalarını işleyebilmesi için bir yapılandırma yapmamız gerekiyor. Varsayılan Nginx yapılandırma dosyasını düzenleyebilir veya yeni bir sanal host oluşturabilirsiniz. Biz varsayılanı düzenleyelim:

sudo nano /etc/nginx/sites-available/default

server bloğu içinde, location ~ \.php$ bloğunu bulun veya ekleyin. root direktifinin /var/www/html olduğundan ve fastcgi_pass ayarının php-fpm soketine işaret ettiğinden emin olun.

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html index.php; # index.php'yi ekleyin

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

    # PHP dosyalarını işlemek için bu bloğu ekleyin veya güncelleyin
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # PHP sürümünüze göre güncelleyin
    }

    # Diğer Nginx yapılandırmaları...
}

Yapılandırma dosyasını kaydedip çıktıktan sonra, Nginx yapılandırmasının sözdizimini kontrol edin ve servisi yeniden başlatın:

sudo nginx -t
sudo systemctl reload nginx

HTML Sayfasında Sayacı Görüntüleme

Şimdi index.php (veya index.html) dosyanızı oluşturarak veya düzenleyerek sayaç verilerini görüntüleyelim. counter.php dosyasından gelen JSON verilerini JavaScript ile alıp HTML sayfanıza yerleştireceğiz. Bu yöntem, sayfanın geri kalanını engellemeden sayacı dinamik olarak güncellemenizi sağlar.

sudo nano /var/www/html/index.php

İçeriğini aşağıdaki gibi doldurun:




    
    
    Redis Hit Sayacı Örneği
    


    

Bu sayfa Redis destekli bir hit sayacı kullanmaktadır.

Toplam Ziyaret Sayısı:

Yükleniyor...

Benzersiz Ziyaretçi Sayısı:

Yükleniyor...

Kod Açıklaması:

* index.php: Artık Nginx yapılandırmamız sayesinde index.php dosyaları otomatik olarak PHP-FPM tarafından işlenecek.
* fetch('/counter.php'): JavaScript fetch API’si kullanarak counter.php dosyasını asenkron olarak çağırır. Bu, sayfa yüklenirken sayfa içeriğinin gösterilmesini engellemez.
* .then(response => response.json()): Sunucudan gelen yanıtı JSON olarak ayrıştırır.
* .then(data => {...}): JSON verilerini aldıktan sonra totalHits ve uniqueVisitors div’lerini günceller.
* .catch(error => {...}): Ağ hatalarını veya JSON ayrıştırma hatalarını yakalar ve bir hata mesajı gösterir.

Dosyayı kaydedin ve web tarayıcınızdan sunucunuzun IP adresini veya alan adını ziyaret edin. Her sayfa yenilemesinde “Toplam Ziyaret Sayısı”nın arttığını ve farklı IP adreslerinden yapılan ziyaretlerde “Benzersiz Ziyaretçi Sayısı”nın da arttığını göreceksiniz.

Gelişmiş Konular, Optimizasyonlar ve Sıkça Sorulan Sorular

Sayaç sisteminiz artık çalışır durumda. Ancak, daha sağlam ve yönetilebilir hale getirmek için bazı ek konuları göz önünde bulundurmak önemlidir.

Sayaç Sıfırlama veya Yönetimi

Sayaç değerlerini Redis CLI üzerinden kolayca yönetebilirsiniz.

* Toplam Hit Sayacını Sıfırlama:

redis-cli -a SizinGucluParolanizBurada DEL website:total_hits

* Benzersiz Ziyaretçi Sayacını Sıfırlama:

redis-cli -a SizinGucluParolanizBurada DEL website:unique_visitors

* Mevcut Değerleri Görme:

redis-cli -a SizinGucluParolanizBurada GET website:total_hits
    redis-cli -a SizinGucluParolanizBurada SCARD website:unique_visitors
    redis-cli -a SizinGucluParolanizBurada SMEMBERS website:unique_visitors # Tüm benzersiz IP'leri görmek için

Performans ve Ölçeklenebilirlik İpuçları

* Redis Kalıcılığı: Redis varsayılan olarak verileri bellekte tutar, ancak sunucu yeniden başlatıldığında veriler kaybolabilir. Verilerin kaybolmaması için Redis’in kalıcılık mekanizmalarını (RDB Snapshotting veya AOF – Append Only File) etkinleştirmeyi düşünebilirsiniz. Bu ayarlar /etc/redis/redis.conf dosyasında bulunur.
* Redis Bağlantı Havuzları: Çok yüksek trafikli uygulamalarda, her istekte yeni bir Redis bağlantısı açmak yerine bir bağlantı havuzu kullanmak performansı artırabilir. Ancak PHP için bu genellikle daha karmaşıktır ve çoğu durumda gereksizdir.
* Önbellekleme: Eğer sayfa görüntüleme sayısı anlık olmak zorunda değilse, sayaç değerini belirli aralıklarla (örneğin her 5 saniyede bir) önbelleğe alarak Redis’e yapılan istek sayısını azaltabilirsiniz.

Güvenlik İpuçları

* Redis Parolası: Redis sunucunuza güçlü bir parola belirlemek, yetkisiz erişimi engellemenin en temel yoludur.
* Güvenlik Duvarı (UFW): Redis’in sadece web sunucunuzdan (veya PHP uygulamasının çalıştığı sunucudan) erişilebilir olduğundan emin olun. Varsayılan Redis portu olan 6379’u sadece localhost‘a veya belirli bir IP adresine açın.

sudo ufw allow from 127.0.0.1 to any port 6379
    # Veya belirli bir IP'den:
    # sudo ufw allow from SizinWebSunucusuIPAdresiniz to any port 6379

* PHP Dosya İzinleri: Web sunucunuzdaki PHP dosyalarının doğru izinlere sahip olduğundan emin olun (644 dosyalar için, 755 dizinler için).

Sonuç

Bu rehberde, Ubuntu 20.04 üzerinde Nginx, PHP ve Redis kullanarak hızlı ve verimli bir web sitesi hit sayacını nasıl kuracağınızı öğrendiniz. Redis’in hızı ve veri yapısı yetenekleri sayesinde, geleneksel veritabanı tabanlı çözümlere göre çok daha performanslı bir sayaç sistemine sahip olabilirsiniz. Bu temel yapılandırmayı kendi web sitelerinize kolayca entegre edebilir ve ihtiyaçlarınıza göre geliştirebilirsiniz.

Sıkça Sorulan Sorular (SSS)

S1: Redis kalıcılığı nedir ve neden önemlidir?
C1: Redis kalıcılığı, bellekte tutulan verilerin sunucu yeniden başlatıldığında veya Redis servisi durduğunda kaybolmamasını sağlayan mekanizmadır. RDB (Snapshotting) ve AOF (Append Only File) olmak üzere iki ana kalıcılık modu vardır. Hit sayacı gibi verilerin kaybolmasını istemiyorsanız, üretim ortamında kalıcılığı yapılandırmak önemlidir.

S2: Sayaç neden artmıyor?
C2: Birkaç olası neden olabilir:
* PHP-FPM veya Nginx servislerinin çalışmaması.
* counter.php dosyasında Redis bağlantı bilgilerinin (host, port, parola) yanlış olması.
* php-redis modülünün yüklü olmaması.
* Nginx yapılandırmasında PHP dosyalarının işlenmesiyle ilgili bir sorun olması.
* Redis sunucusunun çalışmaması veya güvenlik duvarı tarafından engellenmesi.
* counter.php dosyasında oluşan bir PHP hatası (hata raporlamayı etkinleştirerek kontrol edin).

S3: “Benzersiz ziyaretçi” ile “toplam ziyaret” arasındaki fark nedir?
C3: “Toplam ziyaret” (total hits), bir sayfanın kaç kez görüntülendiğini gösterir ve aynı kullanıcının sayfayı birden fazla kez yenilemesiyle artar. “Benzersiz ziyaretçi” ise, belirli bir zaman dilimi içinde sayfayı ziyaret eden farklı kullanıcıların (genellikle IP adreslerine göre belirlenir) sayısını gösterir. Aynı kullanıcı, sayfayı kaç kez yenilerse yenilesin benzersiz ziyaretçi sayısını sadece bir kez artırır.

S4: Sayaç verisini nasıl sıfırlarım?
C4: Redis CLI kullanarak ilgili anahtarları silebilirsiniz. Örneğin, redis-cli -a SizinParolaniz DEL website:total_hits ve redis-cli -a SizinParolaniz DEL website:unique_visitors komutlarını çalıştırarak sayaçları sıfırlayabilirsiniz.

S5: Redis yerine başka bir veritabanı kullanabilir miyim?
C5: Evet, Redis yerine MySQL, PostgreSQL gibi ilişkisel veritabanlarını veya MongoDB gibi NoSQL veritabanlarını kullanabilirsiniz. Ancak Redis, bellek içi yapısı, hız ve atomik işlemleri nedeniyle sayaçlar gibi sık güncellenen veriler için genellikle daha performanslı bir seçenektir. Diğer veritabanları genellikle daha yüksek gecikme sürelerine ve daha fazla G/Ç yüküne neden olabilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.