📖

AWSでリバースプロキシとphpMyAdmin環境を構築する(+WordPressを表示させようとして失敗した話)

14 min read

はじめに

レンタルサーバーを使用していた時の構成を、次の要件でAWSで再現してみました。

  • nginxをリバースプロキシにして、Apacheからリソースを配信させる
  • phpMyAdminを使って、DBテーブルをブラウザ経由で確認可能にする

また、WordPressをインストールも実験してみました。
WordPressのインストール自体は失敗してしまったのですが、その時の内容を、備忘録がてら今回記事にしました。

内容

今回の構成図はこちらです。

パブリックサブネット内のEC2にnginx、プライベートサブネットのEC2にApache、phpMyAdmin、WordPressをインストールさせる構成をとりました。

行ったことは次の通りです。

  1. nginx環境を構築、インストールしてブラウザ表示させる
  2. Apache環境を構築・インストールして、nginxと連携してWebページを配信させる
  3. phpMyAdminをインストールして、Mysqlと連携・ブラウザ表示させる
  4. (失敗談)WordPressのインストール

nginx環境を構築、インストールしてブラウザ表示させる

ここでは、次の内容を行いました。

  • VPCの作成
  • パブリックサブネットの作成
    • ルートテーブルにルートを追加(インターネットゲートウェイ作成後)
  • EC2の作成
    • セキュリティグループの作成
    • キーペアの作成
  • インターネットゲートウェイの作成
  • nginxインストール・設定

※これ以降、特記しない限りデフォルトの設定のままにしています。

VPCの作成

項目 設定値
名前タグ my-vpc-01
IPv4CIDRブロック 10.0.0.0/21

パブリックサブネットの作成

項目 設定値
VPC ID 先ほど作成したVPCのID(画像ではmy-vpc-01)

項目 設定値
サブネット名 Public Subnet1
アベイラビリティーゾーン ap-northeast-1a
IPv4CIDRブロック 10.0.0.0/24
タグ キー:Name、値:Public Subnet1

EC2の作成

項目 設定値
AMI Amazon Linux2 AMI(HVM),SSD Volume Type

項目 設定値
インスタンスタイプ t2.micro

項目 設定値
ネットワーク 作成したVPC(my-vpc-01)
サブネット Public Subnet1
自動割り当てパブリックIP 有効

項目 設定値
タグ キー:Name、値:ProxyServer1

セキュリティグループの作成

項目 設定値
セキュリティグループ名 Proxy-SG-1
説明 Proxy-SG-1

また、ルールにHTTPを追加します。

項目 設定値
タイプ HTTP
プロトコル TCP
ポート範囲 80
ソース カスタム 0.0.0.0,::0

キーペアの作成

項目 設定値
キーペア名 my-keypair

インターネットゲートウェイの作成

項目 設定値
名前タグ my-igw-01
タグ キー:Name、 値:my-igw-01

VPCにアタッチします。

項目 設定値
使用可能なVPC 作成したVPC(my-vpc-01)

ルートテーブルにルートを追加

作成したパブリックサブネット1のルートテーブルを編集します。
現状では、VPCに向かって通信される設定になっているので、インターネットゲートウェイ向けの設定も追加します。

項目 設定値
送信先 0.0.0.0/0
ターゲット 作成したインターネットゲートウェイ(my-igw-01)

SSH接続でEC2に接続。

ssh -i my-keypair.pem ec2-user@EC2(ProxyServer1)のパブリックIPアドレス

nginxインストール・設定

パブリックサブネットのEC2(ProxyServer1)に接続し、権限を切り替えてnginxをインストール。

sudo su - # 権限を切り替え

yum -y update

yum install nginx # エラーが発生が発生するので表示された下記コマンドを実行
sudo amazon-linux-extras install nginx1

systemctl enable nginx.service
systemctl start nginx.service
systemctl status nginx.service # Active: active (running)になっていることを確認

ブラウザでhttp://パブリックサブネットのEC2のパブリックIPアドレスにアクセスすると、nginxの画面が表示される。

Apache環境を構築・インストールして、nginxと連携してWebページを配信させる

ここで行ったのは次の通りです。

  • プライベートサブネット1を作成
    • ルートテーブルを作成してNATゲートウェイへのルートを追加(NATゲートウェイ作成後)
  • EC2の作成
    • セキュリティグループの作成
  • SCPでキーペアをパブリックサブネットに送って、プライベートサブネット1のEC2にSSH接続
  • NATゲートウェイを作成
  • Apacheインストール・ポート番号の変更
  • nginxの設定を変更して、Apacheと連携

プライベートサブネット1の作成

設定項目はパブリックサブネットと同様です。

