CDN server kurulumu (nginx) statik dosyalar icin ayri server 3

Günümüzde bir çok cdn server hizmeti satan firma bulunuyor. Bunların ücretleride bir o kadar maddi durumunuzu zorlayabilir düzeyde olabiliyor. Mantık olarak bugün anlatacağım konu sitenizdeki statik dosyaları farklı bir sunucuda tutarak ana server üzerindeki yükü azaltmak, tepki süresini artırmak olacaktır.

CDN server mantığı istek yapan kullanıcıya en yakın serverdan statik dosyaları sunmak olarak adlandırabiliriz. Burda anlatacağım konu tek serverdan oluşacaktır ancak amacımız statik dosyaları farklı bir sunucuda barındırmak olduğundan yeterli olacaktır.

Neler anlatılacak?

Gerekli süre: 10 dakika.

Bu makalede anlatılanlar ve izlemeniz gereken başlıklar aşağıda listelenmiştir.

  1. Gerekli uygulamaların kurulumu ve ayarlar

    Nginx için epel deposunu kurmamız gerekli, bununla ilgili anlatım kısmı.

  2. Nginx kurulumu

    Centos sunucularda nginx kurulumu ve ayarları

  3. Kullanıcı ve site klasörünü ekleme

    Sunucuda çalıştıracağımız siteler için kullanıcı hesabı oluşturma ve dosya izinlerini ayarlama

  4. Nginx Site ekleme

    Nginx tarafından kullanılacak olan site bilgilerini ve ayarlarını oluşturacağız.

  5. Nginx SSL aktif etme

    Nginx sunucularda ssl yi aktif etmek için yapmanız gerekenler.

  6. Ftp server kurulumu

    Cdn sunucusuna erişebileceğimiz bir ftp kurulumunu anlatıyoruz

  7. Centos güvenlik yazılımı Firewalld varsa!

    Centos sunucularda firewalld programı yüklü ise, güvenlik ayarlarını yapmamız gerekiyor.

  8. Nginx 403 Forbidden Hatası alırsanız çözümü burada

    Her şeyi yaptıktan sonra sitenize ulaşamaz ve 403 forbidden hatası alırsanız çözümü burada.

  9. WordPress Yüklenen dosyaları CDN server’a otomatik yükletme

    WordPress kullananlar için kolay ve basit bir eklentiden bahsedeceğiz. Bu sayede yüklediğiniz dosyalar anında cdn sunucusuna da yüklenecek.

  10. CDN Server’a Dosya yükleme (php + ftp)

    Php olarak hazırladığım hazır kodları kendinize göre uyarlayarak, anında sitenize yüklediğiniz dosyaları ftp bağlantısı yaparak php ile cdn sunucusuna yükletebilirsiniz.

Başlamadan önce

  • Epel Deposu Ekleme – RHEL/CentOS 4/5/6/7 deposunu kurun arkadaslar.
  • Sunucunun IP adresini cdn için kullanacağınız ip adresine yönlendirin. Ben bunun için subdomain kullanıyorum. DNS yöneticinizden A kaydı eklerken isime subdomaini, ip adresi kısmınada CDN için kullanacağımız sunucunun IP adresini girip kaydedin. Aşağıdaki resimde gösterildiği gibi:
cloudflare cdn A kaydi ekleme 1024x532 CDN server kurulumu (nginx) statik dosyalar icin ayri server Centos Nginx  statik server kurulumu statik server static server server kurulumu nginx server kurulumu Nginx kurulumu CDN server kurulumu CDN server CDN kurulumu

Başlayalım…


Nginx kurulumu

SSH terminalinden sunucuya bağlanın ve aşağıdaki kodu çalıştırın.

yum -y install nginx

Kurulumdan sonra nginx e restart atalım ve çalıştıralım. Ayrıca sunucu reboot edildikten sonra otomatik açılması için başlangıç programlarına ekleyelim.

systemctl enable nginx.service
systemctl restart nginx.service

Bu işlemden sonra cdn domainine girdiğinizde sitenizin açılıyor olması ve aşağıdaki nginx sayfasının geliyor olması gerekiyor, gelmiyorsa bir yerde yanlış yaptınız demektir:

kuaza cdn test

Websitesi icin kullanici ekleme

Websitesi ekleme anlatiminda kullanacagim terimleri yaziyorum, sizler bu terimleri kendinize gore duzenleyerek sitenizi ekleyebilirsiniz..

Kullanici ismi ve grubu: cdn_test (siz bunu kendi sitenizin ismine yakin bir kelime ile kullanabilirsiniz. Ornegin kuaza.com domaini icin kuaza ismini kullanmak gibi)

