Magento 2: วิธีกำหนดค่า Nginx ให้ใช้หลายเว็บไซต์กับโฟลเดอร์ย่อย


9

เราต้องการสร้างเว็บไซต์หลายแห่งใน Magento 2 มีบทความเกี่ยวกับหัวข้อนี้ในเอกสารทางการของวีโอไอพี 2แต่วิธีที่พวกเขาอธิบายไม่เหมาะสำหรับกรณีของเรา

พวกเขาแนะนำให้ใช้โดเมนย่อยเพื่อกำหนดเว็บไซต์ที่แตกต่างเช่น

  • เว็บไซต์ 1 .magento-site.com
  • เว็บไซต์ 2 .magento-site.com

เราอยากจะใช้โฟลเดอร์ย่อยแทนโดเมนย่อย เพื่อยกตัวอย่าง

  • magento-site.com/ เว็บไซต์ 1
  • 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;
}

แก้ไข 1: (2017-10-23)

ฉันมีร้านค้าหลายแห่งสำหรับแต่ละเว็บไซต์


คุณเพียงแค่เพิ่มการเขียนใหม่สำหรับเส้นทางใหม่ของคุณ
MagenX

มีการเขียนซ้ำจำนวนมากและบล็อกtry_fileในnginx.confอยู่แล้ว ถ้าคุณดูที่สดติดตั้งวีโอไอพี 2 คุณจะเห็น nginx.conf มีจำนวนมากของการกำหนดค่า
Bunyamin Inan

@MagenX คุณช่วยอธิบายเพิ่มเติมได้ไหม? ฉันควรจะเขียนซ้ำตรงไหน?
Bunyamin Inan

คำตอบ:


13

ฉันได้ลองหลายวิธีเพื่อให้งานนี้สำเร็จ ฉันอยากจะขอบคุณ @ matias-hidalgo สำหรับการมีส่วนร่วมของเขาแม้ว่าฉันจะไม่เข้าใจคำตอบของเขาในการอ่านครั้งแรก :)

นี่คือสถานการณ์ เรามีสองเว็บไซต์ที่ต่างกันและแต่ละเว็บไซต์มีมุมมองร้านค้าที่ต่างกันสองแห่งดังนี้:

เว็บไซต์ 1

  • เว็บไซต์ 1 (อีคอมเมิร์ซ)
  • เว็บไซต์ 1 (Venda Assistida)

เว็บไซต์ 2

  • เว็บไซต์ 2 (อีคอมเมิร์ซ)
  • เว็บไซต์ 2 (Venda Assistida)

ในการแก้ปัญหาของเรากำลังจะเปลี่ยนการตั้งค่าบางอย่างในวีโอไอพีของผู้ดูแลระบบ แล้วเราจะไปสร้างโฟลเดอร์ย่อยบางส่วนและในที่สุดเราจะไปปรับเปลี่ยนnginx.conf

ครั้งแรกของทั้งหมดที่เราจำเป็นต้องทำการเปลี่ยนแปลงการกำหนดค่าบางอย่างในวีโอไอพีของผู้ดูแลระบบ ไปที่Stores-> Configuration-> ->General Webเราจำเป็นต้องเปลี่ยนURL พื้นฐานสำหรับมุมมองแต่ละร้าน

สำหรับการกำหนดค่าเริ่มต้น

โปรดระบุการกำหนดค่าต่อไปนี้สำหรับการกำหนดค่าเริ่มต้น ป้อนคำอธิบายรูปภาพที่นี่

สำหรับเว็บไซต์ 1 (อีคอมเมิร์ซ) และเว็บไซต์ 1 (Venda Assistida)

โปรดระบุการกำหนดค่าต่อไปนี้สำหรับมุมมองร้านค้าในเว็บไซต์ 1ทั้งหมด ป้อนคำอธิบายรูปภาพที่นี่

สำหรับเว็บไซต์ 2 (อีคอมเมิร์ซ) และเว็บไซต์ 2 (Venda Assistida)

โปรดระบุการกำหนดค่าต่อไปนี้สำหรับมุมมองร้านค้าในเว็บไซต์ 2ทั้งหมด ป้อนคำอธิบายรูปภาพที่นี่

ประการที่สองเราต้องสร้างwebsite1และwebsite2โฟลเดอร์ใน/pubไดเรกทอรี ในขั้นสุดท้ายคุณควรมีโฟลเดอร์ต่อไปนี้:

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

คัดลอกpub/index.phpไฟล์ลงในไดเรกทอรีเหล่านี้ จากนั้นเราจะทำให้การเปลี่ยนแปลงบางอย่างในและMAGENTO_ROOT/pub/website1/index.phpMAGENTO_ROOT/pub/website2/index.php

