
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?
40 40 dakika.
Bu makalede anlatılanlar ve izlemeniz gereken başlıklar aşağıda listelenmiştir.
- Gerekli uygulamaların kurulumu ve ayarlar
Nginx için epel deposunu kurmamız gerekli, bununla ilgili anlatım kısmı.
- Nginx kurulumu
Centos sunucularda nginx kurulumu ve ayarları
- 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
- Nginx Site ekleme
Nginx tarafından kullanılacak olan site bilgilerini ve ayarlarını oluşturacağız.
- Nginx SSL aktif etme
Nginx sunucularda ssl yi aktif etmek için yapmanız gerekenler.
- Ftp server kurulumu
Cdn sunucusuna erişebileceğimiz bir ftp kurulumunu anlatıyoruz
- Centos güvenlik yazılımı Firewalld varsa!
Centos sunucularda firewalld programı yüklü ise, güvenlik ayarlarını yapmamız gerekiyor.
- 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.
- 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.
- 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:

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:

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.makaleci.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
# makaleci.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.makaleci.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.makaleci.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.

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:
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.makaleci.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.makaleci.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 ".@$url_info['path']."?".@$url_info['query'];
$head .= " HTTP/1.0\r\nHost: ".@$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 makaleci.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.makaleci.com';
$ftp_kullanici_adi = 'FTP_KULLANICI_ADI';
$ftp_kullanici_sifresi = 'FTP_KULLANICI_SIFRESI';
$cdn_server_url = "http://cdn_test.makaleci.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://makaleci.com", "http://cdn.makaleci.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 ".@$url_info['path']."?".@$url_info['query'];
$head .= " HTTP/1.0\r\nHost: ".@$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 makaleci.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.
Çok yararlı bilgiler. Teşekkür ederim.
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.
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 :)
Heyecanla takipteyim hocam görüşmek üzere saygılar.
i0.wp.com/kuaza.com gibi adresi nasıl edindiniz hocam bize böyle bişey lazım
Biz bu ozelligi kullanmiyoruz ancak anlayatim. Jetpack eklentisini kurun ve ayarlardan burdaki resimki kismi acin: https://d.piclect.com/o170515_58e62.png Bu kadar.
Bu ozellik bir jetpack hizmetidir ve ucretsizdir.
Merhaba,
Hocam söylediklerini harfiyen yaptım fakat cdn hizmetini devreye aldığımda sitemdeki dosyalar eksik yükleniyor. Sanırım atladığım bir yerler var. Bana mail adresim üzerinden ulaşabilir misiniz ?
Kuaza döktürmüşsün
Tesekkurler kardesim :)
Günümüzde olmazsa olmaz artık cdn, en az orta projeler için mutlaka gerekli. Güzel anlatılmış teşekkürler.
hocam merhabalar video servisi için ne önerirsiniz yüksek bant yiyecektir bunun için bir taktik vs var mı
nginx icin striming ozelligi olmasi lazim ama hic calisma ve arastirma yapmadim. Bi bakip geri donerim size. Siz tam olarak ne istiyorsunuz ?
Güzel anlatımınız için teşekkür ederiz hocam.
Emek harcıyor öğreniyor ve paylaşıyorsunuz seviyorum sizin gibi insanları sayınızın artması dileğiyle.
Zaman harcayıp bu güzel yorumu yazmanızda bizi daha çok motive ediyor ve daha çok yazma hissi kazandırıyor. Teşekkürler.