読者です 読者をやめる 読者になる 読者になる

AWS上のWebインフラにWordPress+MySQL用のLAMP環境を構築してみる

AWS LAMP web-infrastructure

【スポンサーリンク】

WordPress用に少しセキュアなWebインフラをAWS上に作ってみる | ハイレゾる」で用意した環境に、 WordPressを載せるためにLAMP環境(Apache Webサーバ、PHPMySQL)を構築する。Webサーバ1台で作っていたので、同サーバ上にMySQLも構築してしまいます。DBだけでも別途MultiのRDS(MySQL)で作ればSPOFも減るので少し可用性は上がるけど、そもそも個人使用なのでそこまで考慮してません。
今回作業前に、Webサーバーのインスタンスだけ少し変更して、small -> microにしてます。

参考: チュートリアル: Amazon Linux への LAMP ウェブサーバーのインストール - Amazon Elastic Compute Cloud

AWS EC2のサーバ基本設定をする。

  1. タイムゾーンUTCからJSTに変更する。
    $ sudo cp -i /usr/share/zoneinfo/Japan /etc/localtime
    2016年  1月 24日 日曜日 23:06:23 JST
  2. 日本語設定に変更する。
    $ sudo vi /etc/sysconfig/i18n
    LANG=ja_JP.UTF-8
  3. Amazon Linuxのデフォルトのセキュリティ設定を確認する。
    Amazon Linuxでは、ファイアーウォールなどセキュリティ設定は、 基本にSecurityGroups側で行うもののため、SELinuxiptablesはデフォルトで無効化されている。
    • SELinuxが無効化されていることを確認する。
      $ getenforce
      Disabled
    • iptablesも無効化されていることを確認する。 (chkconfig上は自動起動するようになっている)
      $ sudo /etc/init.d/iptables status
      iptables: ファイアウォールが稼働していません。
      
      $ chkconfig iptables --list
      iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
  4. スワップ(swap)ファイルを作成する。
    Webサーバ用のEC2インスタンスタイプをsmallからmicroにしたことでswap領域がなくなっているので、そのままでいると out of memoryとか発生してしまうから自分でswap領域を準備する。 ※small, mediumだと予めmkswapされた900MBの領域が付いてくる。
    medium以上のときにエフェメラルディスクに作る場合の参考に
    インスタンスストアスワップボリューム - Amazon Elastic Compute Cloud
    ddコマンドでスワップファイルを作成する。
    $ free
                 total       used       free     shared    buffers     cached
    Mem:       1019452     979684      39768        140     141440     619392
    -/+ buffers/cache:     218852     800600
    Swap:            0          0          0
    $ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
  5. 作成したスワップファイルのパーミッションを644から600に変更する。 (swapon実行時に、警告メッセージ「swapon: /swapfile: 安全でない権限 0644 を持ちます。 0600 がお勧めです」が表示されるため)
    $ sudo chmod 600 /swapfile
  6. スワップ(swap)領域を作成する。
    $ sudo mkswap /swapfile
  7. スワップ(swap)領域を有効化する。
    $ sudo swapon /swapfile
    $ sudo swapon -s
    Filename    Type    Size    Used    Priority
    /swapfile   file    2097148 0   -1
    $ free
                 total       used       free     shared    buffers     cached
    Mem:       1019452     983180      36272        140     141440     621184
    -/+ buffers/cache:     220556     798896
    Swap:      2097148          0    2097148
  8. スワップ(swap)領域の自動マウント設定をする。
    $ sudo cp -p /etc/fstab /etc/fstab.org
    $ sudo vi /etc/fstab
    #
    LABEL=/     /           ext4    defaults,noatime  1   1
    tmpfs       /dev/shm    tmpfs   defaults        0   0
    devpts      /dev/pts    devpts  gid=5,mode=620  0   0
    sysfs       /sys        sysfs   defaults        0   0
    proc        /proc       proc    defaults        0   0
    /swapfile   swap        swap    defaults        0   0
  9. スワップ(swap)領域が自動マウントされるかを確認する。 マネジメントコンソールから再起動を実行することで、 再起動完了後にswap領域が自動マウントされているか確認する。
    $ free
                 total       used       free     shared    buffers     cached
    Mem:       1019452     124152     895300         60       8128      69068
    -/+ buffers/cache:      46956     972496
    Swap:      2097148          0    2097148
  10. すべてのソフトウェアパッケージを最新の状態にする。
    $ sudo yum update -y