項目 設定値
VPC ID 作成したVPCのID(my-vpc-01)
サブネット名 Private Subnet1
アベイラビリティーゾーン ap-northeast-1a
IPv4CIDRブロック 10.0.1.0/24
タグ キー:Name、値:Private Subnet1

EC2の作成

設定項目はパブリックサブネットのEC2と同様です。

項目 設定値
AMI Amazon Linux2 AMI(HVM),SSD Volume Type
インスタンスタイプ t2.micro
ネットワーク 作成したVPC(my-vpc-01)
サブネット Private Subnet1
自動割り当てパブリックIP 有効
タグ キー:Name、値:WebServer1
キーペア 既存のキーペアを使用(パブリックサブネットのEC2で作成したキーペア)

セキュリティグループの作成

項目 設定値
セキュリティグループ名 Web-SG-1
説明 Web-SG-1

新規ルールとしてHTTPを追加しますが、後述するnginxの設定で接続ポートを変更するので、8080ポートの設定を追加し、パブリックサブネット経由で接続させるようにします。

項目 設定値
タイプ カスタムTCP
プロトコル TCP
ポート範囲 8080
ソース カスタム 10.0.0.0/24

パブリックサブネット経由でプライベートサブネット1のEC2にSSH接続

SCPでキーペアをパブリックサブネットのtmpディレクトリに送ります。

scp -i my-keypair.pem my-keypair.pem ec2-user@EC2(ProxyServer1)のパブリックIPアドレス:/tmp

パブリックサブネットからプライベートサブネット1のEC2にログイン。

ssh -i my-keypair.pem ec2-user@EC2(WebServer1)のプライベートIPアドレス

NATゲートウェイの作成

項目 設定値
名前 my-nat-gw-01
サブネット パブリックサブネット(Public Subnet1)
Elastic IP 割り当てID 「Elastic IPの割り当て」ボタンを押下して割り当て

プライベートサブネット用のルートテーブルを作成

項目 設定値
名前タグ routetable-private
VPC 作成したVPC(my-vpc-01)

作成したルートテーブルにNATゲートウェイ(my-nat-gw-01)へのルートを追加。

項目 設定値
送信先 0.0.0.0/0
ターゲット 作成したNATゲートウェイ(my-nat-gw-01)

プライベートサブネット1とルートテーブルを関連付ける。

項目 設定値
ルートテーブルID routetable-private

Apacheインストール・ポート番号の変更

プライベートサブネット1のEC2にApacheをインストールする。

sudo su -

yum -y update

amazon-linux-extras install php7.2 -y
yum -y install mysql httpd php-mbstring php-xml gd php-gd

systemctl enable httpd.service
systemctl start httpd.service
systemctl status httpd.service

httpd.confを編集する。

vi /etc/httpd/conf/httpd.conf

ポート番号を変更。

# 変更前
Listen 80

# 変更後
Listen 8080

Apacheを再起動して、ポートが8080で起動していることを確認する。

systemctl restart httpd.service
netstat -atn | grep 8080

Apacheから配信されていることを確認する為に、htmlファイルを用意しておく。

Cd /var/www/html
touch index.html
vi index.html

下記をindex.htmlに記述し、:wpで保存。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>private subnet1</title>
</head>
<body>
  <p>apacheから配信しています。</p>
</body>
</html>

nginxの設定を変更して、Apacheと連携

パブリックサブネットのEC2に戻り、nginxの設定を変更する。

vi /etc/nginx/nginx.conf

Webリクエストをプライベートサブネット1のEC2に8080番ポートでリダイレクトさせるので、
server配下にlocationを追加して、:wqで保存。

server {
    # 略
    
    # ここから
    location / {
        proxy_pass http://プライベートサブネット1のEC2のプライベートIPアドレス:8080/;
    }
    # ここまでを追記
}

nginxを再起動。

systemctl restart nginx

ブラウザでhttp://パブリックサブネットのEC2のパブリックIPアドレスにアクセスする。
nginxの画面から、Apacheから配信されているindex.htmlの画面に切り替わる。

phpMyAdminをインストールして、Mysqlと連携・ブラウザ表示させる

ここで行ったのは次の通りです。

  • プライベートサブネット2の作成
  • RDSのサブネットグループを作成
  • RDSからMysqlを作成
  • VPCからRDSのセキュリティグループを編集
    →インバウンドを編集し、プライベートサブネット1のEC2からのみアクセス可能にする
  • プライベートサブネット1のEC2にphpmyadminをインストール・設定

プライベートサブネット2の作成

設定項目はプライベートサブネット1と同様です。

項目 設定値
VPC ID 作成したVPCのID(my-vpc-01)
サブネット名 Private Subnet2
アベイラビリティーゾーン ap-northeast-1c
IPv4CIDRブロック 10.0.2.0/24
タグ キー:Name、値:Private Subnet2

