Magento 2: Cómo configurar Nginx para usar múltiples sitios web con subcarpeta

9

Nos gustaría crear múltiples sitios web en Magento 2. Hay un artículo sobre este tema en la documentación oficial de Magento 2 , pero la forma en que describen no es adecuada para nuestro caso.

Sugieren utilizar subdominios para determinar diferentes sitios web, como

  • website1 .magento-site.com
  • website2 .magento-site.com

Nos gustaría utilizar subcarpetas en lugar de subdominios . Para dar un ejemplo,

  • magento-site.com/ website1
  • magento-site.com/ website2

¿Cómo podemos superar este problema en el servidor web Nginx?

Mi configuracion

Estoy usando Ubuntu 16.04. He instalado Nginx y no he cambiado ninguna configuración central de Nginx. He creado un archivo magento-site.com.confdentro /etc/nginx/sites-enabled/magento-site.com.conf.

/etc/nginx/sites-enabled/magento-site.com.conf

server {
    listen 8080;
    server_name magento-site.com;

    set $MAGE_RUN_CODE website1;
    set $MAGE_ROOT /var/www/magento-site.com;
    include /var/www/magento-site.com/nginx.conf;
}

EDITAR 1: (2017-10-23)

Tengo varias tiendas para cada sitio web.

Bunyamin Inan
fuente
solo necesita agregar reescrituras para su nuevo camino
MagenX
Ya hay muchas reescrituras y bloques try_file en nginx.conf . Si observa una nueva instalación de Magento 2, verá un nginx.conf con muchas configuraciones.
Bunyamin Inan
@MagenX ¿Puedes explicar más por favor? ¿Dónde exactamente debo poner la reescritura?
Bunyamin Inan

Respuestas:

13

He intentado numerosas formas de lograr esta tarea. Me gustaría agradecer a @ matias-hidalgo por sus contribuciones, aunque no entendí su respuesta en la primera lectura :).

Aquí está el escenario. Tenemos dos sitios web diferentes, y cada sitio web tiene dos vistas diferentes de la tienda de la siguiente manera:

Sitio web 1

  • Sitio web 1 (comercio electrónico)
  • Sitio web 1 (Venda Assistida)

Sitio web 2

  • Sitio web 2 (comercio electrónico)
  • Sitio web 2 (Venda Assistida)

En mi solución, vamos a cambiar alguna configuración en Magento Admin . Luego vamos a crear algunas subcarpetas , y finalmente vamos a modificarnginx.conf .

En primer lugar, debemos realizar algunos cambios de configuración en el Administrador de Magento . Vaya a Stores-> Configuration-> General-> Web. Necesitamos cambiar las URL base para cada vista de la tienda.

Para la configuración predeterminada

Proporcione la siguiente configuración para la configuración predeterminada. ingrese la descripción de la imagen aquí

Para el sitio web 1 (comercio electrónico) y el sitio web 1 (Venda Assistida)

Proporcione la siguiente configuración para todas las vistas de la tienda del sitio web 1 . ingrese la descripción de la imagen aquí

Para el sitio web 2 (comercio electrónico) y el sitio web 2 (Venda Assistida)

Proporcione la siguiente configuración para todas las vistas de la tienda del sitio web 2 . ingrese la descripción de la imagen aquí

En segundo lugar, necesitamos crear website1y website2carpetas en el /pubdirectorio. En la final, debe tener las siguientes carpetas:

  • MAGENTO_ROOT/pub/website1
  • MAGENTO_ROOT/pub/website2

Copie el pub/index.phparchivo en estos directorios. Luego haremos algunos cambios en MAGENTO_ROOT/pub/website1/index.phpy MAGENTO_ROOT/pub/website2/index.php.

Contenido de MAGENTO_ROOT/pub/website1/index.php

Solo he cambiado 3 líneas:

1ra línea: require __DIR__ . '/../../app/bootstrap.php';

2da línea: $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';

3ra línea: $params[\Magento\Store\Model\StoreManager::PARAM_RUN_TYPE] = 'website';