Apache Webサーバを構築する。

  1. ミドルウェア関連の準備として、まずはApache Webサーバーをインストールする。
    $ sudo yum install -y httpd24
  2. Apacheを起動する。
    $ sudo service httpd start
    Starting httpd:                                      [  OK  ]
  3. サーバー起動時にApacheも起動するよう自動起動設定する。
    $ sudo chkconfig httpd on
    $ chkconfig --list httpd
    httpd   0:off   1:off   2:on    3:on    4:on    5:on    6:off
  4. Apachの設定をする。
    $ sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
    $ sudo vi /etc/httpd/conf/httpd.conf
    
    #ServerName www.example.com:80
    ServerName tehepero-ron.com:80
    
    #DocumentRoot "/var/www/html"
    DocumentRoot "/var/www/wordpress"
  5. 確認用兼ELBヘルスチェック用のファイルを準備する。
    $ sudo mkdir /var/www/wordpress
    $ sudo vi /var/www/wordpress/.healthchk
    ##Health check page##
  6. ec2-userが wordpress ディレクトリ以下の操作ができるように権限を設定する。
    • www グループをインスタンスに追加する。
      $ sudo groupadd www
    • ec2-userを www グループに追加する。
      $ sudo usermod -a -G www ec2-user
    • 追加した状態を確認するには一度ログアウトしてから、再ログインしメンバーシップを確認する。
      $ exit
      $ ssh wp1weba
      $ groups
      ec2-user wheel www
    • /var/www 以下のグループ所有権を www グループに変更する。
      $ sudo chown -R root:www /var/www
    • /var/www 以下のディレクトリとファイルの権限を変更する。将来のサブディレクトリにもグループ ID を設定するようにしておく。
      $ sudo chmod 2775 /var/www
      $ find /var/www -type d -exec sudo chmod 2775 {} +
      $ find /var/www -type f -exec sudo chmod 0664 {} +
    • リスタートして、設定を反映させる。
      $ sudo service httpd restart
      Stopping httpd:                                      [  OK  ]
      Starting httpd:                                      [  OK  ]
  7. 外部からのアクセスはELB用のSubnetを経由する構成にしているので、AWS Management Console上のEC2メニューのロードバランサーからELBを作成する。
    • ロードバランサーの定義」で、以下を入力する。
      ロードバランサー名:「elb-wp1」
      ロードバランサーを作成する場所:「vpc-wp1」
      リスナーの設定:「http/80/http/80」 (ロードバランサーとインスタンスのプロトコルとポート)
    • 「サブネットの選択」で、以下サブネットを選択する。
      「sn-wp1-elb-a」
      「sn-wp1-elb-b」
    • 「セキュリティグループの割り当て」で、既存のセキュリティグループから以下を選択する。
      「sg_elb_web」
    • 「ヘルスチェックの設定」で、以下を入力する。
      pingプロトコル:「HTTP」
      Pingポート:「80」
      pingパス: 「/.helthchk」
      
      応答タイムアウト:「5」
      ヘルスチェック間隔:「10」
      非正常のしきい値:「2」
      正常のしきい値:「3」
    • 「EC2インスタンスの追加」で、以下インスタンスをチェックする。
      「wp1-web-a」
    • 「タグの追加」では特に入力はせず、「確認と作成」に移動し問題なければ「作成」する。
  8. インスタンスを選択し「wp1-web-a」のステータスが InServiceになっていることを確認する。InServiceになるのに少し時間がかかるの少し待ちます。 f:id:nyasu0123:20160515103415p:plain
  9. ロードバランサー」メニューの画面下のタブから「説明」を選択し、DNS名(elb-wp1-xxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com)を確認する。そのDNS名を使いWebサーバまでの接続確認をする。
    http://elb-wp1-xxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/.healthchk
    
    「Health check page」が表示されることを確認する。

PHPのインストールと設定をする。

  1. phpをインストールする。
    $ sudo yum install -y php56 php56-mysqlnd
  2. PHPタイムゾーンを日本に変更する。
    $ sudo cp /etc/php.ini /etc/php.ini.org
    $ sudo vi /etc/php.ini
    [Date]  
    ; Defines the default timezone used by the date functions   
    ; http://php.net/date.timezone
    ;date.timezone =    
    date.timezone = 'Asia/Tokyo'    
  3. LAMP Webサーバが動作するか、ApacheドキュメントルートにシンプルなPHPファイルを作成する。
    $ sudo echo "<?php phpinfo(); ?>" > /var/www/wordpress/phpinfo.php    
  4. .healthchkで確認した時と同様にWebサーバにアクセスして表示を確認する。
    http://elb-wp1-xxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/phpinfo.php
    f:id:nyasu0123:20160515103530p:plain
  5. セキュリティ上、知られない方がいいので、確認後すぐにPHPファイルを削除する。
    $ /var/www/wordpress/phpinfo.php 

MySQLのインストールと設定をする。

  1. mysqlをインストールする。
    $ sudo yum install -y mysql55-server
  2. mysql文字コードをutf8に設定する。
    $ sudo cp /etc/my.cnf /etc/my.cnf.org
    $ sudo vi /etc/my.cnf
    [mysqld]
    character-set-server = utf8
    skip-character-set-client-handshake
  3. MySQLサーバーを起動する。
    $ sudo service mysqld start
  4. MySQL初期設定(mysql_secure_installation)を実行する。
    • root アカウントのパスワードを入力する。
      $ sudo mysql_secure_installation
      Enter current password for root (enter for none):「」
      
      Set root password? [Y/n] y
      New password:「準備したパスワード」
      Re-enter new password:「準備したパスワード」 
      Password updated successfully!
      Reloading privilege tables..
       ... Success!
    • 匿名ユーザーアカウントを削除する。
      Remove anonymous users? [Y/n] y
       ... Success!
    • rootログインを無効にする。
      Disallow root login remotely? [Y/n] y
       ... Success!
    • テストデータベースを削除する。
      Remove test database and access to it? [Y/n] y
       - Dropping test database...
       ... Success!
       - Removing privileges on test database...
       ... Success!
    • 権限テーブルを再ロードし変更を保存する。
      Reload privilege tables now? [Y/n] y
       ... Success!
  5. サーバー起動時にMySQL自動起動するよう設定する。
    $ sudo chkconfig mysqld on
    $ chkconfig --list mysqld
    mysqld  0:off   1:off   2:on    3:on    4:on    5:on    6:off
  6. 設定がutf8になっているか確認する。
    $ mysql -u root -p
    mysql> show variables like "chara%";
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+

以上でEC2上にLAMPなWebサーバー環境が構築できました。