Magento 2: उप-फ़ोल्डर के साथ एकाधिक वेबसाइटों का उपयोग करने के लिए Nginx को कॉन्फ़िगर कैसे करें


9

हम Magento 2 में कई वेबसाइट बनाना चाहते हैं। आधिकारिक मैगेंटो 2 प्रलेखन में इस विषय के बारे में एक लेख है , लेकिन वे जिस तरह का वर्णन करते हैं वह हमारे मामले के लिए उपयुक्त नहीं है।

वे विभिन्न वेबसाइटों, जैसे कि निर्धारित करने के लिए उप-डोमेन का उपयोग करने का सुझाव दे रहे हैं

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

हम उप-डोमेन के बजाय उप-फ़ोल्डर का उपयोग करना चाहते हैं । एक उदाहरण देने के लिए,

  • magento-site.com/ वेबसाइट १
  • magento-site.com/ वेबसाइट 2

हम Nginx वेब सर्वर पर इस समस्या को कैसे दूर कर सकते हैं?

मेरा विन्यास

मैं Ubuntu 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;
}

EDIT 1: (2017-10-23)

मेरे पास प्रत्येक वेबसाइट के लिए कई स्टोर हैं।


आपको बस अपने नए पथ के लिए फिर से लिखना होगा
MagenX

पहले से ही nginx.conf में बहुत सारे पुनर्लेखन और try_file ब्लॉक हैं । यदि आप ताजे Magento 2 की स्थापना को देखते हैं, तो आपको बहुत सारे कॉन्फ़िगरेशन के साथ एक nginx.conf दिखाई देगा।
बनीम इन्न

@ मेगनएक्सएक्स क्या आप और अधिक समझा सकते हैं? मुझे फिर से कहां लिखना चाहिए?
बनीम इयान

जवाबों:


13

मैंने इस कार्य को प्राप्त करने के कई तरीके आजमाए हैं। मैं उनके योगदान के लिए @ मतिअस-हिडाल्गो का शुक्रिया अदा करना चाहूंगा, हालांकि मुझे उनका जवाब पहली बार में समझ में नहीं आया :)।

यहाँ परिदृश्य है। हमारी दो अलग-अलग वेबसाइटें हैं, और प्रत्येक वेबसाइट में दो अलग-अलग स्टोर व्यूज निम्नानुसार हैं:

वेबसाइट 1

  • वेबसाइट 1 (ई-कॉमर्स)
  • वेबसाइट 1 (वेन्डा असिस्टिडा)

वेबसाइट 2

  • वेबसाइट 2 (ई-कॉमर्स)
  • वेबसाइट 2 (वेन्डा असिस्टिडा)

मेरे समाधान में, हम Magento के व्यवस्थापक में कुछ कॉन्फ़िगरेशन बदलने जा रहे हैं । फिर हम कुछ उप-फ़ोल्डर बनाने जा रहे हैं , और अंत में हम संशोधितnginx.conf करने जा रहे हैं ।

सबसे पहले, हमें Magento के व्यवस्थापन में कुछ कॉन्फ़िगरेशन परिवर्तन करने की आवश्यकता है । पर जाएं Stores-> Configuration-> General-> Web। हमें प्रत्येक स्टोर दृश्य के लिए बेस URL बदलने की आवश्यकता है ।

डिफ़ॉल्ट कॉन्फ़िगरेशन के लिए

कृपया डिफ़ॉल्ट कॉन्फ़िगरेशन के लिए निम्न कॉन्फ़िगरेशन प्रदान करें। यहां छवि विवरण दर्ज करें

वेबसाइट 1 (ई-कॉमर्स) और वेबसाइट 1 (वेन्डा असिस्टिडा) के लिए

कृपया सभी वेबसाइट 1 स्टोर विचारों के लिए निम्नलिखित कॉन्फ़िगरेशन प्रदान करें । यहां छवि विवरण दर्ज करें

वेबसाइट 2 (ई-कॉमर्स) और वेबसाइट 2 (वेन्डा असिस्टिडा) के लिए

कृपया सभी वेबसाइट 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.confआपकी MAGENTO_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
केवल समस्या मैं इस विन्यास के साथ सामना कर रहा हूँ स्थिर सामग्री काम नहीं कर रही है
अमन आलम

