Cloudflare: CDN gratuito

Te has pasado dos semanas optimizando tu blog desinstalando plugins innecesarios, instalando otros imprescindibles, limpiando la base de datos, optimizandoe las imágenes, y ahora que has reducido los tiempos de carga a menos de un segundo, ya no queda nada que puedas mejorar en la aplicación para reducirlos, pero te has quedado con ganas de más.

El próximo paso es reducir los tiempos de conexión.

Un wordpress sencillo puede requerir que el cliente haga más de 50 conexiones al servidor para descargar todos los recursos necesarios. En un servidor con las configuraciones habituales, establecer cada una de estas conexiones puede llevar desde 40ms a más de 500, según el servidor el número de peticiones y la red.

Detalle del análisis de http://tools.pingom.com

Los tiempos de carga aumentan cuando se realizan varias conexiones al mismo servidor.

Aunque es un tiempo de carga bajo comparado con la ejecución de un php, nos da cierto margen para mejorar. Es posible conseguir cierto incremento modificando la configuración del servidor, y utilizando subdominios específicos para contenido estático, para abrir conexiones simultáneas y reducir la información que envía y recibe el navegador, pero la configuración es larga y complicada. Otros método que dará mejores resultados inviertiendo menos tiempo es utilizar un CDN

La función CDN es reducir los tiempos de carga de una web, sirviendo el contenido desde localizaciones geográficas cercanas al usuario final y mediante servidores especializados.

Akamai es el ferrari de los CDN, aunque sus soluciones van más alla. Increiblemente rápido, efectivo y caro, hace el trabajo para el que ha sido diseñado a la perfección… por algo es la solución de los grandes: http://www.akamai.com/html/customers/customer_list.html.

Pero no todos nos podemos permitir un ferrari, y si lo que buscamos es una solución amateur o profesional  “low cost”, CloudFlare puede encajar muy bien en nuestras necesidades.

Por coste hay pocas ofertas mejores: el plan más básico es de 0 €. Si necesitas SSL, tendrás que contratar el plan PRO (20€), que también ofrece un WAF (ojo, con reservas).

La configuración es sencilla: ofrecen un “asistente” tipo windows, que te guiará a lo largo del proceso. La parte más lenta será esperar a que se produzca la propagación de DNS, especialmente si tienes un .es.

Una vez configurada la cuenta y actualizados los DNS, cloudflare recibirá las peticiones destinadas a nuestra aplicación, y, si son recursos estáticos (imágens, css, js o similares) que tiene cacheados los servirá directamente, en caso negativo, los pedirá a nuestro servidor y servirá al cliente, guardando una copia en su caché.

En mi caso, los tiempos de carga se han reducido de forma considerable

cloudnexion

El tiempo de conexión más largo: 16ms…

Como puedes ver en esta imagen, el número de peticiones que haces en la página principal de mi blog es bastante reducido, lo que mejora de forma considerable el tiempo de carga. Pero eso va a quedar para un próximo post.

13. September 2014 by Xavier
Categories: Alojamiento | Leave a comment

Optimizando WordPress

Hay múltiples razones para “optimizar” tu blog, por ejemplo:

  • evitar que tu proveedor te corte el servicio por un consumo excesivo
  • mejorar el posicionamiento
  • mejorar la experiencia de usuario
  • ahorrar en alojamiento, con una VPS de 256mb
  • vicio

Hay pasos obvios, como eliminar todos los plugins no indispensables, hacer limpieza en la BBDD, reducir el tamaño de las imágenes…

Pero si quieren mantener (casi) toda la funcionalidad de tu blog, y asimilar generosos picos de visitas, la forma más efectiva será cachear.

¿En que consiste el cacheo?

Cada vez que uno de tus usuarios visita una página de tu blog, wordpress la crea a partir de los datos almacenados en la base de datos y los recursos almacenados en disco. Este proceso no debería superar los 2 segundos en una situación ideal… pero aún así es mucho más lento que servidor un recurso estático (css, js o html), que suele tardar apenas 200-300 milésimas de segundo.

Cachear consiste en transformar cada página en un recurso estático que se actualiza cuando modificas el contenido o recibes un comentario.

Sistemas de cacheo

Plugins: Supercache y W3 Total Cache.

