Administratorii site-urilor cu trafic elevat (>20k unici/zi) folosesc CDN (Content Network Delivery) pentru a le ține pe picioare în fața fluxului mare de vizitatorii, dar un CDN poate fi interesant și pentru site-uri cu trafic modest, în special pentru cele găzduite pe shared hosting, din diverse motive. Primul și cel mai important motiv sunt vizitatorii care, de cele mai multe ori, dacă site-ul se încarcă puțin mai greu decât cele pe care obișnuiesc să le viziteze, îl părăsesc și pornesc în căutarea altuia. Ar fi păcat să pierdem clienți sau, în cazul unui blog, cititori noi care pot deveni abonați, doar din cauză că site-ul nu a răspuns așteptărilor lor!

Google App EngineUn alt motiv bun este poziționarea în motoarele de căutare. Toți posesorii de site-uri știu că acestea plasează în primă poziție site-urile cu conținut de calitate și, în momentul în care nu pot face diferențierea doar din acest punct de vedere (evident, mai sunt și alte criterii de clasificare, irelevante în acest context), îl urcă deasupra pe cel mai rapid.

În plus, și chiar dacă nu bag mâna în foc pentru asta, se mai spune și că protocolul browserelor nu permite descărcarea a mai mult de 4 fișiere simultan. Cei care susțin această teorie insistă pe faptul că un site cu 16 fișiere statice se încarcă mult mai rapid dacă respectivele fișiere sunt găzduite în loturi de câte patru pe domenii ori subdomenii diferite, deoarece browserele le pot descărca în paralel, nemaifiind nevoite să aștepte descărcarea completă a primelor patru. Tind să cred că e adevărat, altfel nu-mi explic de ce inclusiv Google, pe principalele sale site-uri, ar servi toate fișierele statice alte domenii și subdomenii (ex: fișierele statice ale YouTube, sunt servite prin ytimg.com și subdomeniile lui).

Un CDN în schimb, pe lângă avantajele despre care v-am vorbit în paragrafele de mai sus, va servi vizitatorilor din Australia o copie a fișierelor de pe serverul pe care este găzduit site-ul, dar de pe un server aflat în vecinătate, în timp ce utilizatorilor din SUA le va furniza copia fișierelor originale, aflate pe un server dintr-un data center aflat în această țară. Astfel, încărcarea respectivelor fișiere și implicit a site-ului, incontestabil, se va realiza mult mai rapid.

Printre cei mai renumiți furnizori de servicii CDN se numără Amazon (utilizat de Dropbox și alte servicii asemănătoare), Akamai (ex: Facebook, eMag), MaxCDN (ex: The Next Web, StumbleUpon,), CDN77 (ideal pentru site-uri vizite din România deoarece dispune de servere în București) și Google Cloud Platform (ex: Best Buy, Ubisoft, Rovio).

Singura piedică în calea folosirii unui CDN este prețul, destul de piperat mai ales pentru cei care nu câștigă bani de pe urma site-ului, sau, cel puțin, nu câștigă suficient încât să-și permită să investească într-o astfel de rețea.

În astfel de situații și pentru acest tip de posesori de site-uri, soluția despre care vă voi vorbi în continuare este cea ideală, aceasta fiind gratuită. În plus, are la bază infrastructura Google, probabil cea mai puternică dintre cele existente în momentul de față.

Configurare CDN gratuit prin Google App Engine

Google App Engine, pentru cine nu știe despre ce este vorba, e o platformă cloud a Google care oferă pachete gratuite aplicațiilor care îndeplinesc anumite condiții sau, și mai bine spus, dacă acestea nu sunt depășite anumite praguri. Evident, e vorba de cereri (numărul acestora fiind limitat la 7 mil./lună), trafic (acesta fiind limitat la 1 GB/zi) și instanțe Frontend (28 de ore/zi acumulate).

Tutorialul de față se bazează pe o metodă aplicată de mine ani în șir, mai exact din 2008, când a fost publicată de un coleg de breaslă, Agusti Pons. Pentru a-l pune în practică, tot ce aveți nevoie este un cont Google, un PC cu Windows și aplicațiile Python și App Engine Launcher.

1. Crearea unei aplicații noi în Google App Engine

Pentru a crea o aplicație nouă în Google App Engine, accesați appspot.com. Conectați-vă folosind contul Google actual și, la vederea butonului de creare a unei aplicații noi, apăsați-l!

