18 de junio de 2013

Prestashop con Cherokee, SSL y MariaDB

Introducción

  • Prestashop es una tienda online bajo licencia OSL v3 escrita en PHP, podéis ver el código en GitHub.
  • Cherokee server es un servidor web bajo licencia GPL v2, podéis ver el código en GitHub. Podéis consultar como obtener el programa para las distintas distribuciones de Linux en su sitio de descargas.
    Cherokee nos permite ejecutar en un cluster PHP el código de nuestra web, para descargar la CPU de nuestro servidor principal. También podemos hacer de proxy inverso contra un cluster de servidores web, balanceando la carga sobre varias maquinas. (Tened en cuenta el manejo de sesiones por parte de PHP si usáis el proxy, ya que si la sesión se almacena en ficheros, y se balancea contra otro servidor esta sesión no existirá.)
  • MariaDB es una base de datos SQL compatible con MySQL bajo licencia GPL v2. Según la distribución Linux que uséis podéis consultar en la sección de repositorios de MariaDB como obtener acceder al código y fuentes del programa.
Como lo voy instalar en un servidor de mi red, pero quiero poder acceder desde un dominio, modifico el fichero /etc/hosts añadiendo:

192.168.0.218       cherokee.prestashop.com

Instalación

Cherokee:

Vamos a instalar cherokee desde el repositorio, para tener la última versión.
# apt-get install -y autoconf automake libtool gettext openssl git
# git clone -b master --recursive http://github.com/cherokee/webserver.git
# cd webserver
# ./autogen.sh --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-wwwroot=/var/www
# make
# make install

Para que el sistema arranque cherokee al inicial el sistema:
# cp contrib/cherokee /etc/init.d/
# chmod a+x /etc/init.d/cherokee
# nano /etc/rc.local
Añadimos antes de "exit 0":
"/etc/init.d/cherokee start"

MariaDB:

En mi caso, bajo debian:
# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
# echo 'deb http://mirror3.layerjet.com/mariadb/repo/5.5/debian wheezy main' >> /etc/apt/sources.list
# apt-get update
# apt-get install mariadb-server

Insertamos la clave para el usuario "root" de la base de datos.

Prestashop:

# apt-get install -y php5-cgi php5-mysql php5-gd php5-mcrypt git
Para este ejemplo voy a usar el "master" del git, para así obtener la última versión estable.
Al ser la versión de del git, debemos renombrar las carpetas "install-dev" y "admin-dev" eliminando el "-dev".
prestashop@prestashop:~$ git clone -b master https://github.com/PrestaShop/PrestaShop.git
prestashop@prestashop:~$ mv PrestaShop/install-dev PrestaShop/install
prestashop@prestashop:~$ mv PrestaShop/admin-dev PrestaShop/admin

Configuración

Unas de las cosas que más me gustan de Cherokee es que tiene un website que nos permite administrar el servidor de forma simple.
Para lanzar el portal de administración ejecutamos:
# cherokee-admin -b

En pantalla veremos los credenciales generados para esa ejecución; que nos pedirán al acceder a través de nuestro navegador web.

En este ejemplo: http://cherokee.prestashop.com:9090/

En la pestaña "General" en el apartado "Seguridad", ponemos como usuario y grupo a "www-data".

En la pestaña vServers, pinchamos en "Nuevo" y veremos un asistente. Seleccionamos en "Lenguajes" la opción PHP y pulsamos en añadir.
Cuando nos pregunta sobre la "raíz de documentos" escribimos la ruta del proyecto (en mi caso /home/prestashop/PrestaShop).
En el paso final nos pide el nombre del servidor virtual (en mi caso cherokee.prestashop.com), y pulsamos en crear.
Por último hay que guardar la configuración.

Antes de todo, deberémos conectamos a la base de datos para poder crear un usuario y una base de datos para alojar el prestashop.
$ mysql --user=root --password=mariadb_clave
MariaDB [(none)]> CREATE DATABASE prestashop;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON prestashop.* TO 'prestashop'@'localhost' IDENTIFIED BY 'prestashop_clave_db';
Ahora insertamos los datos de acceso a la base de datos en la web para validarlos y continuamos hasta finalizar la instalación.

Para la instalación nos pide permisos de escritura recursivos, en distintas ubicaciones.

En lugar de cambiar el propietario de "prestashop" a "www-data", o dar permiso a todos los usuarios para editar, voy a asignarles al grupo "www-data" y dar pemisos de escritura recursiva al grupo.
root@prestashop:/home/prestashop/PrestaShop# chgrp -R www-data config/ cache/ log/ img/ mails/ modules/ themes/default/lang/ themes/default/cache/ translations/ upload/ download/ sitemap.xml

root@prestashop:/home/prestashop/PrestaShop# chmod g+w -R config/ cache/ log/ img/ mails/ modules/ themes/default/lang/ themes/default/cache/ translations/ upload/ download/ sitemap.xml

Ya podemos acceder desde nuestro navegador a la tienda para realizar la instalación.

