Magento 2: Nginx'i alt klasörle birden fazla web sitesi kullanacak şekilde yapılandırma


9

Magento 2'de birden fazla web sitesi oluşturmak istiyoruz. Resmi Magento 2 Belgelerinde bu konuyla ilgili bir makale var , ancak tarif ettikleri yol bizim durumumuz için uygun değil.

Farklı web sitelerini belirlemek için alt alan adları kullanmanızı önerir.

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

Alt alan adları yerine alt klasörleri kullanmak istiyoruz . Bir örnek vermek gerekirse,

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

Nginx web sunucusundaki bu sorunun üstesinden nasıl gelebiliriz?

Yapılandırmam

Ubuntu 16.04 kullanıyorum. Nginx'i yükledim ve herhangi bir Nginx çekirdek yapılandırmasını değiştirmedim. magento-site.com.confİçeride bir dosya oluşturdum /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;
}

DÜZENLEME 1: (2017-10-23)

Her web sitesi için birden fazla mağazam var.


sadece yeni yolunuz için yeniden yazmalar eklemeniz gerekiyor
MagenX

İçinde yeniden yazılan ve try_file blokların bir yeri vardır nginx.conf zaten. Yeni Magento 2 kurulumuna bakarsanız, birçok konfigürasyona sahip bir nginx.conf göreceksiniz.
Bunyamin İnan

@MagenX Lütfen daha fazla açıklayabilir misiniz? Yeniden yazımı tam olarak nereye koymalıyım?
Bunyamin İnan

Yanıtlar:


13

Bu görevi yerine getirmek için çeşitli yollar denedim. İlk okumada cevabını anlamadığım halde katkıları için @ matias-hidalgo'ye teşekkür etmek istiyorum :).

İşte senaryo. Biz iki farklı web siteleri ve her web sitesi var iki aşağıdaki gibi farklı mağaza görünümleri:

Web sitesi 1

  • Web sitesi 1 (E-ticaret)
  • Web sitesi 1 (Venda Assistida)

Web sitesi 2

  • Web sitesi 2 (E-ticaret)
  • Web sitesi 2 (Venda Assistida)

Çözümümde , Magento Admin'deki bazı yapılandırmaları değiştireceğiz . Sonra bazı alt klasörler oluşturacağız ve son olarak değiştireceğiznginx.conf .

Her şeyden önce, Magento Admin'de bazı yapılandırma değişiklikleri yapmamız gerekiyor . Git Stores> - Configuration-> General-> Web. Her mağaza görünümü için Temel URL'leri değiştirmemiz gerekiyor .

Varsayılan Yapılandırma için

Lütfen varsayılan yapılandırma için aşağıdaki yapılandırmayı sağlayın. resim açıklamasını buraya girin

Web Sitesi 1 (E-ticaret) ve Web Sitesi 1 (Venda Assistida) için

Lütfen tüm Web Sitesi 1 mağaza görünümleri için aşağıdaki yapılandırmayı sağlayın . resim açıklamasını buraya girin

Web Sitesi 2 (E-ticaret) ve Web Sitesi 2 (Venda Assistida) için

Lütfen tüm Web Sitesi 2 mağaza görünümleri için aşağıdaki yapılandırmayı sağlayın . resim açıklamasını buraya girin

İkinci olarak, dizinde klasör website1ve website2klasörler oluşturmamız gerekiyor /pub. Finalde aşağıdaki klasörlere sahip olmalısınız:

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

pub/index.phpDosyayı bu dizinlere kopyalayın . Sonra MAGENTO_ROOT/pub/website1/index.phpve 'de bazı değişiklikler yapacağız MAGENTO_ROOT/pub/website2/index.php.

İçeriği MAGENTO_ROOT/pub/website1/index.php

Sadece 3 satır değiştirdim:

1. Hat: require __DIR__ . '/../../app/bootstrap.php';

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

3. Satır: $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);

Son dokunuş nginx.confiçin MAGENTO_ROOT dizininizde değişiklik yapmamız gerekiyor . Lütfen aşağıdaki yapılandırmayı bilgisayarınıza ekleyin 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;
    }
}

Tüm bu yapılandırmalardan ve değişikliklerden sonra, web sitelerini alt klasör olarak kullanabilirsiniz. Umut ediyorum bu yardım eder.


