마 젠토 2 : 하위 폴더와 함께 여러 웹 사이트를 사용하도록 Nginx를 구성하는 방법


9

Magento 2에서 여러 개의 웹 사이트를 만들고 싶습니다. Official Magento 2 Documentation 에이 주제에 대한 기사가 있지만 이들이 설명하는 방식이 우리의 경우에는 적합하지 않습니다.

그들은 같은 다른 웹 사이트를 결정하기 위해 하위 도메인 을 사용할 것을 제안하고 있습니다.

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

하위 도메인 대신 하위 폴더 를 사용하고 싶습니다 . 예를 들어

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

Nginx 웹 서버에서이 문제를 어떻게 극복 할 수 있습니까?

내 구성

우분투 16.04를 사용하고 있습니다. Nginx를 설치 했으며 Nginx 코어 구성을 변경하지 않았습니다. magento-site.com.conf안에 파일을 만들었습니다 /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;
}

편집 1 : (2017-10-23)

각 웹 사이트마다 여러 상점이 있습니다.


새로운 경로에 대한 재 작성을 추가하면됩니다
MagenX

에서 재 작성 및 try_file 블록이 많이 있습니다 nginx.conf 이미이. 새로운 Magento 2 설치 를 보면 많은 구성을 가진 nginx.conf가 표시됩니다.
Bunyamin Inan

@MagenX 좀 더 설명해 주시겠습니까? 재 작성을 정확히 어디에 두어야합니까?
Bunyamin Inan

답변:


13

이 작업을 수행하기 위해 여러 가지 방법을 시도했습니다. 첫 번째 읽을 때 그의 대답을 이해하지 못했지만 그의 기여에 대해 @ matias-hidalgo에게 감사하고 싶습니다 :).

시나리오는 다음과 같습니다. 우리는이 두 개의 서로 다른 웹 사이트, 각 웹 사이트가 이 개 다음과 같이 서로 다른 매장보기 :

웹 사이트 1

  • 웹 사이트 1 (전자 상거래)
  • 웹 사이트 1 (Venda Assistida)

웹 사이트 2

  • 웹 사이트 2 (전자 상거래)
  • 웹 사이트 2 (Venda Assistida)

내 솔루션에서는 Magento Admin의 일부 구성을 변경하려고합니다 . 그런 다음 일부 하위 폴더 를 만들고 마지막으로 수정nginx.conf 합니다.

우선, Magento Admin 에서 일부 구성을 변경해야합니다 . 이동 Stores> - Configuration-> General-> Web. 각 상점보기마다 기본 URL 을 변경해야합니다 .

기본 구성

기본 구성에 대해 다음 구성을 제공하십시오. 여기에 이미지 설명을 입력하십시오

웹 사이트 1 (전자 상거래) 및 웹 사이트 1 (Venda Assistida)

모든 Website 1 상점보기에 대해 다음 구성을 제공하십시오 . 여기에 이미지 설명을 입력하십시오

웹 사이트 2 (전자 상거래) 및 웹 사이트 2 (Venda Assistida)

모든 Website 2 상점보기에 대해 다음 구성을 제공하십시오 . 여기에 이미지 설명을 입력하십시오

둘째, 우리는 만들 필요 website1하고 website2의 폴더 /pub디렉토리. 마지막으로 다음 폴더가 있어야합니다.

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

pub/index.php파일을이 디렉토리로 복사하십시오 . 그런 다음 MAGENTO_ROOT/pub/website1/index.php및 에서 일부 내용을 변경 MAGENTO_ROOT/pub/website2/index.php합니다.

의 내용 MAGENTO_ROOT/pub/website1/index.php

3 줄만 변경했습니다.

첫번째 줄 : require __DIR__ . '/../../app/bootstrap.php';

두 번째 줄 : $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';

세번째 줄 : $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);

마지막으로 nginx.confMAGENTO_ROOT 디렉토리에서 수정해야합니다 . 에 다음 구성을 입력하십시오 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;
    }
}

이 모든 구성 및 수정 후에는 웹 사이트를 하위 폴더로 사용할 수 있습니다. 도움이 되길 바랍니다.


