Desplegando Magento 2 con Subdirectorios en Nginx: La Guía que Faltaba
Cuando se desea tener un sitio web con varias tiendas para separar su gestión, Magento 2 proporciona 2 maneras:
- Mediante subdominios
- Mediante subdirectorios
Para ambos existe gran cantidad de artículos de cómo hacerlo, pero casi todos coinciden en el uso del servidor Apache. Cuando en la empresa tuvimos la necesidad de montar un comercio electrónico con Magento 2 usando subdirectorios con servidor Nginx nos encontramos con poca documentación que nos ayudara a desplegar de manera rápida el sistema.
Es por este motivo que compartimos con ustedes cómo se hizo en nuestra empresa el despliegue y configuración de un comercio electrónico con Magento 2 usando subdirectorios con servidor Nginx.
1- Crear la configuración de la tienda:
En la administración ir a Stores > All Stores
Y definir todos los websites, stores y store views que se neceitan. Para nuestra necesidad necesitábamos crear un sitio para:
- La Habana
- Matanzas
- Sancti Espíritus
Para cada tienda se necesitaban 3 idiomas:
- Español
- Ingles
- Frances
Quedando la configuración de la siguiente manera:
2- Configurar la URL de la tienda
Las tiendas van a ser accedidas usando la URL que se le defina, por lo que hay que garantizar que se vean los CSS y JS de manera correcta. Para garantizar esto se debe ir a:
Stores > Configuration > General > Web
La provincia por defecto es La Habana, por lo que, en la configuración de la tienda La Habana, no hay que realizar ningún cambio. Sin embargo, para la tienda de Matanzas y Santi Espíritus sí.
El siguiente paso es seleccionar la tienda a modificar en el Scope del sistema, quedando la configuración de la siguiente manera para Matanzas.
Para Santi Espíritus:
Nota: Recuerde que antes de cambiar el Scope, debe salvar los cambios.
3- Crear el directorio de cada sitio
Accediendo al servidor, se debe crear en la carpeta “pub” de la raíz del proyecto una carpeta con el mismo código del sitio web:
Copiar el fichero index.php de pub hacia cada una de esas carpetas, pero antes de acerlo asegúrate de estar dentro de la carpeta raíz del sistema.
cd /var/www/proyecto
cp pub/index.php pub/w_mat
cp pub/index.php pub/w_san
Abrir usando un editor de texto el fichero recientemente agregado para cada tienda
nano pub/w_mat/index.php
Debe mostrar la siguiente configuración:
Modifica la línea siguiente:
require __DIR__ . '/../app/bootstrap.php';
por
require __DIR__ . '/../../app/bootstrap.php';
Ya que llevaste el fichero index.php un nivel más abajo en la estructura de carpetas y con esto garantizamos que se encuentren los ficheros.
Además, debe modificar la siguiente línea:
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'base';
En lugar de poner ‘base’ debe poner el código de la tienda, para Matanzas es:
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'w_mat';
Quedando de la siguiente manera:
Repetir el mismo proceder para cada una de las siguientes tiendas, lo importante es tener el código correcto y coincidente con el definido en la administración.
4- Editar el fichero “nginx.conf.sample” que se encuentra en la raíz del sistema
nano nginx.conf.sample
Y modificar la línea:
location ~ ^/(index|get|static|errors/report|errors/404|errors/503|health_check)\.php$ {
por
location ~ ^/((w_mat|w_san)/)?(index|get|static|errors/report|errors/404|errors/503|health_check)\.php$ {
Aqui esta uno de nuestros aportes, y es que le estamos diciendo a esta directiva de Nginx que ejecute el bloque para url que contengan:
/w_mat/
/w_san/
Y que además no la contengan, para que se ejecute la tienda base.
5- Crear el host virtual
Para que el sitio sea accesible, se tiene que crear el host virtual. Magento 2 proporciona una configuración de ejemplo que funciona perfectamente, después de la sentencia:
include /var/www/nwistore.com/nginx.conf.sample;
Agregar para cada tienda el siguiente bloque:
location /w_mat/ {
rewrite ^(.*)$ $1 break;
try_files $uri $uri/ /w_mat/index.php$is_args$args;
}
location /w_san/ {
rewrite ^(.*)$ $1 break;
try_files $uri $uri/ /w_san/index.php$is_args$args;
}
Quedando de la siguiente manera:
Con estos pasos conseguimos configurar de manera correcta un comercio electrónico con Magento 2 usando subdirectorios con servidor Nginx. Espero este paso les ahorre el tiempo que a nosotros nos tomó resolver.