Help us understand the problem. What is going on with this article?

【JAWS-UG関西女子会】#2 ELB+EC2+RDSでECサイトをつくろう ~EC-CUBEコンテンツ同期編~

More than 3 years have passed since last update.

はじめに

この記事はJAWS-UG関西女子会「はじめて女子応援企画!事例から学ぶもくもく&もぐもぐ会」で
もぐもぐ 1 もくもくする際のテキストとなります。

本記事での目標

  • EC2でWEBサーバーを構築すること
  • RDSでデータベースサーバを構築すること
  • EC2インスタンスへEC-CUBEインストール及び疎通確認
  • ELBでWEBサーバーの負荷分散をすること

以下のような構成となります。
ELB000301.JPG

EC2インスタンスへEC-CUBEインストール及び疎通確認

EC2インスタンスへEC-CUBEインストール及び疎通確認するまでのながれ

  1. EC-CUBEのインストール
  2. コンテンツの同期設定
  3. 同期設定確認

構築手順

1. EC-CUBEのインストール

こちらを参照して下さい

2. コンテンツの同期設定

EC-CUBEをWEBサーバ2台構成で運用する場合、アップロードしたコンテンツの同期をしないとコンテンツのアップロード作業が2倍となってしまいます。
このため、アップロードしたコンテンツは自動的にもう片方のサーバへ同期するように設定を行います。

同期設定としてrsyncとlsyncを組み合わせます。
rsyncはサーバ間同期を行うもので、lsyncではフォルダ内の更新(ファイルの新規アップロードや上書きなど)を検知してrsyncコマンドを発行させるものです。
この設定を行うと双方向でのサーバ間同期が可能となります。
そうすると、どちらかがサーバダウンしている間にコンテンツのアップロードを行ったとしてもダウンしていたサーバが起動した際に同期のリトライを行います。
削除は無視して追加のみのモードとする為、同期処理によってファイルが消えることはありません。

現在、プレビュー版でオレゴンリージョンのみ利用可能となっていますが、EFSという共有ドライブをNFSマウントできるサービスがあります。
EFSが東京リージョンで正式リリースとなったらそれに変えたいなあと思いつつ・・・

2.1.WEB01での設定

◆同期用ユーザ作成

$ sudo su - root
# useradd syncuser
# passwd syncuser

◆同期先作成

# vi /etc/rsyncd.conf

-------------------以下を記述-------------------
[root]
    path = /var/www/html/eccube/html/user_data
    hosts allow = 172.31.0.0/16
    read only = false
    uid = syncuser
    gid = syncuser
-------------------ここまで-------------------

# yum -y install xinetd
# yum -y install gcc

◆rsync起動

# /etc/rc.d/init.d/xinetd start
# chkconfig rsync on

◆lsyncdインストール

# yum -y install libxml2-devel lua-devel lua-static
# export LUA_CFLAGS='-I/usr/include -lm -ldl'
# export LUA_LIBS='/usr/lib64/liblua.a'
# wget https://lsyncd.googlecode.com/files/lsyncd-2.1.5.tar.gz

# tar zxvf lsyncd-2.1.5.tar.gz
# cd lsyncd-2.1.5
# ./configure && make && make install

◆lsyncd設定

WEB02のPrivate IP指定部分はここではまだ不明なのでてきとうな値を入れておき、後で修正します。

# vi /etc/lsyncd.conf

-------------------以下を記述-------------------
settings {
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 1, ←WEB01の場合は「1」
}

sync{
        default.rsync,
        source="/var/www/html/eccube/html/user_data/",
        target="172.31.xx.xx:/var/www/html/eccube/html/user_data/", ←WEB02のPrivate IPを指定。
        delete = false,
        rsync  = {
                archive = true,
                links   = true,
                update  = true,
                verbose = false
        }
}
-------------------ここまで-------------------

◆鍵作成(ノンパスフレーズ)

# cd /home/syncuser
# su syncuser
$ mkdir .ssh
$ cd .ssh
$ ssh-keygen -t rsa -N ""
Generating public/private rsa key pair.
Enter file in which to save the key (/home/syncuser/.ssh/id_rsa): そのままEnterを押す
Your identification has been saved in /home/syncuser/.ssh/id_rsa.
Your public key has been saved in /home/syncuser/.ssh/id_rsa.pub.
The key fingerprint is:
RSAが表示されます

$ cp id_rsa.pub authorized_keys
$ chmod 600 authorized_keys
$ cd ../
$ chmod 700 .ssh

◆sshdの設定確認

$ sudo su - root
# vi /etc/ssh/sshd_config
AuthorizedKeysFile      .ssh/authorized_keys
コメントアウトされていたら、外す

◆lsyncd起動ファイル設定

# vi /etc/rc.d/init.d/lsyncd

-------------------以下を記述-------------------
#!/bin/bash
#
# lsyncd
#
# chkconfig: - 99 20
# description: lsyncd auto start script

LSYNC_USER="syncuser"

start() {
    su - $LSYNC_USER -c "/usr/local/bin/lsyncd /etc/lsyncd.conf"
}

stop() {
    /bin/kill -9 `/sbin/pidof lsyncd`
    until [ -z $(/sbin/pidof lsyncd) ]; do :; done
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        pid=`pidof lsyncd`
        if [ $? -eq 0 ]; then
            echo "lsyncd (pid $pid) is running..."
        else
            echo "lsyncd is not running"
        fi
        ;;
    *)
        echo "Usage: lsyncd {start|stop|restart|status}"
        exit 1
esac

exit $?
-------------------ここまで-------------------


# chmod +x /etc/rc.d/init.d/lsyncd
# chkconfig --add lsyncd
# chkconfig lsyncd on

