AWS EC2のNginx環境にMagentoをインストールする

AWS EC2のNginx環境にPHP5.5でMagentoをインストールする

# EC2 + Nginx + RDS + PHP5.5 + Magento
Amazon Web ServiceのEC2での、Nginxサーバー環境にMagentoをインストールするチュートリアル。
日本版StackOverflowのようなQiitaでも、Magnetoの情報が少ないので投稿してみた。
Magentoは、導入段階に何度もテストをする事になるので、データベースサーバーを別に分ける意味でRDSを使用。
CDNなどはとりあえず置いておいて、動作することを目標にする。

ただでさえ重いMagentoをなるべく早くするために、強力なキャッシュ機能を持つZendOPcacheを標準でサポートするPHP5.5で構成。
Amimoto AMIをPHP5.5にバージョンアップする方法は別投稿参照。

#  更新状況
随時更新予定！

- 2014/03/01 5:20 Magentoのインストールなど更新
- 2014/03/01 3:26 最初の投稿　(1ストックありがとうございます)

# アジェンダ
- サーバー環境
- ソフトウェア環境
- インスタンスの用意
- Route53でテストサーバーのURLを登録
- Amimoto AMIの初期設定を把握・編集
- 各CONFファイルの設定変更
 - nginx.conf
 - www.conf
 - domain.conf
 - domain.backend.conf
- Magentoのインストール
 - ダウンロード
 - サーバーにアップ
 - パーミッションの設定
- MagentoをPHP5.4以降に対応させる
 - パッチスクリプトのダウンロード
 - サーバーにパッチファイルを作成
 - patchツールをダウンロード
 - パッチを当てる
- ブラウザでインストール

