Debian10にMagento2(version.2.4.5)インストール手順

イントロダクション

2022年8月にMagento2のバージョン2.4.5がリリースされました。
このMagento2.4.5をDebian10にインストールする手順をご紹介します。
Magento2は下記のようなミドルウェアの構成環境で動作します。各Magentoバージョンのシステム構成要件については公式Documento Adobe公式インストールガイド:必要システム構成 で確認できます。

Magentoミドルウェア構成

本記事では下記のように1つのサーバーに必要なミドルウェア全部載せの構成とします。実際の公開環境を考えるとサーバーを分けたり、SSL環境(HTTPS通信)、WAF設定等をすべきですが、ここでは手順説明を簡略化するために、1台サーバー、HTTPアクセス環境をゴールとしています。

Debian10-Magento2.4.4-ミドルウェア構成図

なお、本記事の手順に関して下記のAdobe公式インストールガイドを参考にしています。

ミドルウェアのセットアップ

Apache2.4

Apache2.4をインストール

$ sudo apt update 
$ sudo apt install apache2

確認

$ sudo apache2 -v
Server version: Apache/2.4.38 (Debian)
Server built:   2021-12-21T16:50:43

(※)上記操作で既にApacheは起動しており、またOS起動時の自動起動serviceも有効になっています。

Apache必要モジュールを有効化します。
公式ドキュメントに下記Apacheモジュールを有効化するように記載があります。

  • mod_deflate.c
  • mod_expires.c
  • mod_headers.c
  • mod_rewrite.c
  • mod_security.c
  • mod_ssl.c

DebianのApacheモジュール管理の作法に従って有効化
(※)"mod_security.c"についてはApacheのWAF(Web Application Firewall)動作に関する部分であり構成により設定が変わる部分なので今回の記事では省略します。

$ sudo a2enmod deflate
$ sudo a2enmod expires
$ sudo a2enmod headers
$ sudo a2enmod rewrite
$ sudo a2enmod ssl

モジュールの有効可否の設定変更したので最後にApacheを再起動しておきます。

$ sudo systemctl restart apache2.service

MariaDB 10.4

依存パッケージインストール

$ sudo apt install -y software-properties-common dirmngr apt-transport-https wget curl

MariaDB 10.4 をインストール

$ cd /tmp
$ wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
$ echo "733cf126b03f73050e242102592658913d10829a5bf056ab77e7f864b3f8de1f mariadb_repo_setup" \
    | sha256sum -c -
$ chmod +x mariadb_repo_setup
$ sudo ./mariadb_repo_setup --mariadb-server-version="mariadb-10.4"
$ sudo apt update
$ sudo apt install -y mariadb-server mariadb-client

参考:mariadb.com:debian10 new version install

MariaDB初期セットアップ

$ sudo mysql_secure_installation

セットアップに関していくつか質問されるので適宜入力

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n
 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

(※)上記操作で既にMariaDBは起動しており、またOS起動時の自動起動serviceも有効になっています。

確認

$ mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 44
Server version: 10.4.26-MariaDB-1:10.4.26+maria~deb10-log mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> quit
Bye

PHP8.1

依存パッケージをインストール

$ sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2

リポジトリ追加

$ echo "deb https://packages.sury.org/php/ buster main" | sudo tee /etc/apt/sources.list.d/sury-php.list

GPGキーを追加

$ wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -

PHPパッケージのインストール

$sudo apt update
$sudo apt install php8.1

確認

$ php -v
PHP 8.1.9 (cli) (built: Aug 15 2022 09:50:29) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.9, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.9, Copyright (c), by Zend Technologies

Magento2で要求されるPHPモジュールのインストール

$ sudo apt install php8.1-{bcmath,curl,dom,gd,intl,mbstring,soap,xsl,zip}

php.ini の設定変更
公式インストールガイドに従い、 memory_limit, realpath_cache_size, realpath_cache_ttl の値を変更します。

$ sudo vi /etc/php/8.1/apache2/php.ini

・変更箇所: memory_limit

memory_limit = 128
memory_limit = 2G

・変更箇所: realpath_cache_size

;realpath_cache_size = 4096k
realpath_cache_size = 10M