Domain: http://cdn_test.kuaza.com (kisa bir sure online olacak, sonrasinda test sunucusunu iptal edecegim icin calismayabilir)

– Kullanici/grup ekleme –

useradd cdn_test

Kullanici icin sifre belirleme

passwd cdn_test

Sifre girmenizi isteyecek, iki kere ayni sifreyi girin ve kaydedin.

Bu islemden sonra /home klasoru icerisinde cdn_test ismine bir klasor olusacak. Bu klasorun chmod ayarini ve kullanici/grup ayarlarini duzenlemek gerekli, aksi durumda yetki kontrolu sebebi ile sitemiz acilmayacak, hata mesaji ile karsilasacaksiniz.

– Chmod ayarini degistirme –

chmod 0711 /home/cdn_test

– Site dosyalari icin klasor olusturalim –

Sitenizin dosyalarini barindiracaginiz klasoru olusturacagiz simdi. Standart ve uzun yillardir default gelen ismi: public_html, ancak siz bunu istediginiz gibi degistirerek kullanabilirsiniz. Hemde guvenlik acisindan iyi olabilir ;)

mkdir -p /home/cdn_test/public_html

– Site klasorunun kullanici/grup ayarlarini duzeltme –

chown -R cdn_test:cdn_test /home/cdn_test/public_html

Bu islemlerden sonra sitemizin dosyalari ve kullanici ayarlari yapilmis oldu. Son bir islem kaldi, oda Asil isi yapacak olan Nginx tarafinda sitemizin konfigurasyonunu yapmak. Oda sonraki bolumlerde..

– Kullanıcı için ssh giriş yetkisini kaldırma –

Oluşturduğumuz kullanıcı ismi ve şifresi ile ssh giriş yetkisi otomatik oluşuyor. Bu yetkiyi güvenliğiniz kaldırmanızı öneririm, aşağıdaki şekilde kullanıcının ssh erişim yetkisini iptal etmiş oluruz:

usermod -s /sbin/nologin cdn_test

Nginx Site ekleme

Bu islemden sonra sitemiz acilir olacak. Tek yapmamiz gereken asagidaki adimlari izlemek..

– Site konfigurasyon dosyasi olusturma –

ssh terminalinde calistigimiz icin nano programi ile dosya acip, ayarlarimizi kaydedip cikacagiz. nano programi yoksa kurun bi zahmet :)

nano /etc/nginx/conf.d/cdn_test.com.conf

Acilan ekrana asagidaki ayarlari kaydedelim. Ama oncesinde bir text dosyasinda gerekli alanlari duzeltin, sonrasinda terminal ekraninda duzeltmek biraz zamaninizi alabilir:

#
# $site_ismi icin nginx konfigurasyon dosyasi
# kuaza.com
#
server {
			listen       80;

			# listen     443;
			# ssl        on;
			# ssl_certificate         /etc/nginx/ssl/cdn_test.pem;
			# ssl_certificate_key     /etc/nginx/ssl/cdn_test.key;
			#--- SSL aktif etmek icin yukaridaki satirlarin baslarindaki # isaretlerini kaldirin.---
			
			server_name  cdn_test.kuaza.com;
	 
			#charset koi8-r;
			#access_log  logs/host.access.log  main;
	 
			# Load configuration files for the default server block.
			# include /etc/nginx/default.d/*.conf;
	 
			location / {
				# CDN erisimi icin yetki vermemiz gerekli
				add_header Access-Control-Allow-Origin *;
				
				root   /home/cdn_test/public_html;
				index index.html index.htm;
			}
			
			#Statik public_htmli direk nginx ile isleyelim..
			location ~*.*\.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt|js|css|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso)$ {
			# 1 Aylik cache suresi veririz.
			expires 1M;
			root /home/cdn_test/public_html;
			}

			# 404 hata sayfasi
			error_page  404              /404.html;
			location = /404.html {
				root   /home/cdn_test/public_html;
			}
	 
			# 50x li hatalar icin hata sayfasi /50x.html
			error_page   500 502 503 504  /50x.html;
			location = /50x.html {
				root   /home/cdn_test/public_html;
			}
			# .htaccess dosyasina direkt erisimi kapatiriz.
			 location ~ /\.ht {
			 deny all;
			}
		}

Konfigurasyon dosyasinda degiseceginiz 2 yer var bunlardan birisi site dosyalarinin oldugu ana klasor ismi: cdn_test, digeride siteye ulasilacak domain ismi: https://cdn_test.kuaza.com

Bu islemden sonra ctrl + x | y + enter yaptiginizda ayarlari kaydedip dosyadan cikacaktir.

Nginx SSL aktif etme