RDSを作成するときにサブネットグループを作成する必要があるので、アベイラビリティーゾーンは1cを指定しています。

RDSのサブネットグループを作成

項目 設定値
名前 my-subnet-group
説明 my-subnet-group
VPC 作成したVPCのID(my-vpc-01)

項目 設定値
アベイラビリティーゾーン ap-northeast-1a、ap-northeast-1c
サブネット プライベートサブネット1、プライベートサブネット2

RDSからMysqlを作成

項目 設定値
データベースの作成方法を選択 標準作成

項目 設定値
エンジンのタイプ MySQL

項目 設定値
テンプレート 無料利用枠

項目 設定値
マスターユーザー名 任意のユーザー名

項目 設定値
マスターパスワード 任意のパスワード

項目 設定値
DBインスタンスクラス バースト可能クラス(tクラスを含む)
db.t2.micro

項目 設定値
Virtual Private Cloud(VPC) 作成したVPC(my-vpc-01)
サブネットグループ my-subnet-group
パブリックアクセス可能 なし

項目 設定値
VPCセキュリティグループ 新規作成
新しいVPCセキュリティグループ RDS-SG-1
アベイラビリティーゾーン ap-northeast-1a

項目 設定値
データベース認証オプション パスワード認証

項目 設定値
最初のデータベース名 wordpress

RDSをプライベートサブネット1のEC2からのみアクセスできるようにする

RDSのセキュリティグループ(RDS-SG-1)のインバウンドを編集し、プライベートサブネット1のEC2(WebServer1)からのみアクセスできるように変更します。

項目 設定値
ソース Web-SG-1

変更後は下記のとおり。

phpMyAdminをインストール・設定

プライベートネットワーク1のEC2にphpMyAdminをインストールする。

amazon-linux-extras install php7.2 -y
yum -y install mysql httpd php-mbstring php-xml gd php-gd

cd /var/www/html
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
mkdir phpMyAdmin
tar -xvzf phpMyAdmin-latest-all-languages.tar.gz -C phpMyAdmin --strip-components 1

rm phpMyAdmin-latest-all-languages.tar.gz # ダウンロードしたファイルを削除

phpMyAdminの設定ファイルを更新する。

cd /var/www/html/phpMyAdmin/
cp config.sample.inc.php config.inc.php

chmod 644 config.inc.php
vi config.inc.php

config.inc.phpで下記の箇所を変更する。

# 変更前
$cfg['Servers'][$i]['host'] = 'localhost';

# 変更後
$cfg['Servers'][$i]['host'] = 'RDSのエンドポイント';

RDSのエンドポイントは、作成されたデータベースの「接続とセキュリティ」タブから確認できる。

下記も変更して、:wqで保存。

# 変更前
$cfg['blowfish_secret'] = '';

# 変更後
$cfg['blowfish_secret'] = 'kcBuC08452nW0qTCVFXEQV0HO7KhrCYAAACCCCV';

ブラウザでhttp://パブリックサブネットのEC2のパブリックIPアドレス/phpMyAdminにアクセスするとphpMyAdminの画面が表示される。
RDS作成画面で設定したマスターユーザー名とマスターパスワードを入力してログインする。

ログイン成功。

(失敗談)WordPressのインストール

行ったことはシンプルで、プライベートサブネット1にあるEC2にWordPressをダウンロードして展開しただけです。

cd /var/www/html
wget http://ja.wordpress.org/latest-ja.tar.gz ~/
tar zxvf latest-ja.tar.gz
chown apache:apache -R /var/www/html/wordpress

ブラウザでhttp://パブリックサブネットのEC2のパブリックIPアドレス/wordpressにアクセスすると、WordPressのインストール画面でレイアウト崩れが発生してしまいました。

cssやjsのURLがプライベートサブネット1のEC2のIPアドレスになっていました。
時間の都合上、実際に修正は試してはいないのですが、WordPressのコードが原因のようで、追加の設定が必要のようでした。
次の対処方法が参考になるのではと思っています。

https://server-recipe.com/1582/
https://www.netya.com/blog/20191206_wordpress-cdn.html

強引にインストールを進めたところ、mysqlにテーブルが作成されたので、データベースの接続は問題無いようです。
WordPress検証が足りていなかったのは、次に向けての反省点ですね。

最後に

今回はAWS上での作業なので、ネットワーク設定を意識しつつ構築を行いました。
ネットワークの知識はある程度理解していたはずなのですが、いざやってみると、AWSの各サービスとの紐付けが大変だったなと思います。
また、初めて記事作成を行ったので見づらい箇所などあると思うので、もっと改善していきたいですね。

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。

https://aws-cloud-tech.com

Discussion

ログインするとコメントできます