AWSでリバースプロキシとphpMyAdmin環境を構築する(+WordPressを表示させようとして失敗した話)
はじめに
レンタルサーバーを使用していた時の構成を、次の要件でAWSで再現してみました。
- nginxをリバースプロキシにして、Apacheからリソースを配信させる
- phpMyAdminを使って、DBテーブルをブラウザ経由で確認可能にする
また、WordPressをインストールも実験してみました。
WordPressのインストール自体は失敗してしまったのですが、その時の内容を、備忘録がてら今回記事にしました。
内容
今回の構成図はこちらです。
パブリックサブネット内のEC2にnginx、プライベートサブネットのEC2にApache、phpMyAdmin、WordPressをインストールさせる構成をとりました。
行ったことは次の通りです。
- nginx環境を構築、インストールしてブラウザ表示させる
- Apache環境を構築・インストールして、nginxと連携してWebページを配信させる
- phpMyAdminをインストールして、Mysqlと連携・ブラウザ表示させる
- (失敗談)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のコードが原因のようで、追加の設定が必要のようでした。
次の対処方法が参考になるのではと思っています。
強引にインストールを進めたところ、mysqlにテーブルが作成されたので、データベースの接続は問題無いようです。
WordPress検証が足りていなかったのは、次に向けての反省点ですね。
最後に
今回はAWS上での作業なので、ネットワーク設定を意識しつつ構築を行いました。
ネットワークの知識はある程度理解していたはずなのですが、いざやってみると、AWSの各サービスとの紐付けが大変だったなと思います。
また、初めて記事作成を行ったので見づらい箇所などあると思うので、もっと改善していきたいですね。
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
Discussion