# サーバー環境
- AWS EC2 Tokyo Region
 - t1.micro Instance
 - [AMIMOTO.AMI](http://ja.megumi-cloud.com/)
- Amazon Linux OS 
- nginx version: nginx/1.4.3
- PHP 5.5.7 (fpm-fcgi)
 - オプションフルインストール
 - apcのみ停止
- MySQL　5.6.13
 - AWS RDS
- Route53

# ソフトウェア環境
- Magento Community Edition(CE) 1.8.0.0
- WordPressを同サーバーに共存

# インスタンスの用意
ポテンシャルの汎用性を信じつつ、WordPressも同サーバーに共存させる関係で、Amimoto AMIを使用。
[AMIMOTO.AMI](http://ja.megumi-cloud.com/)
インストールなどは別投稿参照。

# Route53でテストサーバーのURLを登録
MagentoはWordPress等と同じくURL情報をデータベースに保存するので、本番環境になるべく近づけるべく、Route53でテスト用URLを発行する。
後でMySQLデータベースを編集して、そのまま本番サーバーに移行可能。

# Amimoto AMIの初期設定を把握・編集
詳細は後で編集。
デフォルトで作成されるインスタンスIDフォルダはそのまま維持し、vhosts内にRoute53で取得したテストサーバーURLでフォルダを作りMagentoをインストールする。

# 各CONFファイルの設定変更

## nginx.conf
vi /etc/nginx/nginx.conf

```Bash:nginx.conf
http {
	proxy_connect_timeout 3000;
	proxy_send_timeout 3000;
	proxy_read_timeout 3000;
}
```

## www.conf

vi /etc/php-fpm-5.5.d/www.conf

```Bash:www.conf
[www]
request_terminate_timeout = 300
hp_admin_value[upload_max_filesize] = 64M
php_admin_value[post_max_size] = 64M
php_admin_value[max_execution_time] = 3000
```

## domain.conf
vi /etc/nginx/conf.d/domain.conf
ここの設定がかなり肝。

```Bash:domain.conf
server {
    server_name www.domain.com;
    return 301 $scheme://domain.com$request_uri;
}
server {
    listen      80;
    server_name domain.com;
    root        /var/www/vhosts/domain.com;
    charset     utf-8;
    access_log  /var/log/nginx/domain.com.access.log  main;
    error_log   /var/log/nginx/domain.com.error.log;

    ## maintenance mode ##
    ######################

#    set $maintenance on;
#    if ($remote_addr ~ (8.8.8.8|8.8.4.4)) {
#        set $maintenance off;
#    }
#    if ($uri ~ ^/(index.php/)?(paypal)/(.*)$ ) {
#        set $maintenance off;
#    }
#    if ($maintenance = on) {
#        return 503;
#    }
#    location /maintenance {}
#    error_page 503 @maintenance;
#    location @maintenance {
#        root /var/www/vhosts/domain.com/maintenance;
#        rewrite ^(.*)$ /index.html break;
#    }

    ##########################
    ## end maintenance mode ##

    location = /favicon.ico {
        try_files $uri =204;
    }

    location ~* \.(jpe?g|gif|css|png|js|ico|pdf|zip|tar|t?gz|mp3|wav|swf)$ {
        expires max;
    }

    location / {
        index index.html index.php;
        try_files $uri $uri/ @handler;
        rewrite ^/my-url.html /my-url/ permanent;
        rewrite ^/my-url.html http://domain.co.uk/ permanent;
        expires 7d;
    }

    location ~ ^/(app|includes|media/downloadable|pkginfo|report/config.xml|var)/ { deny all; }

    location ~ ^/(info.php|var/export/)/ {
        auth_basic "Restricted Access";
        auth_basic_user_file /etc/nginx/htpasswd;
    }

    location @handler {
        rewrite / /index.php;
    }

    location ~ .php/ {
        rewrite ^(.*.php)/ $1 last;
    }
    location ~ .php$ {
        include                   fastcgi_params;
        fastcgi_pass              phpfpm;
        fastcgi_index             index.php;
        fastcgi_split_path_info   ^(.+\.php)(/.+)$;
        fastcgi_param             SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param             SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param             PATH_INFO $fastcgi_path_info;
        fastcgi_param             MAGE_RUN_TYPE website;
        fastcgi_param             MAGE_RUN_CODE base;
        fastcgi_intercept_errors  on;
        fastcgi_connect_timeout   600;
        fastcgi_send_timeout      600;
        fastcgi_read_timeout      600;
        fastcgi_buffer_size       128k;
        fastcgi_buffers           4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_param  REMOTE_ADDR      $http_x_real_ip;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
    }

    #
    # When you use phpMyAdmin, uncomment the line "include /etc/nginx/phpmyadmin;"
    # and delete or comment out the below line "location ~* /(phpmyadmin|myadmin|pma) { }".
    #
    include     /etc/nginx/phpmyadmin;
```

wwwのリダイレクトを設定。
今回は無しに設定。
他は今後追記。

## domain.backend.conf

```Bash:domain.backend.conf
server {
    listen      unix:/var/run/nginx-backend.sock;
    server_name domain.com;
    root        /var/www/vhosts/domain.com;
    index       index.php index.html index.htm;

    access_log  /var/log/nginx/domain.com.backend.access.log backend;

    keepalive_timeout 25;
    port_in_redirect  off;

    gzip              off;
    gzip_vary         off;

    #include /etc/nginx/wp-singlesite;
    #include /etc/nginx/wp-multisite-subdir;
}
```

# Magentoのインストール
## ダウンロード
[Magento Community Edition Download](http://www.magentocommerce.com/download)
Magentoサイトのアカウントを持っていない人は登録してね。

最新は

> ver 1.8.1.0 - Added Dec. 11, 2013

だけど今回は諸事情で

> ver 1.8.0.0 - Added Sep 25, 2013

を使用。後で更新する。

ローカルにファイルが要らないなら、次項目でmagentoオフィシャルからwget

## サーバーにアップ
適当な所有しているサーバーにアップしてwgetするか、SCPでアップロード。
僕は面倒なのでEC2の他のインスタンスにアップしました。
なお、magentoのオフィシャルからもwget可能。
その場合のURLは
[http://www.magentocommerce.com/downloads/assets/1.8.0.0/magento-1.8.0.0.tar.gz](http://www.magentocommerce.com/downloads/assets/1.8.0.0/magento-1.8.0.0.tar.gz)

```Bash:Terminal
cd /var/www/vhosts/
wget http://otherinstance.com/magento-1.8.0.0.tar.gz
tar xzvf magento-1.8.0.0.tar.gz
mv magento domain.com
chown -R nginx:nginx domain.com
```

やったこと

- Amimoto AMIでのサイトルートフォルダを置くvhostsにmagento1.8.0.0.tar.gzをダウンロード
- wgetしたファイルを解凍
- 解凍したフォルダをdomain.confで設定したドメインのルートフォルダ名に変更
- wgetだとオーナー・グループがrootなので、nginxに変更

そのままtar.gzファイルを置いておくと、Magentoを初期化しやすいのでそのまま置いておく。

## パーミッションの設定

```Bash:Terminal
cd domain.com
chmod -R 777 app/etc
chmod -R 777 media
```

Magentoをインストールする際に書き込み権限が必要なフォルダのパーミッションを変更。

## MagentoをPHP5.4以降に対応させる
Zend OPcacheを使いたいがために、PHP5.5で動作させたい。
2014/1/17に、公式で5.4以降に対応したので、パッチを当てる。

### パッチスクリプトのダウンロード
[Magento Community Edition Download](http://www.magentocommerce.com/download)
の下の方、「Magento Community Edition Patches」からパッチをダウンロード。
Magentoアカウントでログイン必須。
対応するMagentoバージョンを選んでDOWNLOADを押すと

> PATCH_SUPEE-2619_EE_1.13.1.0_v1.sh

というファイルにリダイレクトされるので、全文をコピー。
### サーバーにパッチファイルを作成

```Bash:Terminal
cd /var/www/vhosts/domain.com/
vi patch.sh
```

先ほどコピーしたパッチ全文をコピーして、:wqで保存。

### patchツールをダウンロード
Amimoto AMIではpatchツールが標準でインストール**されていない**ので、yumでインストール。

```Bash:Terminal
yum install patch
```
### パッチを当てる

```Bash:Terminal
sh patch.sh
```

> Checking if patch can be applied/reverted successfully...
> Patch was applied/reverted successfully.

と表示されたらパッチインストール完了。

- app/code/core/Mage/Catalog/Model/Product.php（編集）
- app/code/core/Mage/Core/Controller/Varien/Router/Standard.php（編集）
- app/code/core/Zend/Pdf/FileParserDataSource.php（新規作成）

３つのファイルにパッチが当たる。
Principle Works様曰く
> このパッチで行われる変更点はバージョンによって異なりますが、
app/code/core/Mage/Core/Controller/Varien/Router/Standard.php
というファイルに対して行われる修正はかなり重要です。
このファイルは、Magentoがアクセスを受け付けたURLに対して、どのモジュールに処理を引き渡せばよいかを判断しているプログラムが書かれています。
ですが、このプログラムの動作がPHP5.3までとPHP5.4以降ではどうやら異なるようです（もちろん、その不具合を治すためのパッチです）。
もし、PHP5.4以降を使う場合にこのパッチを当てていない場合は、エクステンションや標準機能の一部で動作がおかしくなる事があります。

との事です。

## ブラウザでインストール
割愛。
KATS AI。