Oracle CloudでWordPress(nginx+php-fpm)

WordPressを引っ越ししました。

どうやらOracleが本気出してきたようで、Oracle Cloudで無料のインスタンスを利用できるようになったので早速契約。1コア1GBのVMを二個まで無料とかマジ大丈夫ですかねOracleさん。

さて。これまでさくらのVPSで動いていたWordpressはApache + mod_php で、mod_davとmod_svnを使っていたので長い間Apache派だったのですが、そろそろnginxにしたくなり、今回思いきってnginx + php-fpm の構成にしました。

いつOracleがやっぱ無料は無しな!と言い出しても大丈夫なように、対応手順を書いておきます。
テクノロジースタックは以下の通りです。

  • CentOS7
  • nginx
  • php7.3
  • php-fpm
  • MariaDB10.4
  • WordPress最新版

サイトコンテンツは変わっていないですが、動いているホストが変わっているので引っ越しっちゃ引っ越しですね。前回の引っ越しは2015年だったので、3,4年に一回は引っ越している様子。まーそこそこめんどくさかったのですが以下の流れで対応しました。

旧Wordpressからデータエクスポート

記事だけのインポートエクスポートなら標準機能で対応できるのですが、画像ファイル等もまとめて持って行きたかったので、移行プラグインを使いました。

All-in-One WP Migration

All-in-One WP Migration

めっちゃ使いやすかったのですが、インポート時にどうしても上手く行かず、諦めました。

Duplicator – WordPress Migration Plugin

Duplicator – WordPress Migration Plugin

ちょっと使い方分かりにくかったのと、エクスポート時に mysqli を要求されて mod_php をリビルドしたり色々手間だったけれど、一回分かると後は楽でした。実際にこのプラグインを使って全データのエクスポートとインポートを行いました。installer.php とデータファイルをダウンロードしておきます。

CentOS7インストール&設定

まあ、クラウド環境のOSインストールなど、CentOS7 入りのインスタンスを立ち上げるだけですが。Oracle Cloudどうやら大人気のようで、しばらくは何度やっても Out of host capacity. エラーでインスタンスを作成できない状態が続いていました。10月の3日頃に設備が増強されたらしく、急いで 2VMを確保し、直近ではまた Out of host capacity. エラーが出ているようです。Oracleは無料ユーザの為に何台のExadataを用意するのだろと思うと胸が熱くなりますね。

あ、とりあえずタイムゾーンの設定だけやっときましょうか。

# タイムゾーン確認
timedatectl
# タイムゾーン設定
timedatectl set-timezone Asia/Tokyo

Oracle Cloud各種設定

ローカルアドレスのみ付与された状態で起動するので、外からつつけるようにするにはいくつか設定が必要でした。
具体的には、
インスタンスの詳細から
→ 左メニューのリソース
→ アタッチされたVNIC
→ 右メニューのVNICの詳細の表示
→ 再度左メニューのリソース
→ IPアドレス
→ 右メニューの編集
→ パブリックIPアドレスの割り当て方法を選択

むずー!
んで次はNW周りの許可設定で、
同じくインスタンスの詳細から
→ パブリックサブネット
→ 右メニューから詳細の表示
→ セキュリティリストでイングレス・ルールで 80番と443番を許可

AWSとかを触ってないと無理ですねこれ。無料だからってアカウント作ってVM立ち上げても、慣れてない人はグローバルから ssh でアクセスする事しかできなさそう。

SELinuxとfirewall

今度はOS側の設定変更です。
皆様、SELinuxは速攻でOFFにしますよね。

# vi /etc/selinux/config
SELINUX=disabled

この後再起動が必要です。
一時的にオフにする場合は setenforce 0 で。あとは getenforce コマンドで現状を確認できます。

CentOS7から、iptablesコマンドでごにょごにょするのでは無く、firewall-cmd コマンドで iptablesルールを操作するようになったようです。インバウンドは 22 くらいしか許可されていないので、http と https を追加します。

# 現在のルールを一覧表示
firewall-cmd --list-all
# インバウンドで http と https を許可
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
# 設定反映
systemctl reload firewalld.service

この後 iptables -L などで確認してもちゃんと許可されているはずです。

