Magento 2: Cara mengkonfigurasi Nginx untuk menggunakan beberapa situs web dengan sub-folder

9

Kami ingin membuat beberapa situs web di Magento 2. Ada artikel tentang topik ini di Dokumentasi Magento 2 Resmi , tetapi cara mereka menggambarkannya tidak cocok untuk kasus kami.

Mereka menyarankan untuk menggunakan sub-domain untuk menentukan situs web yang berbeda, seperti

  • situs web1. magento-site.com
  • situs web2 .magento-site.com

Kami ingin menggunakan sub-folder alih - alih sub-domain . Untuk memberi contoh,

  • magento-site.com/ situs web1
  • magento-site.com/ website2

Bagaimana kita bisa mengatasi masalah ini di server web Nginx?

Konfigurasi Saya

Saya menggunakan Ubuntu 16.04. Saya telah menginstal Nginx , dan belum mengubah konfigurasi inti Nginx. Saya telah membuat file magento-site.com.confdi dalamnya /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)

Saya memiliki beberapa toko untuk setiap situs web.

Bunyamin Inan
sumber
Anda hanya perlu menambahkan penulisan ulang untuk jalur baru Anda
MagenX
Ada banyak penulisan ulang dan blok try_file di nginx.conf . Jika Anda melihat segar Magento 2 instalasi, Anda akan melihat nginx.conf dengan banyak konfigurasi.
Bunyamin Inan
@MagenX Bisakah Anda jelaskan lebih lanjut? Di mana tepatnya saya harus meletakkan penulisan ulang?
Bunyamin Inan

Jawaban:

13

Saya telah mencoba berbagai cara untuk mencapai tugas ini. Saya ingin mengucapkan terima kasih kepada @ matias-hidalgo untuk kontribusinya, meskipun saya tidak mengerti jawabannya pada awalnya baca :).

Inilah skenarionya. Kami memiliki dua situs web yang berbeda, dan setiap situs web memiliki dua tampilan toko yang berbeda sebagai berikut:

Situs web 1

  • Situs web 1 (E-commerce)
  • Situs web 1 (Venda Assistida)

Situs web 2

  • Situs web 2 (E-commerce)
  • Situs web 2 (Venda Assistida)

Dalam solusi saya, kita akan mengubah beberapa konfigurasi di Magento Admin . Kemudian kita akan membuat beberapa sub-folder , dan akhirnya kita akan memodifikasinginx.conf .

Pertama-tama, kita perlu membuat beberapa perubahan konfigurasi di Admin Magento . Pergi ke Stores-> Configuration-> General-> Web. Kita perlu mengubah URL Basis untuk setiap tampilan toko.

Untuk Konfigurasi Default

Harap berikan konfigurasi berikut untuk konfigurasi default. masukkan deskripsi gambar di sini

Untuk Situs Web 1 (E-commerce) dan Situs Web 1 (Venda Assistida)

Harap berikan konfigurasi berikut untuk semua tampilan toko 1 Situs web . masukkan deskripsi gambar di sini

Untuk Situs Web 2 (E-commerce) dan Situs Web 2 (Venda Assistida)

Harap berikan konfigurasi berikut untuk semua tampilan toko 2 Situs web . masukkan deskripsi gambar di sini

Kedua, kita perlu membuat website1dan website2folder di /pubdirektori. Di final, Anda harus memiliki folder berikut:

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

Salin pub/index.phpfile ke direktori ini. Kemudian kami akan membuat beberapa perubahan di MAGENTO_ROOT/pub/website1/index.phpdan MAGENTO_ROOT/pub/website2/index.php.

Isi dari MAGENTO_ROOT/pub/website1/index.php

Saya hanya mengubah 3 baris:

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

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

Baris ke-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);

Untuk sentuhan terakhir, kami perlu memodifikasi nginx.confdi direktori MAGENTO_ROOT Anda. Silakan masukkan konfigurasi berikut ke dalam file Anda 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;
    }
}

Setelah semua konfigurasi dan modifikasi ini, Anda akan dapat menggunakan situs web sebagai sub-folder. Saya harap ini membantu.