NOT: Yukardaki nginx site ayar dosyasına SSL içinde bir alan ekledim. Siteniz için oluşturacağınız ssl key ve pem dosyalarını sunucunuzda herhangi bi yere yükleyerek, ayar dosyasındaki kısmı düzenleyerek, belirtilen satırların başındaki # karakterini silin, kaydedin ve aşağıdaki kod ile restart atık. Eğer ssl kullanmayacaksanız, SSL kısmını düzenlemenize gerek yoktur. Cloudflare ‘den Nginx için ssl anahtarı oluşturmak isteyenler bu konudan yardım alabilirler.

Cloudflare kullanmayacaksanız, elinizdeki ssl sertifikalarını sunucunuza yükleyerek, nginx dosyasındaki ayar kısmını düzenleyin ve restart atın.

Nginx sunucusuna restart atarak ayarlarin aktif olmasini saglayalim:

systemctl restart nginx.service

Ve artik sitemize ulasilabilir, ancak dosya olmadigi icin siteye girdigimizde 403 hatasi verebilir.

Nginx 403 Forbidden Hatası alırsanız çözümü burada

Makaleyi hazırlarken bu sorun olmamıştı, son dönemde karşımıza çıkıyor, bir arkadaşımızda da oluştu, bunun çözümünü anlatma gereği duyuyorum, en azından aynı sorunu yaşayan arkadaşlar için faydalı olur.

Bu hata linux un güvenlik bölümü ile alakalı, selinux ayarını değiştirmemiz yeterli olacaktır. Aşağıdaki yoldaki dosyayı düzenlemek için açın:

/etc/selinux/config

Sonrasında aşağıdaki ayarı bulun:

SELINUX=enforcing

Aşağıdaki şekilde değiştirin:

SELINUX=permissive

Sonrasında dosyayı kaydedin ve sunucuya restart atın, sonrasında hata gitmiş olacaktır. Ancak hala devam ediyorsa o kısmı komple kapatarak restart atmayı deneyin ve o şekilde test edin:

SELINUX=disabled

Bu hata eğer selinux taraflı değilse, dosya yazma izinleri yada dosya kullanıcı izinleri ile alakalı olabilir, eğer yukarıdaki ayarlara rağmen hala aynı hatayı alıyorsanız, kullanıcı ekleme kısmını dikkatlice uyguladığınızdan emin olun, o kısımdaki dosya kullanıcı izinlerini düzgün yaptığınızdan emin olun.

Centos güvenlik yazılımı Firewalld varsa!

Bazı centos kurulumlarında güvenlik yazılımı Firewalld programı da kurulu olarak gelebiliyor, bunun olması durumunda güvenlik duvarına https ve ftp portlarını açmasını belirtmek zorundayız, yoksa güvenlik yazılımı siteye erişmek isteyenlere bu alanlara ulaşımı yasaklayacaktır. Aşağıdakileri sırasıyla yaparak güvenlik duvarımız varsa yetki veriyoruz.

firewall-cmd –permanent –zone=public –add-service=http

firewall-cmd –permanent –zone=public –add-service=https

firewall-cmd –permanent –zone=public –add-service=ftp

firewall-cmd –reload

Ftp server kurulumu

Sonraki işlem ftp kurulumu. Buna neden ihtiyacımız var: sitemizdeki yüklenen yeni statik dosyaları cdn serverimiza yüklemek için kullanacağız.

Bu anlatımı ayrı bir sayfada gerçekleştirdim, ordan bakıp yaparak tekrar anlatıma devam edebilirsiniz: Centos ftp server kurulumu (vsftpd) ftp hesabı oluşturma

Bu işlemden sonra ftp bağlanıp bir resim yüklüyorum test etmek için. Çalıştığını görüyoruz ve işimiz nerdeyse bitmiş oluyor.

kuaza cdn test resim

CDN server hazır

Artık CDN sunucumuz hazır, tek yapmamız gereken sitemizdeki statik dosyaları cdn servera ftp ile bağlanarak yüklemek. Bunu root yetkisi ile daha hızlı gerçekleştirmek isterseniz burdaki konuyu takip edin: RSYNC ile sunucudan dosya yedekleme, gönderme, alma işlemleri!

CDN server oluşturduğunuzda sitenizdeki statik dosyaların linklerinide değiştirmeniz gerekecek. Bu hazır sistemler için kolay olabilir ancak bazı sistemler için zahmetli olacaktır. Buda sizin bilginize yada yazılımı hazırlayan kişinin yeteneklerine kalmış bir konu.


WordPress Yüklenen dosyaları CDN server’a otomatik yükletme

