Magento2.2から2.4へバージョンアップをする練習をしたいので、まずはCentOS7にMagento2.2をインストールしたときの手順を残しておく。
環境
ホストOS Windows10
Virtualbox 6.1.12
Vagrant 2.2.10
ゲストOS CentOS7
ゲストOS内の環境
Magento 2.2
Apache 2.4
MySQL 5.7
PHP 7.0
Magentoの公式ドキュメントによるとまずはApache、PHP、MySQLのインストールが必要そう。
https://devdocs.magento.com/guides/v2.2/install-gde/prereq/apache.html
- Apache2.4をインストールする
- PHP7.0をインストールする
- MySQL5.7をインストールする
- Magento2.2をインストールする
- Apacheを起動する
- ホストOSからゲストOSのApacheへ接続する設定を追加
- 再度、Apacheにアクセスをする
- /var/www/html以下のファイル、ディレクトリの権限を調べる
- SELinuxの設定をPermissiveに変えてみる
- 既存のサーバからMySQLのデータをエクスポートしてゲストOSにインポートする
- 再度Apacheにアクセスをすると本番URLにリダイレクトされた
- Apacheにアクセスしたら無事にローカル環境のMagentoにアクセスができた
- 追記1|画面の表示崩れの原因はAllowOverride設定がNoneだった
- 追記2|Magentoの管理者画面にアクセスをすると404 not foundになる
Apache2.4をインストールする
現在のApacheが2.4.6なのでバージョン2.4をインストールする。
Apacheがインストールされているかの確認。結果になにも表示されないのでインストールされていない模様。
$ yum list installed | grep httpd
Apacheをインストールする。自動的にAapche2.4が表示されたのでyを選んでインストールを開始させる。
$ sudo yum install httpd ~略~ ================================================================================== Package Arch Version Repository Size ================================================================================== Installing: httpd x86_64 2.4.6-93.el7.centos base 2.7 M ~略~ Is this ok [y/d/N]: y ~インストール後~ $ httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Apr 2 2020 13:13:23
PHP7.0をインストールする
現在のPHPが7.0.25なのでバージョン7.0をインストールする。
PHPがインストールされているかを確認する。
$ yum list installed | grep php
インストールされていないようなのでインストールを進める。
$ sudo yum install php
表示されたバージョンが5.4.16-48.el7だったので7.0系をインストールするためにどうしたらいいか調べる。
Magentoのマニュアルを読んでいくとCentOSのサイトへのリンクがあったのだけれど、そのコマンドだとうまくいかなかったので以下のように進めた。
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm $ sudo yum install --enablerepo=remi-php70 php php-mbstring php-pear php-fpm php-mcrypt php-devel php-xml php-pdo php-pdo php-mysqlnd php-opcache php-xml php-gd php-mysql php-intl php-bcmath php-json php-iconv php-soap $ php --version PHP 7.0.33 (cli) (built: Aug 4 2020 08:21:15) ( NTS )
MySQL5.7をインストールする
現在のMySQLが5.7なので同じバージョンをインストールする。
MySQLのファイルをダウンロードしてインストールする。
$ wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm -P /tmp $ ls -l /tmp/mysql57-community-release-el7-7.noarch.rpm $ sudo yum localinstall /tmp/mysql57-community-release-el7-7.noarch.rpm $ sudo yum install mysql-community-server $ mysqld --version mysqld Ver 5.7.31 for Linux on x86_64 (MySQL Community Server (GPL))
MySQLをCentOS起動時に起動する、また、この時点で起動させる。
$ sudo systemctl enable mysqld $ sudo systemctl start mysqld $ systemctl status mysqld ● mysqld.service - MySQL Server Active: active (running)
インストール時の一時的なパスワードを表示させる。以下は************ですが、実際にはパスワードが表示されます。
$ sudo grep 'temporary password' /var/log/mysqld.log [Note] A temporary password is generated for root@localhost: ************
セキュアなインストールをするためのシェルを実行する。
mysql_secure_installationを実行してrootパスワードの変更、各種設定の変更を実施していきます。
$ mysql_secure_installation Securing the MySQL server deployment. Enter password for user root: #'temporary password'でgrepしたパスワード The existing password for the user account root has expired. Please set a new password. New password: #新しいrootユーザのパスワード Re-enter new password: #新しいrootユーザのパスワード Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL 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? (Press y|Y for Yes, any other key for No) : 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? (Press y|Y for Yes, any other key for No) : n ... skipping. By default, MySQL 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? (Press y|Y for Yes, any other key for No) : 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? (Press y|Y for Yes, any other key for No) : y Success. All done!
Magento2.2をインストールする
Magento2.2に必要なApache2.4、PHP7.0、MySQL5.7のインストールが完了したので、Magento2.2のインストールに進む。
現在、動作しているMagento2.2をすべてアーカイブして取得する(さきほどまでApacheなどをインストールしていたものとは別のサーバ)。
# cd /var/www/html/ # tar -cf magento.tar ./* # gzip magento.tar
取得したMagento2.2のアーカイブをインストールするゲストOSの/var/www/html以下に展開する。
Apacheを起動する
Magentoのファイル一式を展開が終わったのでホストOSからApacheにアクセスをしてみる。
sudo systemctl start httpd
Apacheを起動して 127.0.0.1へアクセス。
するとアクセスができない。
たしかにホストOSからゲストOSのApacheにアクセスをする設定をしていなかった。
ホストOSからゲストOSのApacheへ接続する設定を追加
設定を追加する前にゲストOSを停止させる。
Virtualboxの設定から「ネットワーク」を選択する。
アダプター1タブの割り当ては「NAT」を選択する。
さらに「高度」を押下して「ポートフォワーディング」に以下を追加する。
名前:任意
プロトコル:TCP
ホストIP:127.0.0.1 ※ホストOS以外の端末からアクセスする場合はホストOSのIPも追加
ホストポート:18080 ※未使用のものなら適当に
ゲストIP:空
ゲストポート:80 ※ゲストOSのApacheに設定したポート番号
設定が終わったらゲストOSを起動させて、Aapcheも起動させる。
再度、Apacheにアクセスをする
Virtualboxからネットワークの設定をしたので127.0.0.1:18080にアクセスをする。
すると500番エラーが返ってきた。
ゲストOSのApacheのログを確認する。
sudo tail -f /var/log/httpd/error_log
エラーログは以下のようなログが出力されていた。
メッセージを見た感じだと書き込めなくてエラーになったように見える。
PHP Fatal error: Uncaught Zend_Cache_Exception: cache_dir "/var/www/html/var/page_cache" is not writable in ...
/var/www/html以下のファイル、ディレクトリの権限を調べる
書き込めない系のエラーメッセージなので/var/www/html以下に格納したMagentoのファイル、ディレクトリの権限を調べてみる。
公式のSet file permissionsに記載されている設定と見比べてみると問題はなさそうに見えた。
https://devdocs.magento.com/guides/v2.2/install-gde/composer.html#set-file-permissionsより
cd /var/www/html/<magento install directory> find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} + find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} + chown -R :www-data . # Ubuntu chmod u+x bin/magento
SELinuxの設定をPermissiveに変えてみる
いつも忘れてしまうのがSELinux。これをいったんPermissiveに変更する。
外部公開ではないのでSELinuxをオフにしました。
$ getenforce Enforcing $ sudo setenforce Permissive $ getenforce Permissive
変更後にApache(127.0.0.1:18080)にアクセスをすると以下のメッセージが画面に表示された。
There has been an error processing your request Exception printing is disabled by default for security reasons. Error log record number: ※12桁の数字
Magentoのフォルダに12桁の数字のログが出ているので中身を確認してみる。
メッセージ的にMySQLをインストールしたままでデータをエクスポートなどしていないからに見える。
まずは、MagentoとApacheだけで画面が表示されないか見たかったのですが、MySQLの設定もしておかないといけないようです。
(ブログ記事ではmysql_secure_installationを用いてrootパスワード変更を行ってますが、実際はこのエラーメッセージが出たためmysql_secure_installationを実行しました。)
$ cat /var/www/html/var/report/12桁の数字 {"0":"SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' ・・・
既存のサーバからMySQLのデータをエクスポートしてゲストOSにインポートする
既存のサーバのDB接続ユーザ、パスワードを確認するにはMagentoのapp/etc/env.phpを確認する。
確認をしたら既存のサーバからデータをエクスポートする。
cd /tmp mysqldump -u root -p database_name > magento.sql
エクスポートしたファイルをホストOSにダウンロードして、ゲストOSからもアクセスできるようにする。
ゲストOSからエクスポートしたファイルをインポートする。
インポートする前にMySQLにデータベースを作成しておく必要があります。
$ mysql -u root -p mysql> create database database_name; mysql> show databases; mysql> exit; $ mysql -u root -p database_name < magento.sql
再度Apacheにアクセスをすると本番URLにリダイレクトされた
データベースのデータもインポートして、再度127.0.0.1:18080にアクセスをすると、本番URLにリダイレクトされてしまった。
原因を色々と調べてみると、どうもMagentoはcore_config_dataテーブルにサイトのURLを保持している。
そのためテーブルのデータをローカルIPに変更、デプロイとキャッシュのクリアを行った。
テーブルデータの更新
MySQLにアクセスをしてテーブルデータの確認と更新を行う。
$ mysql -u root -p mysql> use database_name; mysql> select * from core_config_data where path in ('web/unsecure/base_url', 'web/secure/base_url'); mysql> update core_config_data set value='http://127.0.0.1:18080/' where path='web/unsecure/base_url'; mysql> update core_config_data set value='https://127.0.0.1:18080/' where path='web/secure/base_url'; mysql> exit;
Magentoのコンパイルとデプロイ
Magentoのコンパイルとデプロイを行う。
このとき、PHPのエラーメッセージ(MiBPHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 69632 bytes) )が出力された。
理由はphp.iniのmemory_limitが128Mだったため不足していたため。
なのでphp.iniを編集して512Mにしました。
$ sudo bin/magento setup:di:compile $ sudo bin/magento setup:static-content:deploy -f
Magentoのキャッシュをクリアする
コンパイルとデプロイが終わったらキャッシュをクリアする。
$ sudo bin/magento cache:clean $ sudo bin/magento cache:flush
Apacheにアクセスしたら無事にローカル環境のMagentoにアクセスができた
これらの手順、調査をして127.0.0.1:18080にアクセスしたらようやくローカル環境のMagentoにアクセスができました。
ただ、画面の表示が崩れていたりするのでここからさらに調査、修正を行わないとならないようです。
当初の目的がローカル環境にMagento2.2の環境を作りたかったのでこの記事はここまでにします。
正直、OSと必要なソフトをインストールすればHello, World的な感じでトップ画面が確認できると思いましたが色々とてこずりました。
追記1|画面の表示崩れの原因はAllowOverride設定がNoneだった
CentOS7に既存のMagento2.2をコピーしてトップ画面を表示したらcssファイルなどがnot foundになって表示崩れが起きていた件。
まずは、ブラウザ開発者コンソール画面を表示してエラーがでていないか確認しました。
その結果、pub/static/versionNNNNNNNNNN/frontend/…略…/xxxxxxxxx.cssファイルが見つからないというメッセージが出ていました。
ファイルが存在をするかどうか確認をするとversionNNNNNNNNNNファイルが見つかりません。
色々とネットで調べていくとpub/static/.htaccessにリライト設定が入っていることを理解しました。
RewriteRule ^version.+?/(.+)$ $1 [L]
次にmod_rewriteがインストールされているか確認をすると、インストールはされておりました。
$ sudo find / -name mod_rewrite.so
そういえばhttpd.confの設定はデフォルトのままだったのでリライトがオンになっているか確認をすると、オフのままでした。
なので、AllowOverrideをNoneからAllに変更をしてApacheを再起動。
<Directory "/var/www/html"> #AllowOverride None AllowOverride All
その結果、cssファイルなどが参照できるようになり画面表示崩れも解決できました。
追記2|Magentoの管理者画面にアクセスをすると404 not foundになる
画面表示崩れも改善したので管理者画面にアクセスをしてみる。
127.0.0.1:18080/index.php/administrator
すると、404 not found画面になってしまった。
本当の原因を理解して進めたかったけれどあまり時間もかけられないので以下のQ&Aの操作で解決しました。
- var/cacheディレクトリをvar/__cacheにリネームする(上記のサイトでは削除)。
- SELECT * FROM core_config_data WHERE path = ‘web/seo/use_rewrites’のレコードのvalueを1から0に更新する。
- ブラウザから再度http://127.0.0.1:18080/index.php/administratorにアクセスする。
以上。CentOS7にMagento2.2をインストールした流れでした。
コメント