VM.Standard.E2.1.Micro ディスクベンチ

何か気になったので軽くディスクパフォーマンスを調べてみました。

# dd if=/dev/zero of=/tmp/testimg bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.5183 s, 61.3 MB/s

まあ遅いですね。ちなみにAWSとさくらVPSは 200MB/sくらい出ます。OracleCloudは、ディスク容量を大きくすればするほどIOPSも上がって行くようなので、無料インスタンスならまあこんなもんかなという気はします。

各種リポジトリ追加

remiとepelは入れるでしょ。あとはミドルウェア個別のリポジトリ。

remi

yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

epel

yum install epel-release

nginx

vi /etc/yum.repos.d/nginx.repo
# 下記内容を記載して保存
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

MariaDB

vi /etc/yum.repos.d/MariaDB.repo
# 下記内容を記載して保存
# MariaDB 10.4 CentOS repository list - created 2019-10-10 14:44 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

あとは適当に yum update 叩いとけば良いんじゃないですかね。

php7.3インストール&設定

yum install php73

こうやってインストールすると、php73 とバージョンを指定しないとダメなので、個人的にはこういう事を良くやります。そしたら php コマンドで 7.3 が動きます。

ln -s /opt/remi/php73/root/usr/bin/php /usr/bin/php
vi /etc/opt/remi/php73/php.ini
# 変更するとしたらここらへんかなぁ
max_execution_time = 300
max_input_time = 300
post_max_size = 512MB
upload_max_filesize = 512MB

この値は、上で紹介した All-in-One WP Migration がブラウザからバックアップファイルをD&Dでインポート可能だった為、バックアップファイル(数百MB)を受けきる為に大きな数字にしました。ただ、それでもアップロードが途中で止まったりして結局 Duplicator を使ったわけですけれども。

nginxインストール&設定

yum install nginx

インストールしたあとは設定ファイルが全て。

vi /etc/nginx/conf.d/default.conf
# 変更が必要な部分は
    location / {
        root   /var/www/wordpress;
        index  index.html index.htm index.php;
        try_files $uri $uri/ /index.php?$args;
    }
# だいたいここらへん
    location ~ \.php$ {
        root           /var/www/wordpress;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        fastcgi_param  PATH_INFO $fastcgi_script_name;
        include        fastcgi_params;
    }

try_files 設定と、fastcgi_param SCRIPT_FILENAME 設定は毎回悩まされる所です。まあ、WordPress を動かすだけならこんな感じで問題ないはず。

nginxとphp-fpmの通信は UNIXソケットを使う方法と、TCP/IP で通信する方法があります。
UNIXソケットの方が若干パフォーマンスが良いとの事ですが、もはやめんどくさくなってきたのでデフォルトの TCP/IP で設定しています。

# nginx起動
systemctl start nginx
# インスタンス再起動時に自動的に上がって来るようにする
systemctl enable nginx

php-fpmインストール&設定

yum install php73-php-fpm

remi で入れると設定ファイル等が /etc/opt/remi 以下になるのがちょっと注意かな。

# /etc/opt/remi/php73/php-fpm.conf は変更なし。

vi /etc/opt/remi/php73/php-fpm.d/www.conf
# 変更点としては以下。ユーザとグループを apache から nginx に変更。
# その他、同時に起動するプロセス数等はそのままでいいや。
user = nginx
group = nginx

# php-fpm 起動
systemctl start php73-php-fpm
# php-fpm 自動起動設定
systemctl enable php73-php-fpm

php関連モジュールインストール

まあ、ここらへんはご自由に。opcache は入れるよね。

yum install php73-php-bcmath php73-php-dba php73-php-gd php73-php-json php73-php-mbstring php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pear

MariaDBインストール&設定

yum install MariaDB-server MariaDB-client
mysql

MariaDB [(none)]> CREATE DATABASE wordpress;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress.* TO "wordpressusername"@"localhost" IDENTIFIED BY "wordpresspassword";
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> EXIT

WordPressインストール

そういや nginx 設定の方に先に書いてしまいましたが、/var/www/wordpress 以下に全ファイルを展開しました。インストール場所は人によりますね。そしてここは公式の案内の方が分かりやすいかもしれない。