<?php
/**
 * Public alias for the application entry point
 *
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

use Magento\Framework\App\Bootstrap;
use Magento\Framework\App\Filesystem\DirectoryList;

try {
    require __DIR__ . '/../../app/bootstrap.php';
} catch (\Exception $e) {
    echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
        <h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;">
        Autoload error</h3>
    </div>
    <p>{$e->getMessage()}</p>
</div>
HTML;
    exit(1);
}

$params = $_SERVER;
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_TYPE] = 'website';
$params[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] = [
    DirectoryList::PUB => [DirectoryList::URL_PATH => ''],
    DirectoryList::MEDIA => [DirectoryList::URL_PATH => 'media'],
    DirectoryList::STATIC_VIEW => [DirectoryList::URL_PATH => 'static'],
    DirectoryList::UPLOAD => [DirectoryList::URL_PATH => 'media/upload'],
];

$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication(\Magento\Framework\App\Http::class);
$bootstrap->run($app);

Para el toque final, necesitamos modificar nginx.confen su directorio MAGENTO_ROOT. Ponga la siguiente configuración en su nginx.conf.

location /website1 {
    root /website1;
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /website1/index.php last;
        break;
    }
}

location /website2 {
    root /website2;
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /website2/index.php last;
        break;
    }
}

Después de todas estas configuraciones y modificaciones, podrá utilizar sitios web como subcarpetas. Espero que ayude.

Bunyamin Inan
fuente
1
El único problema al que me enfrento con esta configuración es que el contenido estático no funciona
Aman Alam
@AmanAlam ¿Cambiaste la URL base del contenido estático como se describe? Hemos probado esta configuración con 2 clientes diferentes en Magento 2.1.
Bunyamin Inan
Sí, cambió la URL base como se describe y está funcionando ahora gracias
Aman Alam
1
@Bunyamin I siguió el mismo método. La página de inicio funciona pero la página de categoría y producto está dando error 404. ¿Cualquier sugerencia? me puedes ayudar en eso
Jaimin
1
@Jaimin, use el código anterior en nginx.conf.sample no en nginx.conf. Arreglará tu problema.
umair ayub
2

Mediante la configuración de Nginx, puede usar esta configuración de ejemplo:

server {
    listen 80;
    ## SSL directives might go here
    server_name local.magento2.com;
    root /PATH/TO/YOUR/MAGENTO/pub;

    location / {
        index index.html index.php; ## Allow a static html file to be shown first
        try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
        expires 30d; ## Assume all files are cachable
    }

    location /your/subfolder {
        root /your/subfolder;
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /your/subfolder/index.php last;
            break;
        }
        #limit_conn iplimit 50;
    }

    location @handler { ## Magento uses a common front handler
        rewrite / /index.php;
    }

    location /static/ {
        # Uncomment the following line in production mode
        # expires max;

        # Remove signature of the static files that is used to overcome the browser cache
        location ~ ^/static/version {
            rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
        }

        location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
            add_header Cache-Control "public";
            add_header X-Frame-Options "SAMEORIGIN";
            expires +1y;

            if (!-f $request_filename) {
                rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
            }
        }
        location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
            add_header Cache-Control "no-store";
            add_header X-Frame-Options "SAMEORIGIN";
            expires    off;

            if (!-f $request_filename) {
               rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
            }
        }
        if (!-f $request_filename) {
            rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
        }
        add_header X-Frame-Options "SAMEORIGIN";
    }

    location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
        rewrite ^(.*.php)/ $1 last;
    }

    location ~ .php$ { ## Execute PHP scripts
        if (!-e $request_filename) {
            rewrite / /index.php last;
        }
        expires        off;
        #fastcgi_pass   unix:/run/php/php5.6-fpm.sock;
        fastcgi_pass   unix:/run/php/php7.0-fpm.sock;
        fastcgi_read_timeout 10m;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        #fastcgi_param  MAGE_RUN_CODE $mage_run_code;
        #fastcgi_param  MAGE_RUN_TYPE store;
        #fastcgi_param  MAGE_MODE developer; # default or production or developer
        include        /etc/nginx/fastcgi_params;
    }
}

y use este index.php como ejemplo:

/PATH/TO/YOUR/MAGENTO/pub/your/subfolder/index.php
<?php
use Magento\Framework\App\Bootstrap;
use Magento\Framework\App\Filesystem\DirectoryList;
try {
    require __DIR__ . '/../../../app/bootstrap.php';
} catch (\Exception $e) {
    echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
    <div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
        <h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;">
        Autoload error</h3>
    </div>
    <p>{$e->getMessage()}</p>
</div>
HTML;
    exit(1);
}

$params = $_SERVER;
$params[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] = [
    DirectoryList::PUB => [DirectoryList::URL_PATH => ''],
    DirectoryList::MEDIA => [DirectoryList::URL_PATH => 'media'],
    DirectoryList::STATIC_VIEW => [DirectoryList::URL_PATH => 'static'],
    DirectoryList::UPLOAD => [DirectoryList::URL_PATH => 'media/upload'],
];
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website_code';
$params[\Magento\Store\Model\StoreManager::PARAM_RUN_TYPE] = 'website';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);
$app = $bootstrap->createApplication('Magento\Framework\App\Http');
$bootstrap->run($app);

Para aclarar:

En mi configuración de vhost nginx encontrarás esto:

    location /your/subfolder {
        root /your/subfolder;
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /your/subfolder/index.php last;
            break;
        }
        #limit_conn iplimit 50;
    }

donde se puede cambiar la primera "/ tu / subcarpeta" para lo que quieras como URL del sitio web. ex www.mywebsite.com/stack/magento -> / stack / magento

Luego, para definir el código del sitio web que se cargará en esta url, debe crear el index.php escribiendo el código del sitio web aquí:

$params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website_code';

Espero que esto ahora sea lo suficientemente claro, tengo que pasar tiempo en un proyecto para hacerlo, así que sé que funciona y está más cerca de cómo solíamos hacerlo en M1.

Matias Hidalgo
fuente
No entiendo cómo esto resolverá mi problema. Le pregunté específicamente cómo usar múltiples sitios web. ¿Está sugiriendo que este código también se puede usar para sitios web?
Bunyamin Inan
Usted dijo "Nos gustaría usar subcarpetas en lugar de subdominios". Actualizaré mi respuesta ahora aclarando dónde está cada configuración de subcarpeta
Matias Hidalgo
Sí, dije eso. También dije que me gustaría usar varios sitios web con subcarpetas . Simplemente no entiendo qué está haciendo el código de la tienda allí?
Bunyamin Inan
Eso fue solo una sugerencia, si los códigos de su tienda son lo suficientemente buenos, no necesita lidiar con la configuración de nginx ... eche un vistazo a mi explicación
Matias Hidalgo
Entonces está diciendo que si mi código de tienda y el código del sitio web coinciden, esto funcionará. También tengo varias tiendas para cada sitio web.
Bunyamin Inan
0

en su domain.conf en "etc / nginx" necesita crear un mapa.

por ejemplo:

map $http_host$uri $MAGE_RUN_CODE { 
   ~*^(www\.)?magento-site\.com/website1/.*  website1;
   ~*^(www\.)?magento-site\.com/website2/.*  website2;
}

o

map $request_uri $MAGE_RUN_CODE {
    default default;
    ~^/website1/.*  website1;
    ~^/website2/.*  website2;
}
Leonardo Garcia
fuente
Estás describiendo la forma del subdominio . Lo que quiero es una forma de subcarpeta . No quiero website1.magento-site.com, pero quiero magento-site.com/website1.
Bunyamin Inan
puede asignar su subcarpeta de la misma manera y agregar regex regex para map $http_host$uri $MAGE_RUN_CODE
subruta
Probé
@MagenX Te he visto sugerir este método en otra publicación, sin embargo, nunca detallas las instrucciones exactas para que funcione correctamente. ¿Quieres compartir?
themanwhoknowstheman
0

¿Qué pasa con una solución nginx pura con este doble mapa?

Primero, para el sitio web (gracias @MagenX)

map $request_uri $MAGE_RUN_CODE {
    default website1;
    ~^/website1/.*  website1;
    ~^/website2/.*  website2;
}

Un segundo para la nueva solicitud uri

map $request_uri $REQUEST_URI {
    default  $request_uri;
    "~*^/(website[0-9])(?<p>.*)" $p;
}

Y, por último, no olvide configurar el nuevo REQUEST_URI calculado

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
Petit_Nuage
fuente