Ambos plugins trabajan de una forma similar: incluyen código en WordPress que tras crear la web, guarda el html resultante en un directorio del servidor, instruyendo a apache para que consulte la url en ese directorio y solo ejecute el php en caso de que no exista versión estática.

https://wordpress.org/plugins/w3-total-cache/

https://wordpress.org/plugins/wp-super-cache/

Desde mi punto de vista, este sistema es totalmente indispensable, y creo que debería integrarse en el código de wordpress.

Utilizad el método mod_rewrite… vuestro proveedor estará encantado de ayudaros si tenéis algún problema, sobre todo si estáis en un servidor compartido, en el que vuestros excesos perjudican al resto de usuarios.

Aquí un enlace a un tutorial para su instalación:

http://www.webmasseo.com/wp-super-cache-acelerar-wordpress/

Memcached

Es un servidor que cachea “cosas” en memoria, y las devuelve del caché. Se utiliza habitualmente para almacenar resultados de MySQL, pero no he apreciado nunca incrementos de velocidad al utilizarlo.

Requiere la instalación de software en el servidor, y no utiliza autenticación, por lo que no es una solución apta para entornos compartidos. Además incrementa el consumo de RAM, así que también queda descartada en soluciones low cost como mi VPS de 256mb.

APC, eAccelerator, Xcache

Los archivos php son texto plano, lo que facilita el desarrollo y mantenimiento, pero ralentiza la ejecución. Estos sistemas (OpCode Cache) aceleran la ejecución de los PHP al cachear el código en un formato más “apto” para el uso por parte del sistema, de una forma similar a como lo hace java.

La Puntilla

La velocidad media de descarga de tu blog es de 0,7 segundos, y puedes asimilar picos de 100 usuarios simultáneos sin que esto cause problemas al servidor, pero quieres más.

Si vives de tu blog, y te da para vivir muy bien: contrata Akamai. Esta solución te dará la mejor velocidad posible desde cualquier parte del mundo.

En caso contrario, CloudFlare ofrece planes desde 0 euros, con funciónes de CDN y minimización de código automática.

Este blog utiliza el servicio gratuito de cloudflare, y la verdad es que estoy encantado… pero más sobre este punto “pronto”

 

 

06. September 2014 by Xavier
Categories: Alojamiento, Tecnología | 1 comment

Servidor web en una VPS de 256MB

Hasta hoy, este blog se alojaba en un servidor compartido de dreamhost. Había contratado un buen plan, gracias a esta oferta (ya caducada) publicada en Lifehacker, pero ahora que me tocaba renovar, he preferido buscar un nuevo alojamiento.

Como el sistema solo aloja un blog amateur no me preocupa demasiado la integridad ni disponibilidad, pero si la economía y la posibilidad de instalar software en el servidor, y tener algo con lo que trastear estas tardes de invierno. He optado por contratar una VPS escandalosamente barata en http://buyvm.net. En unos meses os diré como va.

Esta VPS, basada en OpenVZ, ofrece 256mb de RAM garantizada  y 30GB de espacio en disco. Parece un poco escaso en vista de las cifras que manejamos a día de hoy, pero creo que me será más que suficiente, ya que no necesito panel de administración ni servidor de correo.

El software que he elegido es el siguiente:

  • Debian 7 (32 Bits)
  • Servidor web: Nginx
  • Servidor php: php-fpm
  • Servidor BBDD: MySQL
  • MTA: ssmtp

He elegido Debian por que en mi trabajo he manejado principalmente esta distribución, y me ha dado buen resultado. Unas horas después de efectuar la compra recibí un correo de aviso de que mi servidor estaba listo. Tras resolver ciertos problemas con la contraseña de root (que no era la que yo esperaba, pero pude cambiar desde el panel de administración del proveedor), me conecté por ssh y actualicé el sistemas:

apt-get update
apt-get upgrade
reboot

Nginx

He preferido instalar nginx desde la web del proyecto en lugar de utilizar la versión del repositorio de debian.

wget http://nginx.org/keys/nginx_signing.keyapt-key 
add nginx_signing.key
echo "deb http://nginx.org/packages/debian/ wheezy nginx" >> /etc/apt/sources.list
echo "deb-src http://nginx.org/packages/debian/ wheezy nginx" >> /etc/apt/sources.list
apt-get update
apt-get install nginx

