AWSのEC2+RDSを使ってWordPressを構築する手順

なんだかAWSがいいとのことで使ってみよう!そうしよう!
ってことで知識ゼロの状態からスタートし、Wordpressの構築までやってみようと思う。
それに仕事の関係でAWSを使ってWordpressを構築しようと思っていたのでとりあえずググッてみたら情報がたくさん出てきた。
なにやら網元AMIなるものが使えるらしいが今回は手動で構築していこうと思う。
AWSのEC2とRSDの構築はドットインストール Amazon Web Servicesの基礎を見て作成した。
このサイトはほんと勉強になるのでAWS以外でも参考にしてね!
で、とりあえずEC2とRDSのインスタンスを立ち上げまでは完了。

EC2の設定をする
まず秘密鍵を用意する。(key pairとよばれるもの)
秘密鍵を持ってないと、EC2にログイン出来ないみたい。
お前鍵持ってねーよと言われるから事前に準備しておく。
まあ、普通はインスタンス立ち上げた時に作るから持ってるはずなんだけど、別の人がインスタンス立ち上げたとかの理由で持ってないログイン出来ないからきをつけて。

で、その秘密鍵のパーミッションを変更する

chmod 600 xxxxx.pem

xは自分で作ったkey pairの名前

SSHでログインする

 ssh -i xxxxx.pem ec2-user@ec2-XXXXXXXXXXXXXXXXXX

xのところは自分の環境に合わせて適宜変更で

ログインするとアップデートしろといわれるから

 sudo yum update

でアップデートする

Apacheをインストール

 sudo yum install httpd

Apacheを起動する

 sudo service httpd start

で、ついにWordpressをインストール!!

 wget http://ja.wordpress.org/latest-ja.tar.gz

でワードプレスの最新版がダウンロードできるからダウンロード

その後はファイル展開

 tar -xvzf latest-ja.tar.gz -C /var/www/html/

で、展開できるかと思ったら何故かできないorz
何でかなと思ったらRDSの管理画面に赤文字で「No Inbound Permissions」とでてた。
20140428-15
これは理由があるらしい。
EC2のセキュリティ設定をしたときに、許可したのはSSHとHTTPのみ。
同じサーバー内でデータベースを動かすときには問題がないが、
データベースが別サーバーの時にはMySQLが使うポートを許可しないと通信できない。
だから、セキュリティの設定でMySQLが通信できるように追加してあげないといけないみたい。
「Security Groups」の右にある「launch-wizard-1」という項目がリンクになってるから、ここをクリック。
画面が変わったら画面中央部に4つのタブがあるので、この中の「Inbound」のタブをクリック。
20140428-17
現在設定されているセキュリティ修正するから、「Edit」ボタンを押す。
そこで新しいルールを追加するために「Add Rule」ボタンをクリック。
HTTPと書かれた下に1行追加されるからそれを、Typeに「MySQL」、Sourceに「Anywhere」を選び、「Save」ボタンを押すと新たにMySQLの通信を許可したセキュリティ設定を更新する。
20140428-21
これでRDS管理画面に戻ると表示されていた「No Inbound Permissions」の表示が消えているはず。
これでやっと先ほどのコマンドで展開できた。
その後

sudo chown -R apache /var/www/html/wordpress/

これでオーナーをapacheに変更。
こうすることでテーマやプラグインがインストールできるようになる。

これでブラウザでhttp://ec2-XXXXXXXXXXXXXXXXXX.ap-northeast-1.compute.amazonaws.com/wordpressにアクセスすると

「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」

・・・

え??
なんじゃこりゃorz
調べてみるとmysqlのPHPモジュールが動いていない模様…
なので

 yum install php php-devel php-mysql php-mbstring php-gd

でインストール。
ついでに必要な物も一緒にインストールしておく。

で、必要な設定もする。

 sudo vi /etc/php.ini

