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年に一回は引っ越している様子。まーそこそこめんどくさかったのですが以下の流れで対応しました。
Contents
旧Wordpressからデータエクスポート
記事だけのインポートエクスポートなら標準機能で対応できるのですが、画像ファイル等もまとめて持って行きたかったので、移行プラグインを使いました。
All-in-One WP Migration
めっちゃ使いやすかったのですが、インポート時にどうしても上手く行かず、諦めました。
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 以下に全ファイルを展開しました。インストール場所は人によりますね。そしてここは公式の案内の方が分かりやすいかもしれない。
データインポート
上記 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 使い倒したいと思います。
Хочу приобрести покрышки, присмотрелся к шинам Yokohama, что скажете об этих шинах?
Не знаю, зачем вы написали о шинах в этом блоге, но шины YOKOHAMA – это здорово!