Buradaki Upload to FTP eklentisi (yedek indirme linki) ile sitenizde yüklediğiniz her dosyayı anında CDN server a otomatik olarak yükletebilirsiniz. Bu konuda ki anlatılanları yaptıktan sonra Upload to FTP eklentisini kurmanız ve ayarlarını yapmanız yeterli olacaktır.

Örnek ayarlar:

2018 04 07 2 CDN server kurulumu (nginx) statik dosyalar icin ayri server Centos Nginx  statik server kurulumu statik server static server server kurulumu nginx server kurulumu Nginx kurulumu CDN server kurulumu CDN server CDN kurulumu

CDN Server’a Dosya yükleme (php + ftp)

Sitenizdeki bütün dosyaları CDN serveriniza eklediniz, ancak her yeni yüklediğiniz dosyayı tek tek cdn server’a yüklemek eziyet olacaktır. Ben bunun için bir fonksiyon hazırladım. Kendi yazılımıza uygulayarak yüklediğiniz her statik dosyayı otomatik CDN server’iniza gönderebilirsiniz.

   $ftp_server_url = 'cdn_test_SERVER.kuaza.com';
   $ftp_kullanici_adi = 'KULLANICI_ADI';
   $ftp_kullanici_sifresi = 'KULLANICI_SIFRESI';
 
   $ftp_baglantisi = ftp_connect($ftp_server_url);
   $ftp_giris = ftp_login($ftp_baglantisi, $ftp_kullanici_adi, $ftp_kullanici_sifresi);
   if (!$ftp_baglantisi || !$ftp_giris) { die('FTP baglantisinda sorun var, lutfen bilgileri kontrol edin.'); }

   
		/*
		* Burayi foreach icerisine alarak birden fazla dosya yukleyebilirsiniz.
		*/
   
				$cdn_link_kontrol = "http://cdn_test.kuaza.com/ddd/jj/hhh/gg/ff/ddd/kuaza.png"; // Dosyanin CDN linki
				$local_dosya = "home/cdn_test/public_html/ddd/jj/hhh/gg/ff/ddd/kuaza.png"; // yuklenecek dosyanin tam yolu
				$yuklenecek_dosya_ismi= "kuaza.png"; // yuklenecek dosya ismi, degistirebilirsinizde ancak link ile ayni olmasini tavsiye ederiz, aksi durumda link alismaz ;)
				$cdn_yuklenecek_klasor = "/public_html/ddd/jj/hhh/gg/ff/ddd/"; // Dosyanin hangi klasore yuklenmesini istiyorsaniz onun tam yolu.
				
				$cdn_yuklenecek_klasor_full = $cdn_yuklenecek_klasor.$yuklenecek_dosya_ismi;

				// CDN de yuklemeye calistiginiz dosya varmi yok mu kontrol ederiz.
				$response = get_headers($cdn_link_kontrol, 1);
				
				
				if (!$response) { // fonksiyonumuz calismazsa
 
					// echo 'Unable to initiate connection.';
				
				} else { // Fonksiyon calisirsa
				
					$sonuc_parcala = explode(' ', $response[0]);
					$ext = end($sonuc_parcala); // gelen degeri parcalariz
					
					if($ext != 'OK'){ // cdn de resim yok

						/*
						* Klasor olusturma - cdn de yuklenecek klasor olusturulmamis ise olustururuz, aksi durumda yuklemez
						*/
						$klasor_parcala = explode("/",$cdn_yuklenecek_klasor);
						$klasor_sayisi = count($klasor_parcala) - 1;

						for($i=0;$i<=$klasor_sayisi;$i++) {
							
							// ilk parametre sadece / icereceginden onu es geciyoruz.
							if($i == "0")
								continue;
							
							$dosya_kontrol = array(); // array degerini her dongude sifirlariz
							
							for($y=0;$y<=$i;$y++) {
								$dosya_kontrol[] = $klasor_parcala[$y]; // klasor isimlerini array parametresine atariz.
							}

							$yeni_dosya_bak = implode("/",$dosya_kontrol); // sirali sekilde klasorleri siralariz.

							if ([email protected]_chdir($ftp_baglantisi, $yeni_dosya_bak)) { // cdn de klasor yoksa
								
								$karsi_klasor_olustur = ftp_mkdir($ftp_baglantisi, $yeni_dosya_bak); // Klasor yoksa olustururuz.
								
								if($karsi_klasor_olustur){ // klasor olusturulursa
									echo "Klasor olusturuldu: ".$yeni_dosya_bak."<hr>";
								}
							
							}
						
						}				
						/*
						* // Klasor olusturma - cdn de yuklenecek klasor olusturulmamis ise olustururuz, aksi durumda yuklemez
						*/
						
						
						
						echo "CDN de resim yok<hr>";
						$dosya_yukle = ftp_put($ftp_baglantisi, $cdn_yuklenecek_klasor_full, $local_dosya, FTP_BINARY);
						
							if($dosya_yukle){
								echo "Dosya cdn server 'a yuklendi<hr>";
							}else{
								echo "Dosya yuklenemedi<hr>";
							}
						
					 // resim varsa
					 } else { 
						
						// cdn de resim var
						echo "Yuklemeye calistiginiz dosya daha once yuklenmis ;).";
					}				
				
				
				}
				
		/*
		* // Burayi foreach icerisine alarak birden fazla dosya yukleyebilirsiniz.
		*/
	
	
   ftp_close($ftp_baglantisi);	

   
   
   