を入力後

 error_log = /var/log/php_errors.log
 mbstring.language = Japanese
 mbstring.internal_encoding = UTF-8
 mbstring.http_input = auto
 mbstring.detect_order = auto
 expose_php = Off
 date.timezone = Asia/Tokyo

にする。
文字列の最初に「;」がついている物はそれを消す。
これで設定完了。

インストール後にApacheを再起動。

 sudo service httpd restart

その後無事に
wordpressimage
ここまできたらデータベースの情報を入力するんだけどホスト名がlocalhostではないので作成したRDSインスタンスの情報を確認しておく。
データベース名:DB Name
ユーザー名:Master Username
パスワード:入力したパスワード
データベースのホスト名:Endpoint
を入力する。
wordpressimage2
この後は通常通り入力してインストール完了!!

思ったより簡単にAWSが導入できた。
今回はFTPソフトを使わずにコマンドのみでインストールしたが、FTPソフトを使ってもインストールできるからコマンドに慣れない人はFTPソフト使った方がいいかも。
その際はAWS側でもFTPが使えるようにしなければだめだけど。

AWSのEC2でFTPを使う

AWSを使っているとターミナルでの作業がメインになるが、自分一人なら特に問題を感じないが複数人でのプロジェクトになるとFTPでの作業ができた方が何かと良かったのでFTPを導入してみる。
前提としてEC2のインスタンスは立ち上げてある物とする。

ターミナルでの作業

EC2にSSHで接続

ssh -i xxxxx.pem ec2-user@ec2-XXXXXXXXXXXXXXXXXX

管理者権限(rootユーザー)になる

$sudo su -

vsftpdのインストール

#yum -y install vsftpd

インストール出来たら使われていないポート番号を確認する。

#cat /proc/sys/net/ipv4/ip_local_port_range
32678   61000

vsftpd.conf(設定ファイルを編集する)

#vi /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_address=固定IP(ElasticIPs)
pasv_min_port=60000
pasv_max_port=60010
force_dot_files=YES
use_localtime=YES
に追加、修正する。

FTP用にユーザー作成

ここで作成したユーザーとパスでFTPに接続する

#adduser 任意の名前
#passwd 任意の名前入力後パスワード入力

サービス起動、自動実行設定

#service vsftpd start
#chkconfig vsftpd on

AWSコンソールでの作業

Security Groupsでのポート設定

vsftpdをインストールしたインスタンスのポートを設定する。
AWSコンソール→EC2→Security Groups→Inbound→Editで設定できる。
AWS

以上で設定完了。
後はFTPクライアントで接続できるか確認する。
当方はFileZillaで接続できた。
いや~やはりFTPは慣れてるか使いやすくて楽ですな~。

※追記
なにやらFTPからワードプレスにアップロードしようとしたら553 Could not create file.というエラーが起きた。
ダウンロードは出来るのにアップロードができない。
色々調べて見るとファイルのパーミッションの書き込み権限がなくエラーをしているみたい。
じゃあパーミッション777とかに変えれば楽勝ジャン!と思ったら大間違い…
変更しても全くアップできない。

なぜ???

ファイルからディレクトリから変更して見るもだめ。
調べても調べてもパーミッション変更やらグループ変更だったりばかりで、同じような例ばかり。
変更しても毎度毎度553…orz
どうしたものかと思い、ふと前に作ってもらったAWSがあることに気付きSSHでつないで中身を比較した。
そしたら案の定、違いを発見。
どうやら、AWS構築したときにワードプレスのディレクトリの所有者をapacheに変更してたのが原因みたい。
とりあえずワードプレスのテーマのディレクトリごと所有者をFTPユーザーに変更したらあっさりアップできた。
パーミッションが原因ではあるが、まさかそこが原因とは。
詳しくはなぜそうなのかはわからないが、とりあえず一安心。
ほんと、サーバー関連は難しいわ…

AWS&WordPressに独自ドメインを設定する方法

まず使うのは
「Amazon Route 53」
「Elastic IPs」
「独自ドメイン」
で、ワードプレスのサイトを独自ドメインで運用してみる。