creare aplicatie google app engine

Imediat după, vi se va cere să confirmați contul introducând numărul de telefon la care puteți primi SMS-ul cu codul de validare. Teoretic, mesajul va sosi în cel mult 15 minute, practic, uneori puteți aștepta recepționarea lui zile în șir. Aveți răbdare și așteptați. Puteți opta și pentru primirea codului de activare printr-un apel vocal, dar alegând această variantă nu veți grăbi în vreun fel procesul de activare.

După activarea contului, creați o nouă aplicație cu numele și titlul dorit (dacă este disponibil):

creare și denumirea unei aplicatii app engine

După crearea aplicației, dați click pe logo-ul Google App Engine pentru a o accesa. În pagina următoare, dați click pe numele ei pentru a o gestiona. Ar trebui să vedeți un panou identic cu cel din captura de ecran de mai jos.

gestionare aplicatie app engine

Dacă ați ajuns până la acest punct, puteți închide pagina Google App Engine deoarece nu veți mai avea nevoie de ea foarte curând. Urmează să creăm și configurăm fișierele care vor transforma această aplicație într-un CDN gratuit.

2. Crearea fișierelor necesare configurării unui CDN în Google App Engine

Înainte de a descărca și instala ultima versiune a Python și respectiv, ultima versiune a Google App Engine Launcher, creați un folder cu numele AppengineCDN la rădăcina partiției C. După ce l-ați creat, accesați-l și creați în interiorul său alte 3 foldere: css, images și js. E important să folosiți aceste nume pentru a nu fi nevoiți să modificați scriptul care va permite setarea headerelor fișierelor ce vor fi găzduite pe CDN-ul alocat în Google App Engine!

appenginecdn

În continuare, faceți click dreapta în folderul AppengineCDN » New » Text document. Dați noului document numele deploy. Repetați acțiunea pentru a crea alte două documente text, pe care le veți cacheheaders și respectiv, app.

Deschideți documentul app și, cu copy/paste, introduceți în acesta următoarele rânduri (bineînțeles, înainte de a salva documentul, asigurați-vă că ați înlocuit „cristianlsro” cu numele pe care i l-ați dat aplicației voastre!):

application: cristianlsro
version: 1
runtime: python
api_version: 1

handlers:
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico

- url: /images/favicon.ico
  static_files: favicon.ico
  upload: favicon.ico

- url: /.*
  script: cacheheaders.py

La salvarea documentului, ștergeți-i extensia „.txt” pentru a deveni .yaml.

În continuare, deschideți documentul cacheheaders și lipiți în acesta următoarele rânduri:

import wsgiref.handlers
from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):

  def output_file(self, path, lastmod):
    import datetime
    try:
      self.response.headers['Cache-Control']='public, max-age=31536000'
      self.response.headers['Last-Modified'] = lastmod.strftime("%a, %d %b %Y %H:%M:%S GMT")
      expires=lastmod+datetime.timedelta(days=365)
      self.response.headers['Expires'] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
      fh=open(path, 'r')
      self.response.out.write(fh.read())
      fh.close
      return
    except IOError:
      self.error(404)
      return

  def get(self, dir, file, extension):
    if (dir!='js' and dir!='css' and dir!='images'):
      self.error(404)
      return

    if (extension!='js' and extension!='css' and extension!='jpg' and extension!='png' and extension!='gif'):
      self.error(404)
      return

    if extension=='js':
      self.response.headers['Content-Type'] = 'application/x-javascript'
    elif extension=='css':
      self.response.headers['Content-Type'] = 'text/css'
    elif extension=='jpg':
      self.response.headers['Content-Type'] = 'image/jpeg'
    elif extension=='gif':
      self.response.headers['Content-Type'] = 'image/gif'
    elif extension=='png':
      self.response.headers['Content-Type'] = 'image/png'

    try:
      import os
      import datetime
      path = dir+'/'+file+"."+extension
      info = os.stat(path)
      lastmod = datetime.datetime.fromtimestamp(info[8])
      if self.request.headers.has_key('If-Modified-Since'):
        dt = self.request.headers.get('If-Modified-Since').split(';')[0]
        modsince = datetime.datetime.strptime(dt, "%a, %d %b %Y %H:%M:%S %Z")
        if modsince >= lastmod:
        # The file is older than the cached copy (or exactly the same)
          self.error(304)
          return
        else:
        # The file is newer
          self.output_file(path, lastmod)
      else:
        self.output_file(path, lastmod)
    except:
      self.error(404)
      return