/* Link kontrol fonksiyonumuz.*/
if(!function_exists('get_headers')) {
   /**
   * @return array
    * @param string $url
    * @param int $format
    * @desc Fetches all the headers
    * @author cpurruc fh-landshut de
    * @modified by dotpointer
    * @modified by aeontech
    */
    function get_headers($url,$format=0) {
        $url_info=parse_url($url);
        $port = isset($url_info['port']) ? $url_info['port'] : 80;
        $fp=fsockopen($url_info['host'], $port, $errno, $errstr, 30);
        if($fp) {
            $head = "HEAD "[email protected]$url_info['path']."?"[email protected]$url_info['query'];
            $head .= " HTTP/1.0\r\nHost: "[email protected]$url_info['host']."\r\n\r\n";
            fputs($fp, $head);
            while(!feof($fp)) {
                if($header=trim(fgets($fp, 1024))) {
                    if($format == 1) {
                        $h2 = explode(':',$header);
                        // the first element is the http header type, such as HTTP/1.1 200 OK,
                        // it doesn't have a separate name, so we have to check for it.
                        if($h2[0] == $header) {
                            $headers['status'] = $header;
                        }
                        else {
                            $headers[strtolower($h2[0])] = trim($h2[1]);
                        }
                    }
                    else {
                        $headers[] = $header;
                    }
                }
            }
            return $headers;
        }
        else {
            return false;
        }
    }
}

Yukarıdaki kod yapısı ile kolayca sisteminize eklediğiniz bir dosyayı otomatik olarak oluşturduğunuz CDN server’iniza yükleyebilirsiniz. Kendinize göre düzenlemeniz gereken alanları kod yapısı içerisinde açıklamaya çalıştım. Takıldığınız konuları konu altından belirtirseniz yardımcı olmaya çalışırım.


WORDPRESS CDN server’a dosya gönderme! (otomatik)

Yukarda anlattığım Upload to FTP eklentisini kullanmanızı tavsiye ederim, ekstra aşağıdaki kodlarla uğraşmamış olursunuz, ancak aşağıdaki kodları kaldırmıyorum, mantığı kavrayabilmeniz için.

Suanki kuaza.com sisteminde de kullandığım bu kodları yararı olacağını ve ihtiyaç sahiplerininde faydalanacağı düşüncesi ile paylaşıyorum. Bu kod betiğini hazırlamam kolay olmadı tabi ;)

Aşağıdaki kodu herhangi bir eklentinizin yada tema dosyanızdaki function.php dosyasının sonuna eklerseniz, konu yazarken yüklediğiniz resimleri, konuyu yayınladığınızda yada onizleme için açtığınızda otomatik olarak CDN server’iniza gönderecek.

add_action( 'save_post', 'kuaza_cdn_dosya_yukle' );

