前回に引き続き、Google Compute Engine上にオートスケールで拡張するWordPressを構築していく方法を書いていきます。今回は実際にDBとWebサーバーの構築を行っていきます。
目次
- 1 GCEを使う準備
- 2 インスタンス作成
- 3 DBサーバー構築
- 4 NFSサーバー構築
- 5 Webサーバー構築
- 5.1 Web用インスタンス作成
- 5.2 時間を日本時間に
- 5.3 スワップファイル指定
- 5.4 起動時にスワップファイルを自動で使える状態にする
- 5.5 DBクライアントとPHPインストール
- 5.6 php.iniでアップロードサイズの指定
- 5.7 SELinux無効化
- 5.8 php-fpm設定
- 5.9 PHP-FPM起動
- 5.10 Nginxインストール
- 5.11 Nginx基本設定
- 5.12 サイト毎の設定
- 5.13 サイト毎のログファイル出力先作成
- 5.14 サービス登録 & サービス起動
- 5.15 NFSクライアントインストール
- 5.16 NFSマウントポイント設定 & マウント
- 5.17 OS起動時にNFSを自動マウント
- 5.18 参考
GCEを使う準備
前回の記事↓
まずは、Googleアカウントを作成する必要があります。こちらの記事が参考になると思います。
アカウントを作成して初期登録し、Projectを作成するとWebコンソールからインスタンスが作成できる状態になります。サーバーにSSHでログインしていろいろ設定するためにはGoogle Cloud SDKが必要ですので、インストールしておきましょう。私はMacでやってますが、コマンドコピペでいけるレベルです。
gcloud init
を実行するとブラウザが立ち上がって、Googleアカウントの認証が行われます。裏でブラウザ立ち上がってたりするから探してください。
Macの場合、
Where would you like to clone [default] repository to
のところでEnterで先に進めると、
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
とエラーが出る場合があります。Google Cloud SDKがXcodeの一部の機能を使っているためXcodeを一度起動してライセンスにOKしたあとに gcloud init
を実行する必要があります。
最後に結果が出てきて、
[compute]
region = us-central1
zone = us-central1-f
リージョンもゾーンもUSになってますが、後でWebコンソールのメタデータのところで変更ができるので気にしないでよいです。
インスタンス作成
Google Devlopers ConsoleにGoogleアカウントでログインすると左のツリーに「コンピュート」という項目があります。ここにGoogle Compute Engineに関する機能が詰め込まれています。
インスタンスを作成するには、”コンピュート” -> “Compute Engine” -> “VM インスタンス”の画面の上にある”新しいインスタンス”を押します。
そうすると作成するサーバーのスペックを指定する画面が出てきます。まずはDB兼NFSサーバーを作りますので、名前のところにはたとえば”db”とします。ゾーンは日本に近い”asia”から始まるゾーンを選んでおきます。私はとりあえず”asia-east1-a
“を選びました。PINGで反応が早そうなのを選ぶのが本当はいいのかも。
マシンタイプは”f1-micro
“にしました。メモリが0.6GBと少なくて、はっきり言って結構貧弱なスペックなのですが、まずは最小構成ということでこれにしました。
ただ、SELinuxのポリシー反映がメモリ不足(setsebool -P
でKilledって終了する)で失敗するぐらいメモリが少ないので、一個上のg1-small
ぐらい選んでおいた方が苦労は少なくセキュアな環境を作れると思います。今回、とりあえずSELinuxはあきらめました。
ブートディスクはCentOS 7.1.1503を選んで、容量は20GBにしました(写真では30GBになってますが)。容量はOS選択の下の方に入力欄があります。DBと画像などのコンテンツを入れるので少し大きめにしました。a-tak.comは既に画像だけで圧縮して3GBぐらいあるので。それでもOS含めて4.5GBぐらいなので、もう少し少なめのサイズでも良かったかもしれません。
ブートディスクのパーティションはXFSフォーマットなので、サイズは後で拡張可能ですが、逆に縮小はできません。あまり欲張り過ぎて無駄な課金が発生しないようにうまく見極めましょう。
あとは”作成”を押すとインスタンスの作成が始まります。だいたい20-30秒ぐらいでできあがるみたいです。OSが起動してるかどうかは”VM インスタンス”にならんでいるVMの名前をクリックした先の一番下に”シリアル コンソール出力”というリンクがあるので、それをみるとブートシーケンスが表示されるので、
CentOS Linux 7 (Core)
Kernel 3.10.0-229.14.1.el7.x86_64 on an x86_64
みたいな感じの行が出ていれば、もう起動しています。
DBサーバー構築
インスタンスができたのでDBサーバーを構築していきます。
Macのターミナルを起動して以下のgcloudコマンドを入れます。
gcloud compute --project "プロジェクト名" ssh --zone "ゾーン名" "インスタンス名"
たとえばこんな感じになります。
gcloud compute --project "my-project99" ssh --zone "asia-east1-a" "db"
このコマンドですが、Webコンソールのインスタンスの画面上にある”SSH”のところから”gcloud コマンドを表示”を選ぶと、そのインスタンスにログインするコマンドが表示されますので、最初はこれで確認がいいと思います。
gcloudコマンド使うことで、普通にLinuxサーバーにSSHでログインしたような状態になります。必要なアプリをどんどんインストールしていきます。
インストールは面倒なのでsudoでsuになってやっちゃいました。
時間を日本時間に
sudo su -
cp /usr/share/zoneinfo/Japan /etc/localtime
これやっとかないとログの時間がずれて調査しづらい。
スワップファイル指定
デフォルトではスワップファイルの指定がないのでメモリ不足になると止まる。
dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
swapon /swapfile
起動時にスワップファイルを自動で使える状態にする
vi /etc/fstab
最後に追加
/swapfile none swap sw 0 0
mariddbインストール
yum -y install mariadb
yum -y install mariadb-server
mariadb設定
vi /etc/my.cnf
mysqlセクションに
character-set-server=utf8
を追加しておく。
mariadb起動
systemctl enable mariadb.service
systemctl start mariadb.service
これでmariadb(MySQL)が起動します。CentOS7になってサービス起動のコマンド入力多くなって面倒になった…。
NFSサーバー構築
WordPressとアップロードした画像もこのサーバーにおいて、Webサーバーから参照させたいので、ファイルサーバー(NFS)を作ります。
NFSサーバーインストール
前の章でsudo su -でsuになっている前提ね。
yum -y install nfs-utils
共有フォルダ作成
/var/contents
をファイル置き場にする場合。
mkdir -p /var/contents/hoge.com/html
chmod 777 /var/contents/
アクセス権限はフルアクセスしてるけど、絞れるなら絞ったがいい。
アクセス許可設定
vi /etc/exports
以下のように記載。
/var/contents instance-group-web*.c.my-project99.internal(rw)
各項目は↓こんな感じ。
共有するディレクトリ アクセス許可するホスト(権限)
「アクセス許可するホスト」はWebサーバーのホスト名を記載する。
GCEではインスタンスとプロジェクト名を絡めてGCE内部で使えるホスト名を自動で作成してくれる。
“instance-group-web.c.my-project99.internal
“の最初の”instance-group-web
“がインスタンス名になります。名前の最後に” *
“をつけることで、”instance-group-web”の名前で始まるインスタンス(ホスト)からの接続を許可することになります。
そのため、このあとのWebサーバーを作るときのインスタンス名は”instance-group-web”から始まる名前にする必要があります。こうしてるのはオートスケールで勝手にサーバーがドカドカ増えるからという理由があります。
ホスト名の確認はnslookupでわかります。
yum -y install bind-utils
でnslookupコマンドをインストールして、
nslookup インスタンス名
で
Non-authoritative answer:
Name: インスタンス名.c.my-project99.internal
みたいな感じでわかります。
NFSドメイン名の指定
vi /etc/idmapd.conf
Domainのところを以下の要領で書き換えます。
Domain = ホスト名.c.プロジェクト名.internal
NFSサーバー起動
systemctl start rpcbind
systemctl start nfs-server
systemctl start nfs-lock
systemctl start nfs-idmap
systemctl enable nfs-server
これでNFSサーバーの準備もできました。
参考
https://users.miraclelinux.com/technet/document/linux/training/274.html#training274
Webサーバー構築
LBとオートスケールで増減するWebサーバーが目標ですが、まずはテンプレートとなるサーバーを構築しなければいけません。まずは一台のWebサーバーを作るところから始めます。
Web用インスタンス作成
Webサーバーのインスタンスを作成します。やり方は前項参照で。
名前はさきほどNFSサーバーで許可した名前にする必要があるので、”instance-group-web
“で始まる名前にする。たとえば”instance-group-web99
“とか。マシンタイプは f1-micro、OSはDBサーバーと同じく CentOS 7.1 、ディスクはそんなにいらないので 10GB で構築(もっと少なくてもいいかも)。
繰り返しになりますが、このf1-microだとSELinuxの設定がまともに終了しないので、ちゃんとセキュリティ確保したい人は、もう一つ上のサーバーにしてください。今回はSELinuxを無効にして進めていきます。
あと、今回Webサーバーなので、“HTTP トラフィックを許可する”にチェックを入れてください。
時間を日本時間に
DBサーバーと同じ設定ですね。
sudo su -
cp /usr/share/zoneinfo/Japan /etc/localtime
スワップファイル指定
dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
swapon /swapfile
起動時にスワップファイルを自動で使える状態にする
vi /etc/fstab
最後に追加
/swapfile none swap sw 0 0
DBクライアントとPHPインストール
ここからWebサーバー特有の設定になります。
MariaDBへの接続クライアントとPHPとNginxから呼び出されるPHP-FPMをインストールします。
[2015-11-01追記]
php-gdを入れないとサムネイルが作成されないので追加しました
sudo su -
yum -y install mariadb
yum -y install php
yum -y install php-gd
yum -y install php-mysql
yum -y install php-mbstring
yum -y install php-fpm
php.iniでアップロードサイズの指定
[2015-11-07追記]
アップロードサイズ大きくしないとWordPressでプラグインの動きに制約があったりしたので追加しました。
vi /etc/php.ini
upload_max_filesize = 50M
SELinux無効化
メモリの関係でポリシー反映できずWordPressを動かせないので、SELinuxを無効にします。
setenforce permissive
コマンドでSELinux無効化します。
再起動時にも無効になるように設定します。
vi /etc/selinux/config
SELINUX=enforce
となっているところを
SELINUX=permissive
に変更します。
まちがって、SELINUXTYPE
の方を書き換えないようにしてくださいね。ポリシーファイルが見つからないってOS起動しなくなるので。一回やってしまって起動しなくなりました(笑)。
php-fpm設定
vi /etc/php-fpm.d/www.conf
変更したところ中心に書いていきます。
[www]
# dynamicをstaticに
pm = static
# php-fpmの最大子プロセス数
pm.max_children = 3
#500リクエストで立ち上げ直し
pm.max_requests = 500
PHP-FPM起動
systemctl enable php-fpm.service
systemctl start php-fpm.service
pm.max_childrenは最初50になってますが、このままpmをstaticにすると、いきなり50個プロセスが立ち上がってサーバー死ぬので設定漏れないようにしてください。これも一度やらかしました(笑)。
Nginxインストール
Nginxのリポジトリを追加
vi /etc/yum.repos.d/nginx.repo
以下を記載
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
インストール
yum -y install nginx
Nginx基本設定
vi /etc/nginx/nginx.conf
↓ユーザー変更。権限と合わせて設定変更。うちはApacheから移行したのでapacheにしました。
user apache apache;
↓ログディレクトリの権限設定
chown -R apache:apache /var/log/nginx
サイト毎の設定
vi /etc/nginx/conf.d/hoge.com.conf
server {
# サーバーのデフォルトTCPポートです。
listen 80;
# サーバー名を設定します。
server_name hoge.com;
# ドキュメントルートディレクトリを設定します。
root /var/contents/hoge.com/html;
# index file タイプの優先順を設定します。
index index.php index.html index.htm;
# ログファイル名を設定します。
access_log /var/log/nginx/hoge.com/access.log;
error_log /var/log/nginx/hoge.com/error.log;
#トップページを指定した場合に/blogにリダイレクト
location / {
rewrite /index.html /blog/ permanent;
}
location /blog {
try_files $uri $uri/ @wordpress;
}
location ~ \.php$ {
try_files $uri @wordpress;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location @wordpress {
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root/blog/index.php;
include fastcgi_params;
}
}
この例はhttp://hoge.com/blog配下にWordPressをおいた場合の例になります。ドメイン直下にWordPressを置く場合は、以下のようになると思いますが、動作確認はしてません。
server {
# サーバーのデフォルトTCPポートです。
listen 80;
# サーバー名を設定します。
server_name hoge.com;
# ドキュメントルートディレクトリを設定します。
root /var/contents/hoge.com/html;
# index file タイプの優先順を設定します。
index index.php index.html index.htm;
# ログファイル名を設定します。
access_log /var/log/nginx/hoge.com/access.log;
error_log /var/log/nginx/hoge.com/error.log;
location / {
try_files $uri $uri/ @wordpress;
}
location ~ \.php$ {
try_files $uri @wordpress;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location @wordpress {
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include fastcgi_params;
}
}
サイト毎のログファイル出力先作成
mkdir -p /var/log/nginx/hoge.com
chown apache: /var/log/nginx/hoge.com/
サービス登録 & サービス起動
systemctl enable nginx.service
systemctl start nginx.service
NFSクライアントインストール
yum -y install nfs-utils
NFSマウントポイント設定 & マウント
mkdir /var/contents/
mount -t nfs db.c.my-project99.internal:/var/contents /var/contents/
“db.c.my-project99.internal
“はDBサーバー名のホスト名なのでnslookupで確認して書き換えてください。
OS起動時にNFSを自動マウント
vi /etc/fstab
一番最後に以下を追加
db.c.my-project99.internal:/var/contents /var/contents/ nfs rw,soft
ここもちゃんとしたDBサーバーのホスト名に書き換えてね。
とりあえず、サーバーの準備はこれで終了。
次はWordPressの設定です。
参考
続きはこちら↓