เนื้อหาของ MAGENTO_ROOT/pub/website1/index.php

ฉันมีการเปลี่ยนแปลง 3 บรรทัดเท่านั้น:

บรรทัดที่ 1: require __DIR__ . '/../../app/bootstrap.php';

บรรทัดที่ 2: $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website1';

บรรทัดที่ 3: $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
ปัญหาเดียวที่ฉันกำลังเผชิญกับการกำหนดค่านี้คือเนื้อหาแบบคงที่ไม่ทำงาน
Aman Alam

@AmanAlam คุณเปลี่ยน URL พื้นฐานสำหรับเนื้อหาแบบคงที่ตามที่อธิบายไว้หรือไม่ เราได้ทดสอบการกำหนดค่านี้กับลูกค้า 2 รายใน Magento 2.1
Bunyamin Inan

ใช่เปลี่ยน URL พื้นฐานตามที่อธิบายไว้และตอนนี้ทำงานได้ขอบคุณ
Aman Alam

1
@Bunyamin ฉันทำตามวิธีเดียวกัน หน้าแรกกำลังทำงาน แต่หมวดหมู่และหน้าผลิตภัณฑ์กำลังแสดงข้อผิดพลาด 404 ข้อเสนอแนะใด ๆ คุณช่วยฉันได้ไหม
Jaimin

1
@Jaimin ใช้รหัสด้านบนใน nginx.conf.sample ไม่ได้อยู่ใน nginx.conf มันจะแก้ไขปัญหาของคุณ
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;
    }

โดยที่ "/ ของคุณ / โฟลเดอร์ย่อย" แรกสามารถเปลี่ยนแปลงได้สำหรับสิ่งที่คุณต้องการเป็น URL ของเว็บไซต์ ตัวอย่าง www.mywebsite.com/stack/magento -> / stack / magento

จากนั้นเพื่อกำหนดรหัสเว็บไซต์ที่จะโหลดลงใน URL นี้คุณต้องสร้าง index.php เขียนรหัสเว็บไซต์ที่นี่:

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

ฉันหวังว่าตอนนี้จะชัดเจนเพียงพอฉันใช้เวลาในโครงการเพื่อทำสิ่งนี้ดังนั้นฉันจึงรู้ว่ามันใช้งานได้และมันใกล้เคียงกับวิธีที่เราเคยทำใน M1


ฉันไม่เข้าใจว่าสิ่งนี้จะแก้ปัญหาของฉันได้อย่างไร ฉันถามวิธีการใช้หลายเว็บไซต์โดยเฉพาะ คุณกำลังแนะนำว่าโค้ดนี้สามารถใช้กับเว็บไซต์ได้หรือไม่?
Bunyamin Inan

คุณพูดว่า "เราต้องการใช้โฟลเดอร์ย่อยแทนโดเมนย่อย" ฉันจะอัปเดตคำตอบของฉันตอนนี้ให้ชัดเจนว่าแต่ละโฟลเดอร์ย่อยคือที่ไหน
Matias Hidalgo

ใช่ฉันพูดอย่างนั้น ผมก็บอกว่าผมอยากจะใช้หลายเว็บไซต์ที่มีโฟลเดอร์ย่อย ฉันไม่เข้าใจว่ารหัสร้านค้ากำลังทำอะไรอยู่ที่นั่น
Bunyamin Inan

นั่นเป็นเพียงข้อเสนอแนะถ้ารหัสร้านค้าของคุณดีพอคุณไม่จำเป็นต้องจัดการกับการกำหนดค่า nginx ... ลองดูคำอธิบายของฉันตอนนี้
Matias Hidalgo

ดังนั้นคุณจะบอกว่าถ้ารหัสร้านค้าและรหัสเว็บไซต์ของฉันตรงกันจะทำงานได้ ฉันยังมีร้านค้าหลายแห่งสำหรับแต่ละเว็บไซต์
Bunyamin Inan

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
Bunyamin Inan

คุณสามารถแมปโฟลเดอร์ย่อยของคุณด้วยวิธีเดียวกันและเพิ่มการเขียน regex ใหม่สำหรับเส้นทางย่อยmap $http_host$uri $MAGE_RUN_CODE
MagenX

ฉันลองใช้วิธีนี้ให้ 404 คน
พวกเขา anwhoknowstheman

@MagenX ฉันเคยเห็นคุณแนะนำวิธีการนี้ในโพสต์อื่น แต่คุณไม่เคยไปลงรายละเอียดเกี่ยวกับทิศทางที่แน่นอนเพื่อให้การทำงานนี้ถูกต้อง สนใจที่จะแบ่งปัน?
themanwhoknowstheman

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.