この「Amazon Route 53」ってのは有料みたいだから気をつけて!

前提として独自ドメインは取得済みとする。

まあ独自ドメインなんて、検索すれば取得の仕方はたくさん出てくるので割愛する。
初心者の自分ですら調べればすぐに出てきて取得できたし、なんとかなるさ♪(今回はムームードメインで取得したからそのやりかた)

「Elastic IPs」 アドレスの紐付け

まずは、Amazon EC2のダッシュボードを開いて、左メニューの中の「Elastic IPs」を選択する。
Elastic IPs のページで「Allocate New Address」をクリック。

wordpress-aws-domain3
で、IPアドレスを取得する。
確認ダイアログが出るから、「Yes,Allocate」をクリックする。
ちなみに「Elastic IPs」は、EC2のインスタンスと紐付けしていないと課金されるみたいだから紐付けしていない場合は開放するように。

で、さっき取得したIP アドレスを選択し、画面上にある「Associate Address」をクリック。
eip3

すると「Associate Address」の設定が出てくるので「Instance」でこのIP アドレスに関連付けるインスタンスを選択し、「Associate」をクリックすれば紐付け完了。
eip4

「Route 53」でDNSを設定する

AWSのマネジメントコンソールでRoute 53を選択する。
Route 53にアクセスしたらホストゾーンを作る。

左サイドバーの「Hosted Zones」→画面上の「Create Hosted Zone」をクリック。

すると
wordpress-aws-domain5
上記のように右側に入力欄が現れる。
で、「Domain Name」に設定したい独自ドメインを入力(すでに取得済みの独自ドメインね)。
入力したら画面右下の「Create Hosted Zone」をクリック。

すると、ドメインが追加される。
wordpress-aws-domain6
このような画面になってればOK!
ドメイン名を選択すると詳細情報が表示される。「Delegation Set」はネームサーバなので、ムームードメイン側の設定で利用するので内容をメモしておく。

で、追加したドメインを選択して左上の「Go to Record Sets」をクリックして先に進む。
すると既に「NSレコード」と「SOAレコード」が入ってるからそのまま「Create Recode Set」をクリック。
その後は固定IPアドレスで紐付けたIPアドレスを「Value」に入力して「Create」(さっきElastic IPsで紐付けたやつね)。
r53_i06

これでAレコードの設定が完了。

ここまできたら次は自分で取得した独自ドメインのサイトに行きネームサーバーの変更をする。

まずはムームードメインにいきコントロールパネルから「ドメイン操作 > ネームサーバ設定変更」 で対象のドメインを選択。
”GMOペパボ以外 のネームサーバを使用する”を選択して、Route 53 でDNSの設定で設定した「Delegation Set」を入力する。
muumuu1

これで、独自ドメインでワードプレスにアクセスできるようになってるはず。
いろいろ見てると反映されるまでに時間がかかるらしいが、自分の場合はすぐにアクセスできるようになった。

だが、ここでまたもや問題が…

サイト自体は見れるが管理画面にアクセスできなくなってしまった。
恐らく前回のWordPressで稼働中のサーバのドメインや固定IPを変更したら直すとこに書いたようにデータベース上のアドレスが違うからだろうと思い、変更したところすんなり管理画面にアクセスできた。
独自ドメインに切り替えてアクセスできなくなった場合は参考にしてほしい。

WordPressのインポートができない時(AWSで)

これはハマった。
今まで使ってたサーバーでは何の問題もなくWordpressのインポートが出来てたのにAWSで構築したら何故かできないorz
今までテストサーバーで作ったコンテンツをAWSで構築したWordpressにインポートしようといつものごとくインポートプラグインでインポートするべく、「ファイルをアップロードしてインポート」ボタンを押すまでは良かった。

だけど…

「Import WordPress」のみが表示されたまま…

ん?
読み込みが遅いのか?

いつもならこの後インポート出来るはずなんだが…

待てど暮らせど何も起きない。
まさか実は出来てる?
と、思って見てみたが出来てない…