WordPress5分間インストール

データインポート

上記 Duplicator を使ってダウンロードした installer.php とデータファイルを、ドキュメントルート等に置き、installer.php にアクセスすると勝手にデータインポートしてくれます。便利。

Let’s Encrypt を使ったhttps化

いやー実はこれが一番やりたかった事なんですけどね。

certbot-auto インストール

基本こいつが全部やってくれます。

curl -o /usr/local/bin/certbot-auto https://dl.eff.org/certbot-auto
chmod +x /usr/local/bin/certbot-auto
certbot-auto

実行するとメアド登録する?とか聞かれますが、N でも大丈夫です。文章を読んで決めて下さい。

nginx 設定

certbot は、そのドメインを設定者が所有している事を確認する為、外からアクセスして認証ファイルを取得出来ることを確認します。まずはその為の設定を nginx にセットします。

# /var/www/letsencrypt に配置する事にしました。
mkdir /var/www/letsencrypt
vi /etc/nginx/conf.d/default.conf
# 以下を追記
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
    }

# あと、dhparam ファイルを作成しておきます。
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
openssl dhparam 2048 -out dhparam.pem

証明書の取得

ドメインを指定してコマンドを実行します。

certbot-auto certonly --webroot --agree-tos -w /var/www/letsencrypt -m メールアドレス -d 登録するドメイン名

問題無ければ、/etc/letsencrypt/live/ドメイン名/ 以下に証明書が作成されます。そして再度 nginx の設定を変更。

vi /etc/nginx/conf.d/default.conf
# 以下を追記。80番へのリクエストは443へリダイレクト。
server {
    listen       80;
    server_name  irts.jp;
    return 301 https://irts.jp$request_uri;
}
# 443 へのアクセス時
server {
    listen       443 ssl;
    server_name  irts.jp;

    ssl                        on;
    ssl_protocols              TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers  on;
    ssl_ciphers                'ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS';
    ssl_dhparam                /etc/nginx/ssl/dhparam.pem;
    ssl_certificate            /etc/letsencrypt/live/irts.jp/fullchain.pem;
    ssl_certificate_key        /etc/letsencrypt/live/irts.jp/privkey.pem;

これで nginx を再起動すれば、https でのアクセスができるようになっているはず。

cron 設定

Let’s Encrypt って有効期限が 3ヶ月しか無いので、一時的に使うものかと思っていたのですが、コマンド一発で更新できるようで、以下の通り cron をセットしました。

0 4 * * * /usr/local/bin/certbot-auto renew -q --post-hook "systemctl reload nginx" > /dev/null 2>&1

これで一通り完了かな。お疲れ様でした。

wordpressパフォーマンス

結局パフォーマンスはどうなのよ?って事で、ab を叩いてみました。
なお、Wordpress は WP Super Cache プラグインを導入済みです。

$ ab -n 1000 -c 10 https://irts.jp/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking irts.jp (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software:        nginx
Server Hostname:        irts.jp
Server Port:            443
SSL/TLS Protocol:       TLSv1/SSLv3,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path:          /
Document Length:        22840 bytes

Concurrency Level:      10
Time taken for tests:   8.176 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      23044017 bytes
HTML transferred:       22840000 bytes
Requests per second:    122.31 [#/sec] (mean)
Time per request:       81.758 [ms] (mean)
Time per request:       8.176 [ms] (mean, across all concurrent requests)
Transfer rate:          2752.50 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       10   53 127.6     22    1076
Processing:     4   26  22.7     16     256
Waiting:        4   23  22.1     14     253
Total:         15   79 127.3     74    1090

Percentage of the requests served within a certain time (ms)
  50%     74
  66%     81
  75%     85
  80%     87
  90%     92
  95%     95
  98%    279
  99%   1078
 100%   1090 (longest request)

ふむ。悪くないんじゃないですかね。元々の環境だと、150 requests/s くらい出てましたが、無料でこれならまあ良いでしょう。

という事で、長々と書きましたが Oracle Cloud 使い倒したいと思います。

 

コメントする

メールアドレスが公開されることはありません。