A-TAK.COM

お名前.com VPSからGoogle Compute Engineにサーバー移行した その2

※Amazonのアソシエイトとして、A-TAK.COMは適格販売により収入を得ています
※本サイトではその他アフィリエイトも利用しております。

広告
シェア

こんな構成にしてみたよ

 前回に引き続き、Google Compute Engine上にオートスケールで拡張するWordPressを構築していく方法を書いていきます。今回は実際にDBとWebサーバーの構築を行っていきます。

GCEを使う準備

前回の記事↓

 まずは、Googleアカウントを作成する必要があります。こちらの記事が参考になると思います。

 アカウントを作成して初期登録し、Projectを作成するとWebコンソールからインスタンスが作成できる状態になります。サーバーにSSHでログインしていろいろ設定するためにはGoogle Cloud SDKが必要ですので、インストールしておきましょう。私はMacでやってますが、コマンドコピペでいけるレベルです。

https://cloud.google.com/sdk/

 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の設定です。

参考

続きはこちら↓

広告


シェア

投稿日

カテゴリー:

投稿者:

カテゴリ一覧