・変更箇所: realpath_cache_ttl

;realpath_cache_ttl = 120
realpath_cache_ttl = 7200

Elasticsearch7.17

参考: elastic.co:Install Elasticsearch with Debian Package

依存パッケージをインストール

$ sudo apt-get install apt-transport-https

GPGキーをダウンロードしてインストール

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

Elasticsearch7パッケージリポジトリを追加

$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

Elasticsearch7パッケージのインストール

$ sudo apt-get update
$ sudo apt-get install elasticsearch

Elasticsearchの起動とOS起動時のservice有効化

$ sudo systemctl start elasticsearch.service
$ sudo systemctl enable elasticsearch.service

確認

$ curl -s -XGET http://localhost:9200/
{
  "name" : "ip-172-31-48-8",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "INEDPOlKR0ORmckMov2yDg",
  "version" : {
    "number" : "7.17.6",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "f65e9d338dc1d07b642e14a27f338990148ee5b6",
    "build_date" : "2022-08-23T11:08:48.893373482Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Composer2

インストーラーのダウンロード

$ cd /tmp/
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');";

/usr/binにcomposerをインストール

$ sudo php composer-setup.php --install-dir=/usr/bin --filename=composer;
$ composer self-update;
You are already using the latest available Composer version 2.4.1 (stable channel).

Apacheの設定

ホスト名とDocumentRootは任意の場所で構いません。
今回は、ホスト名を shop.szmake.net DocumentRootを /web/shop.szmake.net/www とします。
(※)以下の作業ログは shop.szmake.net の部分をご自身の環境に置き換える前提で参考にしてください。

$ sudo mkdir /web
$ sudo mkdir /web/shop.szmake.net
$ sudo mkdir /web/shop.szmake.net/www

Apacheバーチャルホスト設定

$ cd /etc/apache2/
$ sudo vi ./sites-available/shop.szmake.net.conf

shop.szmake.net.confの内容

<VirtualHost *:80>
        ServerName shop.szmake.net
        ServerAdmin webmaster@localhost
        DocumentRoot /web/shop.szmake.net/www

        # Allow encoded slashes
        AllowEncodedSlashes NoDecode

        <Directory /web/shop.szmake.net/www>
                AllowOverride All
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/shop.szmake.net-error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/shop.szmake.net-access.log combined
</VirtualHost>
$ cd ./sites-enabled/
$ sudo ln -s ../sites-available/shop.szmake.net.conf

設定有効化のためにApacheを再起動

$ sudo systemctl restart apache2.service

テストアクセス確認
ホスト名 shop.szmake.net のDNSのAレコードが今作業をしているサーバーに向くように適宜設定して、テスト用のindex.htmlの内容が表示されることを確認します。(忘れずにFirewall等のポート制限はHTTP用ポート80番を開放しておくこと)

テスト用HTML(index.html)の作成

$ echo 'here is shop.szmake.net' | sudo tee /web/shop.szmake.net/www/index.html

PCブラウザからHTTPアクセスしてテスト用HTMLが表示されればOKです。

MariaDBの事前設定

Magento用のDBアクセスユーザーとDBを作成します。

MariaDBにコンソールログインします。

$ sudo mysql -u root -p

Magento2で使用するデータベースをに作成します。

Magento 2のデータベースを新規に作成します。
文字コード=utf8mb4
照合順序=utf8mb4_general_ci
今回は mg2_shop というデータベース名にします。

> CREATE DATABASE mg2_shop CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

次にMagento2アプリケーションからDBアクセスする専用ユーザーを作成します。
今回は mg2 というユーザー名にします。
(※)SQLクエリの YOUR_PASSWORD の部分は任意の設定したいパスワードを指定のこと。

> CREATE USER 'mg2'@'localhost' IDENTIFIED BY 'YOUR_PASSWORD';
> GRANT ALL ON mg2_shop.* TO 'mg2'@'localhost' IDENTIFIED BY 'YOUR_PASSWORD' WITH GRANT OPTION;

権限管理系の変更なので FLUSH PRIVILEGES してからコンソールからログアウト

> FLUSH PRIVILEGES;
> exit;

接続テスト
今作成したユーザーで正常にDBアクセスできるか確認します。

$ mysql -u mg2 -p mg2_shop

パスワード入力後に下記のように表示されればOKです。

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 10.4.26-MariaDB-1:10.4.26+maria~deb10-log mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

コンソールからログアウト

> exit;

Magento本体のインストール

SWAPメモリの設定

Magentoのインストール時にメモリが足りないと途中でエラー終了してしまうことがあります。
最低でもメインメモリとSWAPメモリの合算が2GB程度必要なので、確認と適宜設定します。

現在のメモリ設定状況の確認

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          961Mi       820Mi        80Mi       8.0Mi        61Mi        36Mi
Swap:            0B          0B          0B

状況表示でメインメモリとSWAPメモリの合計が2GB以上であれば設定しなくてもOKです。
この記事作成の検証環境では、AmazonEC2のmicroプランなので1GBしかありませんので、以下コマンドでSWAPメモリを2GB設定します。

$ sudo fallocate -l 2G /swapfile
$ chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

改めて、メモリ設定状況の確認

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          961Mi       822Mi        59Mi       8.0Mi        79Mi        25Mi
Swap:         2.0Gi       0.0Ki       2.0Gi

スワップメモリの永続化
OS再起動するとスワップメモリ設定が戻ってしまうので永続化となるよう設定しておきます。

$ sudo vi /etc/fstab

fstabの最終行に下記を追記して上書き保存します。

/swapfile none swap sw 0 0 0

Magentoユーザー作成

MagentoはWebリクエストを処理するApacheユーザー(Debianなのでユーザー名 www-data)の他にCLI操作や定時自動実行専用のOSのユーザーを用意する必要があります。

ユーザー作成

$ sudo adduser magento_user

ApacheユーザーとDocumentRoot配下のファイルを共用するのでデフォルトグループを www-data グループにしておきます。

$ sudo usermod -g www-data magento_user

sudoコマンドを使いたい場合は sudo グループに含めておきます。

$ sudo adduser magento_user sudo

Magento2.4.5インストール

事前準備は整いました。
Composerを使ってMagentoのソースコードを配置してインストールします。
以後、事前に作成した magento_user で操作するので、magento_user へスイッチします。

$ su - magento_user

DodumentRootフォルダのパーミッションを変更しておきます。
(今回の例ではDoumentRootは、/web/shop.szmake.net/www です。shop.szmake.net の部分をご自身の環境に置き換える前提で参考にしてください

$ sudo chown magento_user:www-data /web/shop.szmake.net -R

前述ステップの Apacheのテストアクセス確認 で用意した index.htmlは削除します。

rm /web/shop.szmake.net/www/index.html

DocumentRootに移動してディレクトリの中身が空であることを確認します。

$ cd /web/shop.szmake.net/www $ ls -la

下記のように ... 以外が表示されなければOKです。

drwxr-xr-x 2 magento_user www-data 4096 Aug 26 07:05 .
drwxr-xr-x 3 magento_user www-data 4096 Xxx 26 00:42 ..

Composerコマンドでソース一式取得します。
/web/shop.szmake.net/www の部分はDocumentRootを指定

$ composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition=2.4.5 /web/shop.szmake.net/www

リポジトリのアクセスに際して、下記のようにUsernameとPasswordの認証入力を求められます。
ここでは、Marketplaceの”Authentication Key”取得方法の手順に従ってご自身のアカウントの AccessKey を入力します。
“Username" → [Public Key]の文字列を入力
“Password" → [Private Key]の文字列を入力

Authentication required (repo.magento.com):
      Username:
      Password:

AccessKey入力後に下記のような選択メッセージが表示されます。

Do you want to store credentials for repo.magento.com in /home/magento_user/.config/composer/auth.json ? [Yn]

ここでY(Yes)を入力すると、今回入力したAccessKey情報が /home/magento_user/.config/composer/auth.json へ書き込まれます。Composerを使ってrepo.magento.comリポジトリへアクセスする際にauth.jsonの内容が自動的に選択され入力不要となります。n(No)を選択すると今回入力したAccessKey情報は保存されません。


Magentoのインストールに際し、インストール処理時においてメモリ消費が多いので途中でメモリ不足で強制終了しないように、Magento2のインストーラー実行前にCLIモードのPHPのメモリ制限が無制限となっていることを確認します。
memory_limit = -1の表示を確認。

$ cat /etc/php/8.1/cli/php.ini | grep memory_limit
memory_limit = -1

Magento2をインストールします。
下記コマンドで自動的に初期セットアップの処理一式が実行されます。
指定パラメータ
参考: Installation Guide:Advanced install
[base-url]→ストアのホームとなるURLを指定します。
[db-host]→使用するMariaDBの接続先ホスト(今回は同じサーバーなので localhost)
[db-name]→使用するMariaDBのMagento用のデータベース名(今回は前Stepで作成した mg2_shop )
[db-user]→接続MariaDBのユーザー名
[db-password]→接続MariaDBのユーザーパスワード
[admin-firstname]→初期に自動作成するMagentoバックエンド画面ログイン用アカウントの名前(名)
[admin-lastname]→初期に自動作成するMagentoバックエンド画面ログイン用アカウントの名前(姓)
[admin-email]→初期に自動作成するMagentoバックエンド画面ログイン用アカウントのEmailアドレス
[admin-user]→初期に自動作成するMagentoバックエンド画面ログイン用アカウント名
[admin-password]→初期に自動作成するMagentoバックエンド画面ログイン用アカウントパスワード
[language]→ストアフロントとバックエンドの言語モード
[currency]→通貨
[timezone]→タイムゾーン
(※)インストール後、言語モードや通貨、タイムゾーンなどは後から管理画面から変更可能です。

DB_PASSWORD は前ステップで用意したmg2ユーザーのパスワードを指定
ADMIN_PASS は初期に自動作成するMagentoバックエンド画面ログイン用アカウントパスワード

$ php bin/magento setup:install  --cleanup-database \
--base-url=http://shop.szmake.net/ \
--db-host=localhost \
--db-name=mg2_shop \
--db-user=mg2 \
--db-password=DB_PASSWORD \
--admin-firstname=mosbin \
--admin-lastname=sakamoto \
--admin-email=shop@szmake.net \
--admin-user=admin \
--admin-password=ADMIN_PASS \
--language=ja_JP \
--currency=JPY \
--timezone=Asia/Tokyo \
--use-rewrites=1

インストールが始まります。しばらく待つと最後に下記のようなメッセージが表示されます。

[SUCCESS]: Magento installation complete.
[SUCCESS]: Magento Admin URI: /admin_184abc

バックエンド画面へのログインページURLはセキュリティの観点からランダム文字列で生成されます。
上記の場合、バックエンド画面のログインURLは http://shop.szmake.net/admin_184abc ということになります。メモをとっておきます。(もしも忘れた場合は、www(DocumentRoot)/app/etc/env.php の内容を見れば書かれています)

インストール処理によりDocumentRoot配下にフォルダ・ファイルが作成されたのでのオーナーとパーミッションを変更しておきます。

$ cd /web/shop.szmake.net/www
$ sudo chown -R magento_user:www-data .
$ find . -type d -exec chmod 770 {} \;
$ find . -type f -exec chmod 660 {} \;
$ chmod 770 bin/magento

最後に、Magentoの動作モードをProductionモードに変更してコンテンツをデプロイします。

$ cd /web/shop.szmake.net/www
$ bin/magento deploy:mode:set production

サイトが表示されるかブラウザで確認します。
フロントエンド画面の確認
PCブラウザから今回セットアップした http://shop.szmake.net へアクセス


バックエンド画面の確認
バックエンド画面のURLは http://ホスト名/[Magento Admin URI]です。
今回の例では[Magento Admin URI]が admin_184abc なので、
PCブラウザから今回セットアップした http://shop.szmake.net/admin_184abc へアクセスします。

インストール時のコマンドオプションで指定した[admin-user]と[admin-password]を入力してログインします。その次に、2段階認証(2FA)の設定を要求されます。インストール時のコマンドオプションで指定した[admin-email]に2FA初回登録に関する案内メールが送信されます。手順に従い2FAの設定をします。
もしも、「サーバーへMTAの設定がまだ済んでいない」「とりあえず動作確認したい」という場合には管理者ログイン2FA無効化手順で2FA無効化の設定をすれば、二段階認証をスキップして管理画面へアクセスする事もできます。

cronの設定

参考: Configure cron jobs
magento_user のcronとして登録する必要があります。必ず magento_user でコマンド実行のこと

$ su - magento_user
$ cd /web/shop.szmake.net/www
$ ./bin/magento cron:install --force

このコマンドにより、magento_user の cron設定が追加されます。
crontab -l で確認

$ crontab -l
#~ MAGENTO START 3d38b5c273f5e470f1b1e277a3d0847e2308b562537b5fc37a5c56bbc0e5cebb
* * * * * /usr/bin/php8.1 /web/shop.szmake.net/www/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /web/shop.szmake.net/www/var/log/magento.cron.log
#~ MAGENTO END 3d38b5c273f5e470f1b1e277a3d0847e2308b562537b5fc37a5c56bbc0e5cebb

phpMyAdminの導入(任意)

Magentoのデータベースのレコード確認やSQLクエリによるレコード集計のためにphpMyAdminをセットアップします。この作業はMagentoのセットアップに必須ではありません。不要であれば省略OK。

phpMyAdmin用のDcoumetRootを準備(magento_userで操作)

$ sudo mkdir /web/phpMyAdmin
$ sudo chown magento_user:www-data /web/phpMyAdmin
$ cd /web/phpmyadmin
$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-all-languages.zip
$ unzip phpMyAdmin-5.2.0-all-languages.zip
$ ln -s ./phpMyAdmin-5.2.0-all-languages www

phpMyAdminの初期設定
phpMyAdminのconfingファイルの編集。雛形(config.sample.inc.php)があるのでコピー後編集

$ cd /web/phpmyadmin/www
$ cp ./config.sample.inc.php ./config.inc.php
$ vi ./config.inc.php

config.inc.php の$cfg['blowfish_secret']の値を適当な32文字に変更
例)
$cfg['blowfish_secret’] = ";

$cfg['blowfish_secret’] = 'bNlSUYl5hbGWA8ba8Bx4RuqUFaqBEJNQ’;

phpMyAdminのアプリテンポラリ用ディレクトリ作成

$cd /web/phpmyadmin/www
$ mkdir ./tmp
$ chmod 770 tmp

Apacheのバーチャルホスト設定
ここではとりあえず、今回はPort10085でHTTPアクセスとします。
(注意)実運用環境では必ずSSL化(HTTPS)してください。HTTP環境だと平文でデータ通信されるためphpMyAdminのログインID情報、phpMyAdminのレスポンスHTMLが丸見えになってしまい大変危険です。

Apacheバーチャルホスト設定

$ cd /etc/apache2/
$ sudo vi ./sites-available/phpMyAdmin.conf

phpMyAdmin.confの内容
不正アクセスを防ぐためアクセス元のIP制限をかけておきます。XXX.XXX.XXX.XXX の部分を環境に併せてアクセス元IPを指定します。(不要な場合は Require all granted を指定)

<VirtualHost _default_:10085> ServerName shop.szmake.net ServerAdmin webmaster@localhost DocumentRoot /web/phpMyAdmin/www <Directory /web/phpMyAdmin/www> AllowOverride All # Require all granted Require ip XXX.XXX.XXX.XXX # RewriteEngine On # RewriteCond %{HTTP:X-Forwarded-Proto} !=https # RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L] </Directory> ErrorLog ${APACHE_LOG_DIR}/phpMyAdmin-error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/phpMyAdmin-access.log combined </VirtualHost>

DebianのApache設定管理作法に従って定義ファイルを site-enable ディレクトリにシンボリックリンク作成

$ cd ./sites-enabled/
$ sudo ln -s ../sites-available/phpMyAdmin.conf

設定有効化のためにApacheを再起動

$ sudo systemctl restart apache2.service

phpMyAdminのページへアクセスしてみます。
http://shop.szmake.net:10085

セットアップで作成したMagento用のDBユーザーでログイン

Magentoインストーラーが自動作成したテーブルが表示されます。