とりあえずパーミッション変更してみたり、ワードプレスを再インストールしても全くダメ。

ん~…

色々聞いたり調べているとインポート出来ないときはいくつか試すことがあるらしい。

1.php-xmlモジュールをインストール

どうやらAMAZON LINUXにPHP関連をインストールしたときにこのモジュールがインストールされてないくさい。
AWSは自分で色々いじれる分、デフォルトでは入っていないモジュールが多いみたいだね

で、とりあえずサクッとインストール。

sudo yum install php-xml

あ、もちろんsshでEC2にログインしてからね。

インストールしたらApacheも再起動

sudo service httpd restart

その後もう一度Wordpressでインポート。

…で、できた!!!!!

やはりこれが原因だったか。
良かった~♪
とりあえずこれでインポートも出来るようになった。

いや~ほんとAWSって便利だけどこうゆうところ忘れるとドハマりするね。
勉強なるわ~

WordPressで稼働中のサーバのドメインや固定IPを変更したら直すとこ

と、言うより自分のミスでAWSで作ったEC2インスタンスを再起動させてしまい、固定IPが変わってしまい、Wordpressのレイアウトが崩れ、管理画面にログインできないという状況に…orz
無知って怖いwww
なので、今回はAWSでの対処法を探す。

今回の原因は
初めにWordPressをセットアップしたときに,WordPressで使用しているDBにドメイン・IPアドレスの情報が記録されてしまっていて,この情報と現在のドメイン・IPアドレスの情報が一致していないとでWordPressの動作がおかしくなるようだ。

なので、対処としてはWordPressで使用しているDBにログインして,ドメイン・IPアドレスの情報が格納されたレコードのフィールドを今のドメイン・IPアドレスに変更をする。

前提としてsshでEC2にログインしてることにする。
 
まずは,以下のコマンドでDBにログインする。

sudo mysql -h Endpoint -u ユーザー名 -p

パスワードを求められるので、パスワードを入力するとMySQLに入る。
そしてWordpressで使ってるデータベースを選択。

mysql> use wordpress

を入力すると

Database changed

と出てればWordpressのデータベースにログインできている。

その状態で

mysql> select * from wp_options where option_name = 'siteurl';
mysql> select * from wp_options where option_name = 'home';

で、データベースに入っているドメイン・IPアドレスと今のドメイン・IPアドレスを見比べて見ると違うことが確認できると思う。

ここを今現在のドメイン・IPアドレスに変更してやればいい。
そのコマンドは以下

mysql> update wp_options set option_value = '現在のドメイン・IPアドレス' where option_name = 'siteurl';
mysql> update wp_options set option_value = '現在のドメイン・IPアドレス' where option_name = 'home';

で、変更できる。

その後WordPressのページを表示すると,表示が元に戻っていることが確認できる。
ただし,画像などを記事に挿入している場合は画像のURLも変わるので表示されないからそこも直す必要がある。

あえて勉強の為にコマンドからの修正をしているが、PhpMyAdminを触れる人はそこから直しても同じなので、そちらから修正されたし。

CSV出力するのに学んだメモ

ワードプレスでCSV出力する必要があったのでそのときに学んだメモ。
参考にさせてもらったサイトはあずみ.netさんの「ワードプレスの簡易CSVエクスポートプラグインを作ってみた。」を参考にしました。

dirname( __FILE__ )

は自分自身へのパス

dirname( __FILE__ ) . '/csv/sample.csv';

とすれば(今回はワードプレスのプラグインフォルダ)

/public_html/自分のドメイン/wp/wp-content/plugins/csv/sample.csv

となる。
テスト環境などでXAMPPを使っていてそこで作ったファイルに記述したなら

C:\xampp\htdocs\フォルダ名/csv/sample.csv

となる。

fopen(‘ファイル名’ , ‘モード’)

はファイルポインタをオープンする…とのことだけどいまいちわからなかったけど
ようはそのままの意味で指定したファイルを開く※(無ければ新規作成)する。
※は指定したモードによる。
モードは8種類あるが、’r’と’w’と’a’が主に使うものっぽい。