Para mayor comodidad a la hora de hacer los backups, he decidido almacenar todos los proyectos web en /home/www.

mkdir -p /home/www/javier.rodriguezcarballo.es/htdocs/
mkdir /home/www/javier.rodriguezcarballo.es/logs/
chown -R /home/www/javier.rodriguezcarballo.es/htdocs/

“/etc/nginx/nginx.conf”

user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
 worker_connections 1024;
}
http {
 include /etc/nginx/mime.types;
 default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
 #tcp_nopush on;
keepalive_timeout 65;
#gzip on;
 upstream php {
 server unix:/var/run/php5-fpm.sock;
 }
 include /etc/nginx/conf.d/*.conf;
}

Luego he creado un archivo especifico para definir la configuración de este blog. He preferido utilizar un archivo aparte, porque para utilizar WP SuperCache no se pueden pasar variables al index.php

“/etc/nginx/conf.d/javier.rodriguezcarballo.es.conf”

server {
 listen 80;
 server_name javier.rodriguezcarballo.es;
 root /home/www/javier.rodriguezcarballo.es/htdocs/;
 access_log /home/www/javier.rodriguezcarballo.es/logs/access.log;
 error_log /home/www/javier.rodriguezcarballo.es/logs/error.log;
index index.php;

 location = /favicon.ico { log_not_found off; access_log off; }
 location = /robots.txt { allow all; log_not_found off; access_log off; }
#INICIO SUPERCACHE
 set $cache_uri $request_uri;
# POST requests and urls with a query string should always go to PHP
 if ($request_method = POST) {
 set $cache_uri 'null cache';
 } 
 if ($query_string != "") {
 set $cache_uri 'null cache';
 }
# Don't cache uris containing the following segments
 if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
 set $cache_uri 'null cache';
 }
# Don't use the cache for logged in users or recent commenters
 if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
 set $cache_uri 'null cache';
 }
# Use cached or actual file if they exists, otherwise pass request to WordPress
 location / {
 try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php ;
 } 
 #FIN SUPERCACHE
location ~ \.php$ {
 include fastcgi_params;
 fastcgi_split_path_info ^(.+\.php)(.*)$;
 fastcgi_pass php;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME /home/www/javier.rodriguezcarballo.es/htdocs/$fastcgi_script_name;
 include fastcgi_params;
 fastcgi_intercept_errors on;
 fastcgi_ignore_client_abort off;
 fastcgi_connect_timeout 60;
 fastcgi_send_timeout 180;
 fastcgi_read_timeout 180;
 fastcgi_buffer_size 128k;
 fastcgi_buffers 4 256k;
 fastcgi_busy_buffers_size 256k;
 fastcgi_temp_file_write_size 256k;
 }

 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
 expires max;
 log_not_found off;
 }
}

PHP

Para instalar el servidor fpm utilizo los repositorios de debian:

apt-get install install php5-fpm php5-mysqlnd

“/etc/php5/fpm/php-fpm.conf”

[global]
 pid = /var/run/php5-fpm.pid
 error_log = /var/log/php5-fpm.log
 log_level = notice
 process.max = 3
 include=/etc/php5/fpm/pool.d/*.conf

“/etc/php5/fpm/pool.d/www.conf”

[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

access.log = /home/www/log/$pool.access.log

chdir = /

MySQL

Aunque este es un software muy exigente en cuanto a memoria, lo utilizan la mayor parte de las aplicaciones web modernas. En mi caso, como no necesito innodb, he desactivado el soporte para ahorrar RAM. Aún así, el servidor reserva unos 300mb, que es más de la memoria garantizada en mi máquina.

apt-get install mysql-server

“/etc/mysql/my.cnf”

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address            = 127.0.0.1
key_buffer              = 16K
max_allowed_packet      = 1M
table_cache             = 4
sort_buffer_size        = 64K
thread_stack            = 64K
thread_cache_size       = 8
sort_buffer             = 64K
net_buffer_length       = 2K
read_buffer_size        = 256K
read_rnd_buffer_size    = 256K
myisam-recover         = BACKUP
query_cache_limit       = 1M
query_cache_size        = 2M
expire_logs_days        = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet      = 8M

[mysql]

[isamchk]
key_buffer              = 8M

!includedir /etc/mysql/conf.d/
skip-bdb
skip-innodb

He instalado también automysqlbackup, que es un software que gestiona copias locales de tus BBDD de forma automática.

apt-get install automysqlbackup

SSMTP

Tengo el correo en Google Apps y no necesito un servidor de correo local en la VPS. Para utilizar sendmail desde mis aplicaciones he instalado ssmtp y lo he configurado para enviar el correo a través de Google Apps, aunque también vale una cuenta de GMail.

apt-get install ssmtp

“/etc/ssmtp/ssmtp.conf”

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=[email protected]

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.gmail.com:587

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=DOMINIO.COM

UseTLS=YES
UseSTARTTLS=YES
AuthUser=[email protected]
AuthPass=CONTRASEÑA

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

“/etc/ssmtp/revaliases”

# sSMTP aliases
#
# Format:       local_account:outgoing_address:mailhub
#
# Example: root:[email protected]:mailhub.your.domain[:port]
# where [:port] is an optional port number that defaults to 25.
root:[email protected]:smtp.gmail.com:587

Notas

He detectado dos errores en el sistema: el comando reboot apaga el sistema en lugar de reiniciarlo, y que la reinstalación automática del sistema no funciona. Sin embargo creo que el servicio se adapta a mis necesidades, ya que, como decía tiene un precio francamente bueno.

En algún momento probaré esta configuración con MariaDB.

11. January 2014 by Xavier
Categories: Alojamiento, Tecnología | 1 comment

Raspberry PI como Media Center

El raspberry PI es un ordenador del tamaño de una tarjeta de crédito que puedes comprar por 35 € aproximadamente. Con 512MB*, un procesador ARM11 a 700mhz y una GPU capaz de reproducir video en HD es, a día de hoy, la mejor opción para quien quiera montarse un centro multimedia barato.

Raspberry Pi Mediacenter

Raspberry Pi Mediacenter

 

El material que he utilizado para montar el mio es el siguiente:

Que funciones espero que cumpla este equipo:

  1. Reproducir vídeo en HD
  2. Descargar torrents de forma manual

Funciones que he probado y descartado por falta de “músculo”:

  1. Backup de mis ordenadores mediante OwnCloud
  2. Sincronización de mis documentos contra Skydrive, Dropbox y Google Drive mediante SMEStorage

Funciones pendientes de implementar:

  1. Descargar automáticamente nuevos capítulos y películas con flexget
  2. Descargar automáticamente películas de una lista de IMDB

Preparar el hardware

El Raspberry PI se alimenta a través de USB. En mi caso el propio HUB USB se encarga de alimentar el sistema, a través del puerto USB en lugar de utilizar el microUSB destinado a tal efecto. En mis pruebas no he detectado ninguna ventaja al conectar un dispositivo directamente al Raspberry así que yo tengo el WIFI, el HD y el receptor del teclado conectados al HUB y este se conecta a uno de los puertos USB del Raspberry. Conecto el equipo a la televisión por HDMI Yo he utilizado los altavoces de un viejo reproductor de DVD para sacar el sonido. Los tengo conectados mediante un cable jack a RCA. Esto no es necesario si no vas a utilizar altavoces, o los tienes conectados a la tele, ya que por HDMI envías el sonido a la TV.

Instalación del software

Como distribución he elegido raspbmc, ya que por una parte trae compilada y funcionando una versión de XBMC, y por otro lado nos permite instalar software a voluntad utilizando apt-get. Algunas alternativas, como OpenELEC  no permiten instalar paquetes directamente en el sistemas y estás limitado al software que puedas instalar como un addon de XBMC.

La instalación es muy sencilla, el primer paso consiste en preparar la tarjeta desde un ordenador de sobremesa. El proceso está bien documentado en la web de Raspbmc, así que os dejo los links que describen el método de instalación en Windows y MacOS/Linux. Es muy importante que configuréis correctamente los datos de la WIFI en este proceso, y que el primer arranque lo hagáis sin conectar por Ethernet, o no configurará correctamente la red y una vez terminada la instalación es mucho más difícil hacerlo.

 

Tras la instalación  yo sufría cuelgues continuamente que se solucionaron eliminando el overclock que raspbmc trae configurado por defecto. Para hacerlo he modificado el archivo /boot/config.txt y borra las siguientes lineas:

arm_freq=800
force_turbo=1

Con estas modificaciones mi sistema permanece estable por días y no he notado que se quedase corto de potencia. No digo que overclockear el raspberry sea malo, pero en mi caso desactivarlo aportó mucha estabilidad. Si no queréis hacerlo, podéis probar utilizando una fuente de alimentación más potente.

Software Adicional

Cliente de Bit Torrent

Transmission es un cliente de BitTorrent estable y ligero.Para instalarlo seguimos los siguientes pasos:

sudo apt-get install transmission-daemon
sudo /etc/init.d/transmission-daemon stop #Si no apagas el proceso antes, sobreescribirá tus modificaciones
sudo nano /etc/transmission-daemon/settings.json

En este archivo vamos a definir nuestro usuario, contraseña y las IPs desde las que podremos administrar Transmission. Busca y cambia las siguientes lineas:

rpc-whitelist: “*.*.*.*”,
rpc-username: “Usuario”,
rpc-password: “Pass”,

También es en este archivo donde se define el directorio por defecto para las descargas. Yo lo he cambiado a /media/woxter/Incoming para que me las guarde en el directorio Incoming de mi disco duro multimedia. Busca la siguiente linea y cambiala a tu gusto:

download-dir: “/media/woxter/Incoming/”

No olvides crear el directorio y darle permisos:

mkdir /media/woxter/Incoming
chown -R pi:pi /media/woxter/Incoming
chmod 777 /media/woxter/Incoming

Para evitar líos con los permisos a la hora de mover y reproducir los archivos descargados, he modificado el script de arranque de transmission para que se ejecute como el usuario “pi”, quien también ejecuta xbmc.  Para hacerlo, edita /etc/init.d/transmission-daemon y modifica esta linea:

USER=pi

y cambia los permisos de los directorios de trabajo y configuración:

sudo chown -R pi /var/lib/transmission-daemon/ /etc/transmission-daemon/

Por otra parte, para evitar que la descarga de torrent te cause problemas mientras ves películas (en mi caso se veía a saltos cuando la transferencia subía de uno 200kb/s) edita el fichero /etc/default/transmission-daemon y descomenta esta línea:

START_STOP_OPTIONS=”–iosched idle –nicelevel 10″

Ya tenemos transmission instalado, y podemos acceder a el utilizando un cliente de escritorio

Transmission Desktop Client

Transmission Desktop Client

o a través del navegador en el puerto 9091: http://IP_DEL_RASPBERRY:9091

Transmission Web Client

Transmission Web Client

Otras consideraciones

Raspbmc exporta por samba el directorio /media. Por defecto podremos acceder al contenido de los HD USB que le hayamos pinchado poniendo  \\IP_DEL_RASPBERRY\devices\ en el navegador de archivos de Windows.

Una vez descargados los torrent, es recomendable renombrar los archivos para que sigan la nomenclatura estándar recomendada por XBMC, facilitando de esta forma que el programa encuentre la información e imágenes correspondientes a cada película o serie. Una forma sencilla de renombrar los archivos es utilizar Filebot o The Renamer. También hay soluciones más complejas como MediaElch que además descargarán la información e imágenes sin necesidad de utilizar XBMC.

* Se comercializa otro modelo con 256 de RAM, un solo USB y sin ethernet por 25$

14. February 2013 by Xavier
Categories: Tecnología | Leave a comment

Post Inaugural

Hola,

Llevo años pensando que, en la situación actual, hay muchas razones para no escribir un blog. La principal es que en Internet puedes encontrar de forma muy sencilla cientos de webs en las que se tratarán los mismos temas que tu, y mucho mejor.

La segunda es que la “web 2.0” ofrece mecanismos más sencillos y rápidos para compartir información. twitter, facebook y google+ han sustituido a aquellos primeros amagos de blog personal (lifejournal y similares), que a su vez sustituyeron a las webs personales.

Aún así he decidido aprovechar mis vacaciones para poner en marcha este blog. Mi intención es poner en práctica mis oxidadas habilidades comunicativas, escribiendo un par de artículos semanales sobre los temas que me interesan: tecnología, motos y música.

En esta semana espero estrenarme con un artículo sobre mi primera ruta en moto del 2013 y mi mediacenter basado en Raspberry PI: el ordenador de 35$

30. January 2013 by Xavier
Categories: Uncategorized | Leave a comment

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies