Magento 2: Como configurar o Nginx para usar vários sites com subpasta

9

Gostaríamos de criar vários sites no Magento 2. Há um artigo sobre esse tópico na documentação oficial do Magento 2 , mas a maneira como eles descrevem não é adequada para o nosso caso.

Eles estão sugerindo o uso de subdomínios para determinar sites diferentes, como

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

Gostaríamos de usar subpastas em vez de subdomínios . Para dar um exemplo,

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

Como podemos superar esse problema no servidor da web Nginx?

Minha configuração

Estou usando o Ubuntu 16.04. Instalei o Nginx e não alterei nenhuma configuração principal do Nginx. Eu criei um arquivo 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;
}

EDIT 1: (23-10-2017)

Eu tenho várias lojas para cada site.

Bunyamin Inan
fonte
você só precisa adicionar reescritas para o seu novo caminho
MagenX
Já existem muitas reescritas e blocos try_file no nginx.conf . Se você olhar para uma nova instalação do Magento 2, verá um nginx.conf com muitas configurações.
Bunyamin Inan
@MagenX Você pode explicar mais, por favor? Onde exatamente devo colocar a reescrita?
Bunyamin Inan

Respostas:

13

Eu tentei várias maneiras de realizar essa tarefa. Gostaria de agradecer a @ matias-hidalgo por suas contribuições, embora não tenha entendido sua resposta na primeira leitura :).

Aqui está o cenário. Temos dois sites diferentes e cada site tem duas visualizações diferentes da loja, como a seguir:

Website 1

  • Site 1 (comércio eletrônico)
  • Site 1 (Venda Assistida)

Site 2

  • Site 2 (comércio eletrônico)
  • Site 2 (Venda Assistida)

Na minha solução, vamos mudar algumas configurações no Magento Admin . Em seguida, criaremos algumas subpastas e , finalmente, modificaremosnginx.conf .

Primeiro, precisamos fazer algumas alterações na configuração do Magento Admin . Vá para Stores-> Configuration-> General-> Web. Precisamos alterar os URLs base para cada visualização da loja.

Para configuração padrão

Forneça a seguinte configuração para a configuração padrão. insira a descrição da imagem aqui

Para o site 1 (comércio eletrônico) e o site 1 (Venda Assistida)

Forneça a seguinte configuração para todas as visualizações da loja do site 1 . insira a descrição da imagem aqui

Para o site 2 (comércio eletrônico) e o site 2 (Venda Assistida)

Forneça a seguinte configuração para todas as visualizações de loja do site 2 . insira a descrição da imagem aqui

Em segundo lugar, precisamos criar website1e website2pastas no /pubdiretório No final, você deve ter as seguintes pastas:

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

Copie o pub/index.phparquivo para esses diretórios. Então, faremos algumas alterações em MAGENTO_ROOT/pub/website1/index.phpe MAGENTO_ROOT/pub/website2/index.php.

Conteúdo de MAGENTO_ROOT/pub/website1/index.php

Eu mudei apenas três linhas:

1ª Linha: require __DIR__ . '/../../app/bootstrap.php';

2ª Linha: $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';

3ª Linha: $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 o toque final, precisamos modificar nginx.confno seu diretório MAGENTO_ROOT. Por favor, coloque a seguinte configuração no seu 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;
    }
}

Depois de todas essas configurações e modificações, você poderá usar sites como subpastas. Espero que ajude.

Bunyamin Inan
fonte
11
O único problema que estou enfrentando com este Configration é conteúdo estático não está funcionando
Aman Alam
@AmanAlam Você alterou o URL base para o conteúdo estático, conforme descrito? Testamos essa configuração com 2 clientes diferentes no Magento 2.1.
Bunyamin Inan
Sim mudou url de base como descrito e seu trabalho agora obrigado
Aman Alam
11
@Bunyamin segui o mesmo método. A página inicial está funcionando, mas a categoria e a página do produto estão apresentando erro 404. Alguma sugestão? você pode me ajudar nisso?
Jaimin
11
@Jimin, use o código acima no nginx.conf.sample e não no nginx.conf. Isso resolverá o seu problema.
Umair ayub
2

Pela configuração do Nginx, você pode usar esta configuração de exemplo:

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;
    }
}

e use este index.php como um exemplo:

/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 esclarecer:

Na minha configuração do vhost nginx, você encontrará o seguinte:

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

onde a primeira "/ sua / subpasta" pode ser alterada para o que você quiser como URL do site. ex www.mywebsite.com/stack/magento -> / stack / magento

Então, para definir o código do site que será carregado nesse URL, você deve criar o index.php escrevendo o código do site aqui:

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

Espero que agora seja claro o suficiente, tenho que gastar um tempo em um projeto para fazer isso, para que eu saiba que funciona e que está mais perto de como costumávamos fazer isso no M1.

Matias Hidalgo
fonte
Não entendo como isso resolverá meu problema. Eu perguntei especificamente como usar vários sites. Você está sugerindo que esse código também possa ser usado para sites?
Bunyamin Inan
Você disse "Gostaríamos de usar subpastas em vez de subdomínios". Eu vou atualizar a minha resposta agora esclarecer onde cada configuração subpasta é
Matias Hidalgo
Eu disse isso. Eu também disse que gostaria de usar vários sites com subpastas . Eu simplesmente não entendo o que o código de loja está fazendo lá?
Bunyamin Inan
Isso foi apenas uma sugestão, se os seus códigos de loja são bons o suficiente, você não precisa lidar com nginx configuração ... ter um olhar agora para a minha explicação
Matias Hidalgo
Então você está dizendo que, se o meu código de loja e o código do site corresponderem, isso funcionará. Eu também tenho várias lojas para cada site.
Bunyamin Inan
0

no seu domain.conf em "etc / nginx", você precisa criar um mapa.

por exemplo:

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

ou

map $request_uri $MAGE_RUN_CODE {
    default default;
    ~^/website1/.*  website1;
    ~^/website2/.*  website2;
}
Leonardo Garcia
fonte
Você está descrevendo a maneira do subdomínio . O que eu quero é o modo subpasta . Eu não quero website1.magento-site.com, mas eu quero magento-site.com/website1.
Bunyamin Inan
você pode mapear sua subpasta da mesma maneira e adicionar regex reescrever para map $http_host$uri $MAGE_RUN_CODE
subcaminho
Eu tentei este método, apenas dá um 404.
themanwhoknowstheman
@ MagagenX Eu já vi você sugerir esse método em outro post, mas você nunca entra em detalhes sobre as instruções exatas para fazê-lo funcionar corretamente. Cuidado em compartilhar?
Themanwhoknowstheman 10/11
0

Que tal uma solução nginx pura com esse mapa duplo?

Primeiro, pelo site (obrigado @MagenX)

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

Um segundo para o novo pedido uri

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

E, finalmente, não se esqueça de definir o novo REQUEST_URI computado

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