viernes, 18 de abril de 2014

MAGENTO: Virtual host de NGINX para MAGENTO

Precondiciones:
  1. Tener instalado y funcionando NGINX y php-fpm
Variables:
  • {serverRoot}
    • Ruta donde se encuentra nuestra tienda.
  • {serverName}
    • Nombre de nuestro servidor.
  • {codigoTienda}
    • Código en MAGENTO de la tienda.
Consideraciones:
En instalaciones multitienda y por cuestiones de rendimiento se aconseja crear un virtualhost por cada tienda.


Proceso:
En el directorio de sites_enabled de NGINX crear el archivo {serverName}, con el siguiente contenido:

server {
    listen   80;
    root {serverRoot};
    index index.php;

    server_name {serverName};

    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
        access_log        off;
        expires           30d;
        add_header Cache-Control "public";
    }

    location ^~ /app/                { deny all; }
    location ^~ /includes/           { deny all; }
    location ^~ /lib/                { deny all; }
    location ^~ /media/downloadable/ { deny all; }
    location ^~ /pkginfo/            { deny all; }
    location ^~ /report/config.xml   { deny all; }
    location ^~ /var/                { deny all; }

     location / {
         if ($uri ~ "^(.+.php)(/.+)") {
                set $path_info $1;
        }

        if (!-e $request_filename) {
            rewrite ^(.+)$ /index.php;
        }
    }

    fastcgi_param PATH_INFO $path_info;

    location ~ \.php$ {

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;

        expires        off; ## Do not cache dynamic content
        fastcgi_buffer_size 256k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_read_timeout 120;

        fastcgi_param  MAGE_RUN_CODE {codigoTienda};

    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny all;
    }

}

Recargarmos la configuración de NGINX y listo :D

sudo service nginx reload


MAGENTO: En subdirectorio de NGINX

Precondiciones:
  1. Tener funcionando NGINX con PHP
  2. Tener instalado MAGENTO como subdirectorio en el root de NGINX
Variables:
  • {miTienda}
    • Nombre del subdirectorio donde se encuentra Magento.
  • {admin}
    • Identificador del backend de nuestra tienda.
Proceso:

En el archivo de configuración de sitio de nginx, en mi caso

/etc/nginx/sites-enabled/default

Agregamos los siguientes location:

  location /{miTienda} {
        index index.php;
        try_files $uri $uri/ @handler;
        expires 30d;
        if ($uri ~ "^/index.php/{admin}.*$"){
            rewrite ^/index.php/
{admin}(.*) /{admin}$1 redirect;
        }
    }

    location ~ ^/{miTienda}/(app|includes|var|lib|media/downloadable|pkginfo|report/config.xml|var)/  {
       deny all;
    }

    location @handler { 
        rewrite / /{miTienda}/index.php; 
    }

UBUNTU: Migrar de APACHE a NGINX


Precondiciones:
  1. Tener apache funcionando
  2. Tener php5 funcionando en apache
Paso 1:
Remover apache, así sin más, sin miedo:


sudo apt-get remove apache2*


Paso 2:

Instalar php5-fpm con sus dependencias, este paso podría disparar algunos mensajes sobre algunos paquetes ya instalados:

sudo apt-get install php5-common php5-cli php5-fpm


Paso 3:
Instalamos nginx

sudo apt-get install nginx

Paso 4:
Comienzan las configuraciones :D, primero php-fpm

En el archivo:


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

 
Buscar la variable listen, que por default viene como:


    listen = 127.0.0.1:9000


La modificamos a:


    listen = /var/run/php5-fpm.sock


Tomen en cuenta el valor que asignen a listen, por que ese valor mas el prefijo "unix:" deben coincidir con la variable fastcgi_pass de nginx pues ese sera el socket por el que se comunicaran php y nginx.

 
Ahora nginx, en el arcivo:


    /etc/nginx/sites-enabled/default

Vamos primero a modificar la variable root, para no tener que mover nuestros proyectos actuales


root /var/www;

Luego de ello, buscamos el location que nos propone nginx para manejar las peticiones de php, y descomentamos las lineas necesarias para que quede algo así:


    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        # With php5-cgi alone:
        #fastcgi_pass 127.0.0.1:9000;
        # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

  
Noten que la variable fastcgi_pass tiene el prefijo "unix:" y el valor que le dimos a la variable listen de php-fpm, si dicha condición no se cumple la configuración no funcionara.

También sugiero agregar el siguiente location, para mejorar la descarga de imágenes y contenido estático
:

    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
            access_log        off;
            expires           30d;
            add_header Cache-Control "public";
    }


Por ultimo agregamos el siguiente location, el cual impedirá el acceso a los archivos .htaccess de apache


    location ~ /\.ht {
        deny all;
    }


Bueno, al llegar a este punto solo nos queda una cosa por hacer


sudo service nginx restart

Y si todo salío como debe, visiten http://localhost y bienvendios a NGINX, y si no, como dice Kick Butowsky "Live Till It Hurts"

martes, 1 de abril de 2014

Magento: Prevenir Envío de correos

Precondiciones:

Tener la base instalada.

Evitar mandar correos a los clientes:

UPDATE customer_entity
SET email = 'some@mail.com'
WHERE email != 'other@mail.com';

Evitar mandar correos a los usuarios

UPDATE core_config_data ccd
SET ccd.value = 'some@mail.com'
WHERE ccd.value LIKE '%@%';

Evitar mandar correos sobre ordenes y carritos
UPDATE sales_flat_order
SET customer_email = 'unexistent@mail.com'
WHERE customer_email != 'finalmau@gmail.com';

UPDATE sales_flat_quote
SET customer_email = 'unexistent@mail.com'
WHERE customer_email != 'finalmau@gmail.com';