Bunyamin Inan
sumber
1
Satu-satunya masalah yang saya hadapi dengan konfigrasi ini adalah konten statis tidak berfungsi
Aman Alam
@AmanAlam Apakah Anda mengubah url dasar untuk konten statis seperti yang dijelaskan? Kami telah menguji konfigurasi ini dengan 2 klien berbeda di Magento 2.1.
Bunyamin Inan
Ya mengubah url dasar seperti dijelaskan dan berfungsi sekarang terima kasih
Aman Alam
1
@Bunyamin Saya mengikuti metode yang sama. Halaman Beranda berfungsi tetapi kategori dan halaman produk memberikan kesalahan 404. Ada saran? dapatkah Anda membantu saya dalam hal itu.
Jaimin
1
@Jaimin, gunakan kode di atas di nginx.conf.sample tidak di nginx.conf. Ini akan memperbaiki masalah Anda.
umair ayub
2

Dengan konfigurasi Nginx Anda dapat menggunakan konfigurasi contoh ini:

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

dan gunakan index.php ini sebagai contoh:

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

Untuk memperjelas:

Dalam konfigurasi nhostx vhost saya Anda akan menemukan ini:

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

di mana "/ your / subfolder" pertama dapat diubah untuk apa pun yang Anda inginkan sebagai url situs web. ex www.mywebsite.com/stack/magento -> / stack / magento

Kemudian untuk mendefinisikan kode situs web yang akan dimuat ke dalam url ini Anda harus membuat index.php menulis kode situs web di sini:

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

Saya harap ini sekarang sudah cukup jelas, saya harus menghabiskan waktu dalam sebuah proyek untuk menyelesaikan ini jadi saya tahu ini bekerja dan lebih dekat seperti yang kita lakukan pada M1.

Matias Hidalgo
sumber
Saya tidak mengerti bagaimana ini akan menyelesaikan masalah saya. Saya secara khusus bertanya bagaimana menggunakan banyak situs web. Apakah Anda menyarankan agar kode ini juga dapat digunakan untuk situs web?
Bunyamin Inan
Anda berkata, "Kami ingin menggunakan sub-folder alih-alih sub-domain." Saya akan memperbarui jawaban saya sekarang menjelaskan di mana masing-masing konfigurasi Subfolder
Matias Hidalgo
Ya, saya mengatakan itu. Saya juga mengatakan bahwa saya ingin menggunakan beberapa situs web dengan sub-folder . Saya hanya tidak mengerti apa yang dilakukan kode toko di sana?
Bunyamin Inan
Itu hanya saran, jika kode toko Anda cukup baik, Anda tidak perlu berurusan dengan konfigurasi nginx ... lihat penjelasan saya sekarang
Matias Hidalgo
Jadi Anda mengatakan bahwa jika kode toko dan kode situs web saya cocok, ini akan berfungsi. Saya juga memiliki beberapa toko untuk setiap situs web.
Bunyamin Inan
0

di domain Anda.conf di "etc / nginx" Anda perlu membuat peta.

sebagai contoh:

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

atau

map $request_uri $MAGE_RUN_CODE {
    default default;
    ~^/website1/.*  website1;
    ~^/website2/.*  website2;
}
Leonardo Garcia
sumber
Anda menjelaskan cara sub-domain . Yang saya inginkan adalah cara sub-folder . Aku tidak mau website1.magento-site.com, tapi aku mau magento-site.com/website1.
Bunyamin Inan
Anda dapat memetakan sub-folder Anda dengan cara yang sama, dan menambahkan regex rewrite untuk sub-pathmap $http_host$uri $MAGE_RUN_CODE
MagenX
Saya mencoba metode ini, hanya memberikan 404.
themanwhoknowstheman
@MagenX Saya telah melihat Anda menyarankan metode ini pada posting lain, namun Anda tidak pernah menjelaskan secara rinci tentang arah yang tepat untuk membuatnya bekerja dengan baik. Mau berbagi?
themanwhoknowstheman
0

Bagaimana dengan solusi nginx murni dengan peta ganda ini?

Pertama, untuk situs web (terima kasih @MagenX)

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

Sedetik untuk uri permintaan baru

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

Dan akhirnya, jangan lupa untuk mengatur REQUEST_URI yang baru dihitung

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