◆カーネルパラメーター設定

# vi /etc/sysctl.conf

以下を一番下に追記
fs.inotify.max_user_watches = 30000

# sysctl -p

◆FTPインストール

# yum install vsftpd

◆FTP設定

※同期確認のために使用するので簡単な設定にしています。234

# vi /etc/vsftpd/vsftpd.conf

ascii_upload_enable=YES ←「#」を消す
ascii_download_enable=YES ←「#」を消す

------以下を追記------
pasv_min_port=65000
pasv_max_port=65010
pasv_address=52.xx.xx.xx ←WEB01のPublic IPアドレスを記入
------ここまで------

# chkconfig vsftpd on
# chkconfig
vsftpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off

# service vsftpd start

# chmod go+w /var/www/html/eccube/html/user_data

ふたつめのEC2インスタンスの起動を行います。
こちらを参照して下さい

2.2.WEB02での設定

※これ以降の設定はWEB02作成後に行います!!

◆lsyncd設定

WEB01側のlsyncd設定でWEB02のPrivate IPアドレスの設定をしていないので修正します。

WEB01側修正

# vi /etc/lsyncd.conf

settings {
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 1, ←WEB01の場合は「1」
}

sync{
        default.rsync,
        source="/var/www/html/eccube/html/user_data/",
        target="172.31.xx.xx:/var/www/html/eccube/html/user_data/", ←WEB02のPrivate IPを指定。
        delete = false,
        rsync  = {
                archive = true,
                links   = true,
                update  = true,
                verbose = false
        }
}

lsyncdサービス再起動

#service lsyncd restart

もしも以下の様な表示がされた場合はもう一度同じコマンドを叩いてみましょう。

Usage:
 kill [options] <pid|name> [...]

Options:
 -a, --all              do not restrict the name-to-pid conversion to processes
                        with the same uid as the present process
 -s, --signal <sig>     send specified signal
 -q, --queue <sig>      use sigqueue(2) rather than kill(2)
 -p, --pid              print pids without signaling them
 -l, --list [=<signal>] list signal names, or convert one to a name
 -L, --table            list signal names and numbers

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see kill(1).

以下のコマンドを叩いてlsyncが起動していることを確認します
結果の行の一番右側に「/usr/local/bin/lsyncd /etc/lsyncd.conf」と表記されている行があれば起動しています。

# ps aux | grep lsyncd
syncuser 14384  0.0  0.0   9996   864 ?        Ss   07:30   0:00 /usr/local/bin/lsyncd /etc/lsyncd.conf

WEB02側修正

# vi /etc/lsyncd.conf

settings {
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 2, ←WEB02の場合は「2」に変える
}

sync{
        default.rsync,
        source="/var/www/html/eccube/html/user_data/",
        target="172.31.xx.xx:/var/www/html/eccube/html/user_data/", ←WEB01のPrivate IPを指定
        delete = false,
        rsync  = {
                archive = true,
                links   = true,
                update  = true,
                verbose = false
        }
}

lsyncdサービス再起動

#service lsyncd restart

FTP設定修正

# vi /etc/vsftpd/vsftpd.conf

pasv_address=52.xx.xx.xx ←WEB02のPublic IPアドレスを記入

# service vsftpd restart

セキュリティグループ設定
WEBサーバ用のセキュリティグループに以下の設定を追加します。

Type Protocol Port Range Source
SSH TCP 22 WEBサーバ用セキュリティグループ
Custom TCP Rule TCP 21 MyIP
Custom TCP Rule TCP 65000 - 65010 MyIP

3. 同期設定確認

ここでは以下ができることを確認します。
・WEB01にアップロードしたファイルがWEB02に同期されること
・WEB02にアップロードしたファイルがWEB01に同期されること
・ファイルの削除は同期されないこと

3.1.準備

1.TeratermでWEB01とWEB02にログインします。
2.FFFTPでWEB01とWEB02にログインします。

ホスト名の部分にはPublic IPアドレスを指定して下さい
ELB000292.png

3.Teratermで「/var/www/html/eccube/html/user_data」に移動します。

$ cd /var/www/html/eccube/html/user_data
$ ls -l ←何もファイルがないことを確認

3.2.確認実施

1.FFFTPでWEB01の/var/www/html/eccube/html/user_dataにファイル(なんでもOK)をアップロードします

2.WEB01側のTeraTermでls -lを打ってファイルがアップロードされていることを確認します。

3.WEB02側のTeraTermでls -lを打ってWEB01にアップロードしたファイルがWEB02に同期されていることを確認します。
※同期に1~2分程度かかります。

4.WEB02の/var/www/html/eccube/html/user_dataにFFFTPでファイルをアップロードします。

5.WEB02側のTeraTermでls -lを打ってファイルがアップロードされていることを確認します。

6.WEB01側のTeraTermでls -lを打ってWEB02にアップロードしたファイルがWEB02に同期されていることを確認します。
※同期に1~2分程度かかります。

7.WEB01側のTeratermで/var/www/html/eccube/html/user_dataにアップロードしたファイルを削除します。

$ rm -f ファイル名

8.WEB02側のTeratermでWEB01側で消したファイルが消されないことを確認します。

おつかれさまでした。
RDSの作成に移ります。
こちらを参照してください


  1. 節子!それは懇親会や!! 

  2. 以下をURL参考にして下さい 

  3. AWSでFTPサーバー立てる時に気をつけるべき2つのこと+α http://dev.classmethod.jp/cloud/aws/to-be-aware-of-when-settingup-ftpserver-with-aws/ 

  4. vsftpのセットアップ手順 http://promamo.com/?p=3067 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away