/*
Fonksiyona verilen konu ID sine ait ekleri CDN serverina yukler.
*/
function kuaza_cdn_dosya_yukle( $post_id ) {

	/*if ( wp_is_post_revision( $post_id ) )
		return;*/

   $ftp_server_url = 'cdn_test.kuaza.com';
   $ftp_kullanici_adi = 'FTP_KULLANICI_ADI';
   $ftp_kullanici_sifresi = 'FTP_KULLANICI_SIFRESI';
   $cdn_server_url = "http://cdn_test.kuaza.com/"; // son kisima slash (/) eklemeyi unutmayin lutfen.
   $local_user_klasor = "home/local_user"; // burasi sunucunuzun sitenize atadigi klasoru belirtin. - home/local_user/public_html/wp-content...	

		$attachments = get_posts( array(
			'post_type' => 'attachment',
			'posts_per_page' => -1,
			'post_parent' => $post_id
		) );

		if ( $attachments ) {
 
   $ftp_baglantisi = ftp_connect($ftp_server_url);
   $ftp_giris = ftp_login($ftp_baglantisi, $ftp_kullanici_adi, $ftp_kullanici_sifresi);
   if (!$ftp_baglantisi || !$ftp_giris) { /*die('FTP baglantisinda sorun var, lutfen bilgileri kontrol edin.');*/ }

	$upload_dir = wp_upload_dir();

			foreach ( $attachments as $attachment ) {
			
				// Dosya turu resim ise burasi calisir. Resme ait butun boyutlari yuklemek icin.
				if(in_array($attachment->post_mime_type,array("image/gif","image/png","image/jpg","image/jpeg","image/bmp","image/jp2","image/iff","image/vnd.wap.wbmp","image/xbm","image/vnd.microsoft.icon","image/tiff","image/psd"))){
				
					// resme ait butun boyutlari listeletiriz.
					foreach(kuaza_resim_boyutlari_listele() as $boyutcuk){
						
					$resim_direkt = wp_get_attachment_image_src( $attachment->ID,$boyutcuk );
					$cdnlink = str_replace("https://kuaza.com", "http://cdn.kuaza.com", $resim_direkt[0]);
					
					/*
					* Burayi foreach icerisine alarak birden fazla dosya yukleyebilirsiniz.
					*/

					$cdn_link_kontrol = str_replace(site_url('/'), $cdn_server_url, $resim_direkt[0]); // Dosyanin CDN linki
					$local_dosya = str_replace($upload_dir['baseurl'],$upload_dir['basedir'],$resim_direkt[0]); // yuklenecek dosyanin tam yolu
					$yuklenecek_dosya_ismi= basename($resim_direkt[0]); // yuklenecek dosya ismi, degistirebilirsinizde ancak link ile ayni olmasini tavsiye ederiz, aksi durumda link alismaz ;)
					$cdn_yuklenecek_klasor = str_replace($local_user_klasor, "", str_replace(basename($resim_direkt[0]), "",$local_dosya)); // Dosyanin hangi klasore yuklenmesini istiyorsaniz onun tam yolu.
					
					$cdn_yuklenecek_klasor_full = $cdn_yuklenecek_klasor.$yuklenecek_dosya_ismi;

					// CDN de yuklemeye calistiginiz dosya varmi yok mu kontrol ederiz.
					$response = get_headers($cdn_link_kontrol, 1);

					if (!$response) { // fonksiyonumuz calismazsa
	 
						// echo 'Unable to initiate connection.';
					
					} else { // Fonksiyon calisirsa
					
						$sonuc_parcala = explode(' ', $response[0]);
						$ext = end($sonuc_parcala); // gelen degeri parcalariz
						
						if($ext != 'OK'){ // cdn de resim yok

							/*
							* Klasor olusturma - cdn de yuklenecek klasor olusturulmamis ise olustururuz, aksi durumda yuklemez
							*/
							$klasor_parcala = explode("/",$cdn_yuklenecek_klasor);
							$klasor_sayisi = count($klasor_parcala) - 1;

							for($i=0;$i<=$klasor_sayisi;$i++) {
								
								// ilk parametre sadece / icereceginden onu es geciyoruz.
								if($i == "0")
									continue;
								
								$dosya_kontrol = array(); // array degerini her dongude sifirlariz
								
								for($y=0;$y<=$i;$y++) {
									$dosya_kontrol[] = $klasor_parcala[$y]; // klasor isimlerini array parametresine atariz.
								}

								$yeni_dosya_bak = implode("/",$dosya_kontrol); // sirali sekilde klasorleri siralariz.

								if ([email protected]_chdir($ftp_baglantisi, $yeni_dosya_bak)) { // cdn de klasor yoksa
									
									$karsi_klasor_olustur = @ftp_mkdir($ftp_baglantisi, $yeni_dosya_bak); // Klasor yoksa olustururuz.
									
									if($karsi_klasor_olustur){ // klasor olusturulursa
										//echo "Klasor olusturuldu: ".$yeni_dosya_bak."<hr>";
									}
								
								}
							
							}				
							/*
							* // Klasor olusturma - cdn de yuklenecek klasor olusturulmamis ise olustururuz, aksi durumda yuklemez
							*/
							
							//echo "CDN de resim yok<hr>";
							$dosya_yukle = ftp_put($ftp_baglantisi, $cdn_yuklenecek_klasor_full, $local_dosya, FTP_BINARY);
							
								if($dosya_yukle){
									//echo "Dosya cdn server 'a yuklendi<hr>";
								}else{
									//echo "Dosya yuklenemedi<hr>";
								}
							
						 // resim varsa
						 } else { 
							
							// cdn de resim var
							//echo "Yuklemeye calistiginiz dosya daha once yuklenmis ;).";
						}				
		
					}
					
					/*
					* // Burayi foreach icerisine alarak birden fazla dosya yukleyebilirsiniz.
					*/
				
					}			
				
				// ek resim degil ise, dosya olarak eklenmis ise burasi calisir..
				}else{
					
					$resim_direkt = $attachment->guid;

					/*
					* Burayi foreach icerisine alarak birden fazla dosya yukleyebilirsiniz.
					*/
	
					$cdn_link_kontrol = str_replace(site_url('/'), $cdn_server_url, $resim_direkt); // Dosyanin CDN linki
					$local_dosya = str_replace($upload_dir['baseurl'],$upload_dir['basedir'],$resim_direkt); // yuklenecek dosyanin tam yolu
					$yuklenecek_dosya_ismi= basename($resim_direkt); // yuklenecek dosya ismi, degistirebilirsinizde ancak link ile ayni olmasini tavsiye ederiz, aksi durumda link alismaz ;)
					$cdn_yuklenecek_klasor = str_replace($local_user_klasor, "", str_replace(basename($resim_direkt), "",$local_dosya)); // Dosyanin hangi klasore yuklenmesini istiyorsaniz onun tam yolu.
					
					$cdn_yuklenecek_klasor_full = $cdn_yuklenecek_klasor.$yuklenecek_dosya_ismi;

					// CDN de yuklemeye calistiginiz dosya varmi yok mu kontrol ederiz.
					$response = get_headers($cdn_link_kontrol, 1);

					if (!$response) { // fonksiyonumuz calismazsa
	 
						// echo 'Unable to initiate connection.';
					
					} else { // Fonksiyon calisirsa
					
						$sonuc_parcala = explode(' ', $response[0]);
						$ext = end($sonuc_parcala); // gelen degeri parcalariz
						
						if($ext != 'OK'){ // cdn de resim yok

							/*
							* Klasor olusturma - cdn de yuklenecek klasor olusturulmamis ise olustururuz, aksi durumda yuklemez
							*/
							$klasor_parcala = explode("/",$cdn_yuklenecek_klasor);
							$klasor_sayisi = count($klasor_parcala) - 1;

							for($i=0;$i<=$klasor_sayisi;$i++) {
								
								// ilk parametre sadece / icereceginden onu es geciyoruz.
								if($i == "0")
									continue;
								
								$dosya_kontrol = array(); // array degerini her dongude sifirlariz
								
								for($y=0;$y<=$i;$y++) {
									$dosya_kontrol[] = $klasor_parcala[$y]; // klasor isimlerini array parametresine atariz.
								}

								$yeni_dosya_bak = implode("/",$dosya_kontrol); // sirali sekilde klasorleri siralariz.

								if ([email protected]_chdir($ftp_baglantisi, $yeni_dosya_bak)) { // cdn de klasor yoksa
									
									$karsi_klasor_olustur = @ftp_mkdir($ftp_baglantisi, $yeni_dosya_bak); // Klasor yoksa olustururuz.
									
									if($karsi_klasor_olustur){ // klasor olusturulursa
										//echo "Klasor olusturuldu: ".$yeni_dosya_bak."<hr>";
									}
								
								}
							
							}				
							/*
							* // Klasor olusturma - cdn de yuklenecek klasor olusturulmamis ise olustururuz, aksi durumda yuklemez
							*/
							
							//echo "CDN de resim yok<hr>";
							$dosya_yukle = ftp_put($ftp_baglantisi, $cdn_yuklenecek_klasor_full, $local_dosya, FTP_BINARY);
							
								if($dosya_yukle){
									//echo "Dosya cdn server 'a yuklendi<hr>";
								}else{
									//echo "Dosya yuklenemedi<hr>";
								}
							
						 // resim varsa
						 } else { 
							
							// cdn de resim var
							//echo "Yuklemeye calistiginiz dosya daha once yuklenmis ;).";
						}				

					}
					
					/*
					* // Burayi foreach icerisine alarak birden fazla dosya yukleyebilirsiniz.
					*/
				
				}
			}

   ftp_close($ftp_baglantisi);				
			
		}

}