def main():
  application = webapp.WSGIApplication([(r'/(.*)/([^.]*).(.*)', MainPage)], debug=False)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()

La salvare, schimbați extensia documentului cacheheaders în .py. Acest document va bloca accesul la foldere, va indica browserelor că favicon-ul se află în folderul images (aveți grijă să-l și puneți acolo) și va seta headerele fișierelor găzduite pe CDN-ul creat în Google App Engine, astfel încât să nu mai fie redescărcate de utilizatorii care au revenit pe site, dacă acestea nu au fost modificate între timp. Resursele sunt limitate și ar fi păcat să le consumăm degeaba cu vizitatorii ale căror browsere încă le găzduiesc!

După cum ați ghicit, urmează editarea documentului deploy, lucru pe care nu îl puteți face de moment, deoarece nu ați instalat Python și Google App Engine Launcher. Descărcați-le și instalați-le pe ambele, prima dată Python și mai apoi Google App Engine Launcher.

După instalarea ambelor aplicații, deschideți documentul  deploy și introduceți în acesta următoarele:

appcfg.py update C:AppengineCDN

Salvați documentul și modificați-i extensia în .bat!

După ce ați făcut acest lucru, folderul aplicației care va găzdui fișierele pe CDN-ul creat în Google App Engine ar trebui să arate identic cu cel din captura de ecran de mai jos:

AppengineCDN aspect final

În continuare, introduceți în folderul „css” documentele css pe care doriți să le găzduiți pe CDN-ul creat în Google App Engine, în folderul „imagesimaginile și în folderul „js„, fișierele ‎JavaScript.

3. Încărcarea fișierelor în aplicația Google App Engine

Pentru a încărca tot conținutul folderului AppengineCDN în aplicația creată mai devreme, deschideți Google App Engine Launcher. Va raporta o eroare. Închideți fereastra și, în Google App Engine Launcher accesați Edit » Preferences. Configurați lansatorul. Aveți însă grijă să indicați rutele reale spre executabilul python, a folderului în care a fost instalat lansatorul și respectiv, a editorului text pe care îl veți utiliza (eu am optat pentru Notepad++, dar dacă nu dispuneți de el, indicați ruta spre WordPad ori Notepad):

Configurare App Engine Launcher

După ce ați salvat modificările, reveniți la App Engine Launcher și accesați » File » Add Existing Application. Indicați asistentului folderul AppengineCDN:

Adaugarea aplicatiei CDN

După ce ați indicat folderul, selectați aplicația și apăsați butonul Deploy:

Deploy CDN App Engine Launcher

Pentru a putea lansa aplicația, va cere să introduceți adresa de email completă și parola de acces la contul Google. După ce le-ați introdus, Google App Engine Launcher va începe încărcarea aplicației (conținutul folderului AppengineCDN) și vă va ține la curent cu operațiile realizate într-o nouă fereastră ce se va deschide. După ce fișierele au fost încărcate, veți vedea mesajul „You can close this window now„:

Aplicatia CDN  lansata

Pentru a confirma că totul funcționează corect, accesați cu ajutorul browserului orice fișier găzduit în noul vostru CDN gratuit găzduit în Google App Engine:

CDN App Engine functional

Dacă vedeți fișierul, nu-mi rămâne decât să vă felicit! Tocmai dispuneți de propriul vostru CDN gratuit! Tot ce mai aveți de făcut este să modificați header-ul temei blogului sau a site-ului, și să înlocuiți url-ul logo-ului, a fișierului sau a fișierelor css și javascript cu cel al CDN-ului.

Recomandare

Dacă site-ul pentru care ați creat CDN-ul înregistrează peste 3000 de vizite/zi, indicat ar fi să creați câte o aplicație —Google App Engine permite crearea a maximum 10 aplicații— pentru fiecare fișier în parte, pentru a nu avea probleme cu consumul de resurse spre finalul zile, situație în care ați fi buni de plată (puteți consulta aici lista tarifelor practicate). Țineți cont că limitele sunt aplicate la nivel de aplicație, nu la nivel de cont!

2 comentarii

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.