1
이 구성에서 직면하고있는 유일한 문제는 정적 콘텐츠가 작동하지 않는 것입니다.
Aman Alam

@AmanAlam 설명 된대로 정적 컨텐츠의 기본 URL을 변경 했습니까? 우리는이 구성을 Magento 2.1에서 2 개의 서로 다른 클라이언트로 테스트했습니다.
Bunyamin Inan

네, 설명대로 기본 URL을 변경하고 작동합니다. 감사합니다
Aman Alam

1
@Bunyamin 나는 같은 방법을 따랐다. 홈페이지가 작동하지만 카테고리 및 제품 페이지에 404 오류가 발생했습니다. 어떠한 제안? 당신이 저를 도울 수 있습니까?
Jaimin

1
@Jaimin, nginx.conf가 아닌 nginx.conf.sample에서 위 코드를 사용하십시오. 문제를 해결합니다.
umair ayub

2

Nginx 구성으로 다음 구성 예를 사용할 수 있습니다.

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

이 index.php를 예로 사용하십시오.

/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);

명확히하기 위해 :

내 vhost nginx 구성에서 다음을 찾을 수 있습니다.

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

여기서 첫 번째 "/ your / subfolder"는 웹 사이트 URL로 원하는대로 변경할 수 있습니다. 예 www.mywebsite.com/stack/magento-> / stack / magento

그런 다음이 URL에로드 될 웹 사이트 코드를 정의하려면 웹 사이트 코드를 작성하는 index.php를 작성해야합니다.

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

나는 이것이 충분히 명확 해지기를 바란다. 나는 이것을 달성하기 위해 프로젝트에 시간을 보냈다. 그래서 그것이 효과가 있음을 알고 M1에서 어떻게 사용했는지에 더 가깝다.


이것이 어떻게 내 문제를 해결할 수 있는지 이해하지 못합니다. 여러 웹 사이트를 사용하는 방법을 구체적으로 물었습니다. 이 코드를 웹 사이트에도 사용할 수 있다고 제안하십니까?
Bunyamin Inan

"하위 도메인 대신 하위 폴더를 사용하고 싶습니다." 각 하위 폴더 설정이 어디 지금 명확히을 내 대답을 업데이 트됩니다
마티아스 히달고

그렇습니다. 나는 또한 내가 사용하고 싶다고 말했다 여러 웹 사이트하위 폴더를 . 상점 코드 가 무엇인지 이해하지 못 합니까?
Bunyamin Inan

상점 코드가 충분하다면 nginx 구성을 다룰 필요가 없습니다 ... 내 설명을 살펴보십시오
Matias Hidalgo

내 상점 코드와 웹 사이트 코드가 일치하면 작동합니다. 또한 각 웹 사이트마다 여러 상점이 있습니다.
Bunyamin Inan

0

"etc / nginx"의 domain.conf에서 맵을 만들어야합니다.

예를 들면 다음과 같습니다.

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

또는

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

하위 도메인 방식을 설명하고 있습니다. 내가 원하는 것은 하위 폴더 방식입니다. 나는 원하지 website1.magento-site.com않지만 나는 원한다 magento-site.com/website1.
Bunyamin Inan

하위 폴더를 같은 방식으로 매핑하고 하위 경로에 대한 정규식 재 작성을 추가 할 수 있습니다map $http_host$uri $MAGE_RUN_CODE
MagenX

나는이 방법을 시도, 그냥 404를 제공합니다.
themanwhoknowthetheman

@MagenX 다른 게시물 에서이 방법을 제안하는 것을 보았지만이 작업을 올바르게 수행하기위한 정확한 지침에 대해서는 자세히 설명하지 않습니다. 공유 할까?
themanwhoknowthetheman

0

이 이중 맵으로 순수한 nginx 솔루션은 어떻습니까?

먼저 웹 사이트 (@MagenX 덕분에)

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

새 요청 URI의 두 번째

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

마지막으로 새로운 계산 된 REQUEST_URI를 설정하는 것을 잊지 마십시오

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.