/*
* link kontrol fonksiyonumuz.
*/
if(!function_exists('get_headers')) {
   /**
   * @return array
    * @param string $url
    * @param int $format
    * @desc Fetches all the headers
    * @author cpurruc fh-landshut de
    * @modified by dotpointer
    * @modified by aeontech
    */
    function get_headers($url,$format=0) {
        $url_info=parse_url($url);
        $port = isset($url_info['port']) ? $url_info['port'] : 80;
        $fp=fsockopen($url_info['host'], $port, $errno, $errstr, 30);
        if($fp) {
            $head = "HEAD "[email protected]$url_info['path']."?"[email protected]$url_info['query'];
            $head .= " HTTP/1.0\r\nHost: "[email protected]$url_info['host']."\r\n\r\n";
            fputs($fp, $head);
            while(!feof($fp)) {
                if($header=trim(fgets($fp, 1024))) {
                    if($format == 1) {
                        $h2 = explode(':',$header);
                        // the first element is the http header type, such as HTTP/1.1 200 OK,
                        // it doesn't have a separate name, so we have to check for it.
                        if($h2[0] == $header) {
                            $headers['status'] = $header;
                        }
                        else {
                            $headers[strtolower($h2[0])] = trim($h2[1]);
                        }
                    }
                    else {
                        $headers[] = $header;
                    }
                }
            }
            return $headers;
        }
        else {
            return false;
        }
    }
}

	/*
	* Ek dosyasina (resmine) ait butun boyutlari listeler
	*/
  function kuaza_resim_boyutlari_listele(){
     global $_wp_additional_image_sizes;
     	$sizes = array();
		$boyut = array();
 		foreach( get_intermediate_image_sizes() as $s ){
 			$sizes[ $s ] = array( 0, 0 );
 			if( in_array( $s, array( 'thumbnail', 'medium', 'large' ) ) ){
 				$sizes[ $s ][0] = get_option( $s . '_size_w' );
 				$sizes[ $s ][1] = get_option( $s . '_size_h' );
 			}else{
 				if( isset( $_wp_additional_image_sizes ) && isset( $_wp_additional_image_sizes[ $s ] ) )
 					$sizes[ $s ] = array( $_wp_additional_image_sizes[ $s ]['width'], $_wp_additional_image_sizes[ $s ]['height'], );
 			}
 		}

			$boyut[] = "full";
			
 		foreach( $sizes as $size => $atts ){
			
			$boyut[] = $size;
 		}
		
		return $boyut;
 }

