１つのサーバーに異なるphpのversionでmagentoをインストールしたかった。（失敗談）

本記事は[Magento2 Advent Calendar 2018] (https://adventar.org/calendars/3176) 20日目の記事になります。。
php7.1のmagento2.2.7とphp7.2のmagento2.3をphpenvを使って同じサーバーでインストールしたかった話です。

# 手順

- phpenvのインストール
    - phpenvのインストール
    - phpenvの下準備　
    - php7.1のインストール
    - php7.2のインストール
- apache2のインストール
    - apache2の設定
- mysqlのインストール
    - mysqlの設定
- composerを使ってmagentoのソースをダウンロード
    - magento2.2.7のインストール
    - magento2.3のインストール

    
# phpenvのインストール

まずphpenvを/usr/srcにインストールします。
phpenvのインストールは[CentOS7にphpenvをインストールし、PHPのバージョンを管理する](http://qs.nndo.jp/2017/08/16/666/)を参考にさせていただきました。

```Bash
$ cd /usr/src
$ git clone https://github.com/CHH/phpenv.git
$ cd phpenv/bin/
$ ./phpenv-install.sh
Installing phpenv in /root/.phpenv
Cloning into '/root/.phpenv'...
remote: Enumerating objects: 2744, done.
remote: Total 2744 (delta 0), reused 0 (delta 0), pack-reused 2744
Receiving objects: 100% (2744/2744), 515.63 KiB | 130.00 KiB/s, done.
Resolving deltas: 100% (1720/1720), done.
Success.

$　　export PATH="/root/.phpenv/bin:$PATH"
$　　eval "$(phpenv init -)"
```

phpenvが読めることを確認します。

```Bash
$ phpenv --version
$ rbenv 1.1.1-39-g59785f6

```
## php-buildのインストール
PHPをインストールするためのphp-buildを取得します。

```bash
$ git clone https://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
```

## phpenvの下準備
このままphpをインストールしてもエラーになるため追加で下記のものをインストールします。
※　余計な物が入っているかもしれませんが私の環境の場合は全部いれないとエラーになってしまいました。

```bash
$ apt install  autoconf \
  automake \
  libxml2-dev \
  libcurl4-openssl-dev \
  libssl-dev \
  openssl \
  gettext \
  libicu-dev \
  libmcrypt-dev \
  libmcrypt4 \
  libbz2-dev \
  libreadline-dev \
  build-essential \
  libmhash-dev \
  libmhash2 \
  libxslt1-dev \
  libtidy-dev  \
  re2c 

$　　apt-get install libxml++2.6-dev  \
  libpng-dev \
  libcurl4-gnutls-dev \
  libjpeg-turbo8-dev 
```

## phpのインストール
今回は php7.2.13 と php7.1.25 をインストールします。

```bash
$　　phpenv install 7.2.13
$　　phpenv install 7.1.25
```
とても時間がかかるので気をつけてください。
sshで接続の場合　サーバーから切断されてしまう可能性があるのでsshのconfファイルの設定をすることをお勧めします。
[~/.ssh/configについて](https://qiita.com/passol78/items/2ad123e39efeb1a5286b)


インストールが終わったら使うphpを選択します。

```bash
# 今回は7.1.25を先に使います。
$ phpenv global 7.1.25 
```

### magento インストールに必要なphpのモジュールをインストールします。

```bash
$ sudo apt-get -y update
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get -y update
$ sudo apt-get install -y php7.1 libapache2-mod-php7.1 php7.1-common php7.1-gd php7.1-mysql php7.1-mcrypt php7.1-curl php7.1-intl php7.1-xsl php7.1-mbstring php7.1-zip php7.1-bcmath php7.1-iconv php7.1-soap
```


# userの作成

root権限を持つuserを作成します

```bash
$ adduser magento
$ gpasswd -a magento sudo
```
パスワードはお好みで、パスワードを入力したらあとは全てEnterで大丈夫です。

# apache2のインストール

``` bash 
$ apt install apache2 -y
```

### apache2 の設定

apacheの設定などは[magento2：開発環境構築（初級者編）](https://qiita.com/hitomi_gi/items/4ffa8abe98d317d72a05)を参考にさせていただきました。

```bash
 $ sudo vim /etc/apache2/apache2.conf
```

```bash
 <Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
 </Directory>

 Servername localhost
```
こんな感じにします。

```bash
 # 「rewrite」 を有効にします。
 $ cd /etc/apache2/mods-enabled/
 $ sudo a2enmod rewrite
```



### 実行ユーザーを統一

apacheの実行者のズレによってmagento側でエラーが発生するため、実行ユーザー・グループを先ほど作成したmagentoに統一します。

```bash
$ sudo vim /etc/apache2/envvars
```

```bash
       export APACHE_RUN_USER=magento
       export APACHE_RUN_GROUP=magento
```

# mysqlのインストール

```bash
$ apt install mysql-server mysql-client
```

### mysqlの設定

rootユーザーでmysqlにログインします。

```bash
$ sudo mysql -u root 
```
databaseとuserを作成します。

```bash
create database magento;
create user magento IDENTIFIED BY 'magento';
GRANT ALL ON magento.* TO magento@localhost IDENTIFIED BY 'magento';
flush privileges;
```

# phpcomposerをインストール

magento install に必要なphpComposerをインストールします。

```bash
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
```

# magento install (2.2.7)

magentoをインストールするためにmagentoのアカウントを作成して、アクセスキーを取得し公開鍵と秘密鍵を入手しておいてください。

https://magento.com/

```bash
# magentoをinstall するためのディレクトリーを作成
$ mkdir -p /var/www/html/magento2.2.7

# magento2.2.7をダウンロード
$ php composer.phar create-project --repository-url=https://repo.magento.com/ magento/project-community-edition=2.2.7 /var/www/html/magento2.2.7/

# パーミッションを設定
$ chmod 777 -R /var/www/html/magento2.2.7/*
```
Authentication required (repo.magento.com): には

```bash

        Username:　公開鍵
        Password:　秘密鍵
```
を入力します。

ダウンロードが終わったら
http://ipaddress/magento2.2.7
にアクセスしてインストールします。

# magento install (2.3)

インストールが終わったらphpのバージョンを切り替えます

```bash
$ phpenv global 7.2.13
```

### magento インストールに必要なphpのモジュールをインストールします。

```bash
$ sudo apt-get -y update
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get -y update
$ sudo apt-get install php7.2 libapache2-mod-php7.2 php7.2-common php7.2-gd php7.2-mysql  php7.2-curl php7.2-intl php7.2-xsl php7.2-mbstring php7.2-zip php7.2-bcmath  php7.2-soap
```
magento2.3をダウンロードします。

```bash
# magento2.3をインストールするためのディレクトリーを作成
$ mkdir /var/www/html/magento2.3

# magento2.3をinstall
$ php composer.phar create-project --repository=https://repo.magento.com/ magento/project-community-edition /var/www/html/magento2.3

# パーミッションを設定
$ chmod 777　-R /var/www/html/magento2.3/*

```

ダウンロードが終わったら
http://ipaddress/magento2.3
にアクセスしてインストールします。



# なぜ失敗なのか
CLI側のphpのvarsionは切り替わっているのですが、webserver側のphpのvarsionが切り替わらずどちらもphp7.1でインストール・ダウンロードしている状態になっています。
一応phpenv-apache-versionなど試してみたのですがうまく動きませんでした。

# おわりに

来年のMagento Advent Calendarでは成功談を話せる様に頑張ります。
アドバイスや助言がありましたらコメントにお願いします。
パーミッションはインストールを目標にしているためセキュリティなどは考えておりません注意してください。


# 参考資料

- phpenvのインストール
    - CentOS7にphpenvをインストールし、PHPのバージョンを管理する　http://qs.nndo.jp/2017/08/16/666/
- magentoのインストール 
    - magento2：開発環境構築（初級者編）https://qiita.com/hitomi_gi/items/4ffa8abe98d317d72a05
    - Install Magento using Composer
https://devdocs.magento.com/guides/v2.2/install-gde/composer.html

参考にさせて頂きました、ありがとうございました。