Para finalizar eliminamos "install" y renombramos "admin"
root@prestashop:/home/prestashop/PrestaShop# mv admin admin-dev
root@prestashop:/home/prestashop/PrestaShop# rm -R -f installd

Ya podemos acceder a http://cherokee.prestashop.com/admin-dev/ para administrar nuestra tienda.

Puesta a punto

Para mejorar el rendimiento y la seguridad nuestro sitio web, vamos a volver al administrador de cherokee.
En vServers seleccionamos nuestro dominio y vamos a la pestaña de "comportamiento".
Pinchamos sobre "Rule Manager".

Seleccionamos la regla por defecto y en "Gestor" desmarcamos todas las opciones salvo "Usar caché E/S".

Añadimos una regla manual del tipo "Directorio" e insertamos "/admin-dev/".
Sobre esta regla vamos a las pestaña "Seguridad" en el apartado de "autenticación" seleccionamos, por ejemplo, "Fixed list" e insertamos el valor de "Realm", añadimos los usuarios y contraseñas. Por último pinchamos sobre la regla, en donde pone "FINAL" para ponerla como "NON FINAL". Con este procedimiento, además del usuario y contraseña de administración deberán conocer uno de estos usuarios para poder acceder al sitio de administración.

Añadimos una regla manual del tipo "Extensión" e insertamos "js,css,html,jpeg,jpg,png,gif,ttf".
Sobre esta regla vamos a las pestaña "Gestor" y seleccionamos "contenido estático", en la pestaña de "Codificación" habilitamos GZip.

Añadimos una regla manual del tipo "Extensión" e insertamos "tpl,txt,md".
Sobre esta regla vamos a las pestaña "Gestor" y seleccionamos "Error HTTP" y elegimos "404 Not found". Si queréis dar acceso a los ficheros robots.txt, humans.txt, hackers.txt o a cualquier otro fichero txt, tpl o md, teneis que añador una reglar tipo "Existe fichero" y marcarlo como "contenido estático". Tened en cuenta que debe estar por encima de la regla anterior para que pueda tener efecto.

Añadimos una regla manual del tipo "Existe fichero" e insertamos "config.xml".
Sobre esta regla vamos a las pestaña "Gestor" y seleccionamos "Error HTTP" y elegimos "404 Not found".

Editamos "config/defines.inc.php" y ponemos como "false" el valor de '_PS_MODE_DEV_'.

SSL

Para habilitar SSL en nuestro servidor vamos a la pestaña "General", en el apartado "Network", seleccionamos OpenSSL/libssl; "Port open" añadimos el puerto 443 con soporte TLS/SSL.

En vServers seleccionamos nuestro dominio.
En la pestaña seguridad ponemos la ruta de nuestros certificados y activamos HSTS.

Si no tenemos una firma, vamos a la pestaña de "comportamiento".
Pinchamos sobre "Rule Manager".
Añadimos una regla "Task > SSL/TLS Testing", esto nos lanzar un asistente que nos generará unas claves autofirmandas.

Por último en "Rule Manager" de nuestro dominio seleccionamos la pestaña "Seguridad" y marcamos "Only https".

UPDATE: Urls Amigables

Las Urls amigables mejoran el SEO de nuestra web, pero para poder configurarlas hay que reescribir la url que llegan al servidor y hacer que se evalúe el código PHP.

Para ello vamos a escribir dos reglas, una para manejar las imágenes y otra para el código PHP.

Añadimos una regla manual del tipo "Extensión" e insertamos "jpeg,jpg,png,gif".
Sobre esta regla vamos a las pestaña "Gestor" y seleccionamos "Redirección"; ahora añadiremos las redicciones para las imágenes pulsando sobre "Nueva RegEx" y siendo todas ellas del tipo "redirección interna", añadimos las siguientes:
^images_ie/?([^/]+)\.(jpe?g|png|gif)$
js/jquery/plugins/fancybox/images/$1.$2

^c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/c/$1$2.$3

^c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/c/$1$2$3.$4

^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/p/$1/$1$2$3.$4

^([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/p/$1/$2/$1$2$3$4.$5

^([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/p/$1/$2/$3/$1$2$3$4$5.$6

^([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/p/$1/$2/$3/$4/$1$2$3$4$5$6.$7

^([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.$8

^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.$9

^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.$10

^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.(jpe?g|png|gif)$
/img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9$10.$11

Recordar debe estar por encima de la regla de "cache" de imágenes, y ser del tipo "No final".

Para el caso del resto de URLs usaremos el patrón "^.*$" y redirigiremos ha "/index.php". Esta regla se puede aplicar en el comportamiento por defecto, pero nos inpedirá acceder al directorio de administración. Para poder seguir accediendo a este deberemos crear una regla "auxiliar" para la redirección. Añadimos una regla manual del tipo "Directorio" e insertamos "/admin-dev/", para luego negarlo. Esta regla se encontrará justo encima de la opción por defecto y dejaremos la opción por defecto como "Listar y ver".

No hay comentarios:

Publicar un comentario