Yukardaki kod betiğinide kendinize göre düzenlemeniz gerekmekte, ben gerekli açıklamaları yaptım, anlamadığınız yerleri sorarsanız çözmeye çalışırız.

Bu konuda basit bir eklenti hazırlayabilirim ilerde…

Ben kuaza.com da WP Super cache eklentisini kullanıyorum. Bu eklentinin CDN özelliği bulunuyor, bunu açtım ve yukardaki şekilde ayrı bir sunucu (vds) oluşturup wordpress için belirttiğim kod betiğini kullandım. suan sorunsuz şekilde Yeni yüklenen resimler kolayca CDN server’imiza gönderiliyor. Tavsiye ettiğim ve kullanımının yarar sağlayacağını düşündüğüm bir konu olduğu için okuyucularımızla paylaşma ihtiyacı duydum. 1 günümü yedi bitirdi ama ileriye dönük herzaman kontrol edeceğimiz bir çalışma oldu.

Hatamız olduysa affola, lütfen bana bildirin, konuyu o yönde güncelleyeceğim.

17 YORUMLAR

  1. Merhaba

    Türkiye için ufak çapta bir CDN ağı oluşturmak istiyorum. DNS tabanlı. Sunucular da istanbul, ankara ve doğu kısımda olmak üzere en fazla 3 adet. Acaba nginx + FreeBsd yeterli olur mu ilk etapta? Ticari bir amacım yok. Amaç tecrübe, eğitim ve faydalı olmak.

    Detaylı yazı için sonsuz teşekkürler.

    • Bence yeterli olur, sonucda isin yukunu nginx ustlenecek, isletim sistemini minumum duzeyde tutarak donanimindan daha fazla yararlanabilirsiniz. Sunucularin birbiri ile iletisimde kalmasinida saglayabilirsiniz, boylece cdn amacina ulasmis olur, birinde sorun olursa diger sunucudan veri gosterecek sekilde yani. Net hatirlamiyorum ama upstrim nginx ayarini arastirmani oneririm.

      Kolay gelsin.

  2. Hocam bu mükemmel paylaşım için teşekkür ediyorum. Pull cdn sistemlerinde olduğu gibi dosyaları otomatik alsaymış çok ama çok güzel olurmuş (wp kullanmayanlar için). Sence bu işi nasıl yapabiliriz fikir verebilirmisin ?

    • guzel fikir ancak bunu nginx ile yapmak mumkun degil sanirim, ancak sunucuya php kurarak CDN server da olmayan dosyalari belli bir php dosyasina yonlendirerek ana sunucuda kontrol yaptirilarak ana sunucuya cektirilebilir. Bu konuda yakinda yeni bir makale hazirlayabilirim, takipde kalin :)

CEVAP VER

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.