@AmanAlam क्या आपने वर्णित स्थिर सामग्री के लिए बेस url को बदल दिया है? हमने Magento 2.1 में 2 अलग-अलग ग्राहकों के साथ इस कॉन्फ़िगरेशन का परीक्षण किया है।
बनीम इन्न

जैसा कि वर्णन में बेस उर बदल गया है और इसका कार्य अब आपको धन्यवाद देता है
अमन आलम

1
@Bunyamin मैंने उसी विधि का पालन किया। होम पेज काम कर रहा है लेकिन श्रेणी और उत्पाद पृष्ठ 404 त्रुटि दे रहे हैं। कोई उपाय? क्या आप इसमें मेरी मदद कर सकते हैं
जैमिन

1
@Jaimin, nginx.conf.sample में nginx.conf में उपरोक्त कोड का उपयोग करें। यह आपकी समस्या को ठीक कर देगा।
उमैर अय्यूब

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

जहाँ वेबसाइट url के रूप में आप जो चाहते हैं, उसके लिए पहला "/ आपका / सबफ़ोल्डर" बदला जा सकता है। ex www.mywebsite.com/stack/magento -> / stack / magento

फिर वेबसाइट कोड को परिभाषित करने के लिए, जिसे इस url में लोड किया जाएगा, आपको यहाँ वेबसाइट कोड लिखने के लिए index.php बनाना होगा:

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

मुझे उम्मीद है कि अब यह काफी स्पष्ट है, मुझे इसे पूरा करने के लिए एक परियोजना में समय बिताना है, इसलिए मुझे पता है कि यह काम करता है और यह करीब है जैसा कि हम इसे M1 पर कैसे करते थे।


मुझे समझ में नहीं आता कि यह मेरी समस्या को कैसे हल करेगा। मैंने विशेष रूप से कई वेबसाइट का उपयोग करने का तरीका पूछा। क्या आप यह सुझाव दे रहे हैं कि इस कोड का उपयोग वेबसाइटों के लिए भी किया जा सकता है?
बनीम इयान

आपने कहा "हम उप-डोमेन के बजाय उप-फ़ोल्डर का उपयोग करना चाहेंगे।" मैं अपना जवाब अब स्पष्ट करूँगा कि प्रत्येक सबफ़ोल्डर कॉन्फ़िगरेशन कहाँ है
मतिस हिडाल्गो

हां, मैंने ऐसा कहा। मैंने यह भी कहा कि मैं उप-फ़ोल्डर्स के साथ कई वेबसाइटों का उपयोग करना चाहूंगा । मुझे अभी समझ नहीं आया कि स्टोर-कोड वहां क्या कर रहा है?
बनीमिन इनन

यह सिर्फ एक सुझाव था, अगर आपके स्टोर कोड काफी अच्छे हैं, तो आपको नगीन विन्यास से निपटने की आवश्यकता नहीं है ... अब मेरे स्पष्टीकरण पर एक नज़र है
मतियास हिडाल्गो

तो आप कह रहे हैं कि अगर मेरा स्टोर कोड और वेबसाइट कोड मेल करता है, तो यह काम करेगा। मेरे पास प्रत्येक वेबसाइट के लिए कई स्टोर हैं।
बनीमिन इनन

0

अपने domain.conf "etc / nginx" में आपको एक मानचित्र बनाने की आवश्यकता है।

उदाहरण के लिए:

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
बनीम इयान

आप अपने उप-फ़ोल्डर को उसी तरह से मैप कर सकते हैं, और उप-पथ के लिए regex rewrite जोड़ सकते हैंmap $http_host$uri $MAGE_RUN_CODE
MagenX

मैंने इस तरीके को आजमाया, बस 404 देता है।
themanwhoknowstheman

@ मेगनएक्सएक्स मैंने देखा है कि आप इस विधि को किसी अन्य पोस्ट पर सुझाते हैं, हालांकि आप इस कार्य को ठीक से प्राप्त करने के लिए सटीक दिशाओं पर विस्तार से कभी नहीं जाते हैं। साझा करने के लिए परवाह?
themanwhoknowstheman

0

इस दोहरे नक्शे के साथ शुद्ध नगनेक्स समाधान के बारे में क्या?

सबसे पहले, वेब साइट के लिए (साभार @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;
(...)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.