1
Bu configration ile karşı karşıya olduğum tek sorun statik içerik çalışmıyor
Aman Alam

@AmanAlam Statik içerik için temel URL'yi açıklandığı gibi değiştirdiniz mi? Bu yapılandırmayı Magento 2.1'de 2 farklı istemciyle test ettik.
Bunyamin İnan

Evet açıklandığı gibi temel url değişti ve şimdi çalışıyor teşekkür ederim
Aman Alam

1
@Bunyamin Aynı yöntemi takip ettim. Ana sayfa çalışıyor ancak kategori ve ürün sayfası 404 hatası veriyor. Herhangi bir öneri? bana bu konuda yardım edebilir misin.
Jaimin

1
@Yayın, yukarıdaki kodu nginx.conf.sample içinde nginx.conf içinde kullanın. Sorununuzu düzeltir.
umair ayub

2

Nginx yapılandırmasına göre bu örnek yapılandırmayı kullanabilirsiniz:

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

ve örnek olarak bu index.php dosyasını kullanın:

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

Açıklığa kavuşturmak için:

Benim vhost nginx yapılandırmasında şunları bulacaksınız:

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

burada ilk "/ sizin / alt klasörünüz" web sitesi URL'si olarak ne istersen değiştirilebilir. eski www.mywebsite.com/stack/magento -> / stack / magento

Daha sonra bu url'ye yüklenecek web sitesi kodunu tanımlamak için, web sitesi kodunu buraya yazarak index.php'yi oluşturmanız gerekir:

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

Umarım bu şimdi yeterince açıktır, bunu yapmak için bir projede zaman harcamalıyım, bu yüzden işe yaradığını biliyorum ve M1'de bunu nasıl yaptığımızla daha yakın.


Bunun sorunumu nasıl çözeceğini anlamıyorum. Özellikle birden fazla web sitesinin nasıl kullanılacağını sordum. Bu kodun web siteleri için de kullanılabileceğini mi öneriyorsunuz?
Bunyamin İnan

"Alt alan adları yerine alt klasörleri kullanmak istiyoruz" dediniz. Şimdi her Alt Klasör yapılandırmasının nerede olduğunu açıklığa kavuşturarak cevabımı güncelleyeceğim
Matias Hidalgo

Evet, dedim. Ayrıca alt klasörleri olan birden çok web sitesi kullanmak istediğimi söyledim . Sadece mağaza kodunun orada ne yaptığını anlamıyorum ?
Bunyamin İnan

Bu sadece bir öneriydi, mağaza kodlarınız yeterince iyiyse nginx yapılandırmasıyla uğraşmanıza gerek yok ... şimdi açıklamama bir göz atın
Matias Hidalgo

Yani mağaza kodum ve web sitesi kodum eşleşirse bunun işe yarayacağını söylüyorsunuz. Ayrıca her web sitesi için birden fazla mağazam var.
Bunyamin İnan

0

domain.conf dosyasında "etc / nginx" içinde bir harita oluşturmanız gerekir.

Örneğin:

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

veya

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

Alt alan yolunu açıklıyorsunuz . İstediğim alt klasör yoludur. İstemiyorum website1.magento-site.comama istiyorum magento-site.com/website1.
Bunyamin İnan

alt klasörünüzü aynı şekilde eşleyebilir ve alt yol için normal ifade yeniden yazma özelliğini ekleyebilirsinizmap $http_host$uri $MAGE_RUN_CODE
MagenX

Bu yöntemi denedim, sadece 404 veriyor.
themanwhoknowstheman

@MagenX Bu yöntemi başka bir yayında önerdiğinizi gördüm, ancak bunun düzgün bir şekilde çalışmasını sağlamak için kesin yol tarifleri hakkında hiçbir zaman ayrıntıya girmezsiniz. Paylaşmak ister misiniz?
themanwhoknowstheman

0

Bu çift harita ile saf bir nginx çözümü ne olacak?

İlk olarak, web sitesi için (teşekkürler @MagenX)

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

Yeni istek için bir saniye uri

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

Son olarak, yeni hesaplanan REQUEST_URI ayarını yapmayı unutmayın

location ~ \.php$ {
(...)
   include fastcgi_params;
   fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
   fastcgi_param REQUEST_URI $REQUEST_URI;
(...)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.