・r – 読み込み専用。初期のファイルポインタ位置はファイルの先頭。
・w – 読み込み専用。初期のファイルポインタ位置はファイルの先頭。最初に1回だけファイルを空にする。
  ファイルがない場合は作成する。
・a – 読み込み専用。初期のファイルポインタ位置はファイルの末尾。ファイルがない場合は作成する。

試しに

fopen('file.csv', 'w')

としたらfile.csvを作ってくれていた。

fputcsv($handle , array $fields)

は、行($fields 配列として渡されたもの)をCSVとしてフォーマットして、それを$handleで指定したファイルに書き込みしてくれる。
これのパラメータ$handleは「ファイルポインタは、有効なファイルポインタである必要があり、 fopen() または fsockopen() で正常にオープンされた (そしてまだ fclose() でクローズされていない) ファイルを指している必要があります。」とのこと。
これは説明よりもサンプルコード見たほうが早いかも。

<?php

$list = array (
    array('リンゴ', 'バナナ', 'みかん', 'キュウイ'),
    array('123', '456', '789'),
    array('"野球"', '"サッカー"')
);
//ここでfile.csvをオープン(新規作成)
$fp = fopen('file.csv', 'w');
//配列を1行ずつ取り出す。
foreach ($list as $fields) {
    //取り出した配列を書き込む
    fputcsv($fp, $fields);
}
//最後に閉じる
fclose($fp);
?>

これで書き出されたfile.csvの中身は

リンゴ,バナナ,みかん,キュウイ
123,456,789
"""野球""","""サッカー"""

になる。

これ理解すればなるほど~ってなるけど全然知らないでコピペしてるだけだと応用が効かない。
一つ一つ何故こうなのかとか実際に自分で動作確認してエラーが起きたらとにかくvar_dumpする!
すごく初歩的なことなんだろうけど今回は非常に勉強になった。

WordPressで外部js,cssを読み込む方法

まず作ったファイルを使ってるテーマの中にあるjsフォルダ、cssフォルダにアップロードしておく。
基本的に読み込ませる場所は

header.php

の中に

<?php wp_head(); ?>

という記述があるからその直後に読み込ませるようにする。

Javascriptを読み込ませたいなら(仮に作ったファイル名をtest.jsとして)

<script type="text/javascript" src="<?php echo get_template_directory_uri(); ?>/js/test.js"></script>

とする。

CSSなら(ファイル名test.css)

<link type="text/css" rel="stylesheet" href="<?php echo get_template_directory_uri(); ?>/css/test.css" />

で読み込むようになる。

ただこのやり方だと親テーマのフォルダを参照するので子テーマを使っていて子テーマに新たにjsフォルダを作ったりした場合は上記の書き方だと参照しないので

<link type="text/css" rel="<?php echo get_stylesheet_directory_uri(); ?>/css/test.css" />
<script type="text/javascript" src="<?php echo get_stylesheet_directory_uri(); ?>/js/test.js" />

これで子テーマのフォルダを参照しにいってくれる。

WordPressの子テーマの作り方

WordPressのカスタマイズは直接テーマのテンプレートタグをいじらないほうがいいらしい。
アップデートなどでせっかくいじったのが消えてしまうなんて悲しいことが起きるとのこと。

とりあえず子テーマ作成にはindex.phpとstyle.cssがあればいいみたい。
なのでまずはテーマがあるフォルダと同じ階層に子テーマ用にchildフォルダをつくる。
wp-content/themes/child
で、そこにindex.phpとstyle.cssを作って入れて
style.cssに以下を書く。

/*
Theme Name: child
Template: twentytwelve
*/

と最低限記述すれば子テーマとして認識される。
でもこれだと親テーマのスタイルが継がれないで崩れてしまうから

@import url('../twentytwelve/style.css');

を書けば親テーマのスタイルを認識してくれるようになる。
後は好きなようにカスタマイズしていける。