安い、早い、強い WordPress構成

WordPressのベストな環境

高負荷に耐え、安いという観点でのベストなWordPress構成はさくらのクラウド(ウェブアクセラレータ) + AmazonLightsailという結論が自分の中で出た。
※このブログを勉強のためIaaSで運用している。勉強という観点を除けばQiitaのようなSaaSがベストかも。

価格詳細

さくらのクラウド(ウェブアクセラレータ)

・アウトバウンドトラフィックが5円/1GiB(税込)。そして最初の500GiB分が無償。
 例えばAWSであれば日本リージョンのアウトバウンドトラフィックが0.114USD/1GBのため半額以下となっている。

AmazonLightsail

・1vCPUメモリ1GBで記憶域は40GBのSSD。通信量2TBまで無料で月額$5。
 ・通信料は2TBを超えると、EC2と同じ金額(0.114USD/1GB)かかるが、CDNをフロントにおくため超えることはないはず。
・他のIaaSでも金額はほぼ変わらないが、使ってみたかったためAmazonLightsailを選択した。

AWS Lightsail 設定概要

WordPressインストールなど細かい部分は割愛する。

インスタンス構築



ブラウザ経由でSSHすること可能。sshdを止めたり22番ポートを停止するともちろんSSHできない。

さくらのウェブアクセラレータとの通信は暗号化するため、HTTPSポートを公開する。

OS初期設定とソフトインストール

# hostnamectl set-hostname tech
# apt install language-pack-ja
# update-locale LANG=ja_JP.UTF-8
# timedatectl set-timezone Asia/Tokyo
# apt install nginx php-fpm php-gd php-mysql php-mysqlnd mariadb-server phpmyadmin nkf lv

OSセキュリティ設定

・パッケージを最新にして、利用しないポートは公開しない
・SecurityGroupのようにGUIでFWの設定ができないため、サーバのFWで防御する必要がある
 22は自宅のみ、80はLet’s Encrypt、443はさくらのウェブアクセラレーターからしかアクセスできないようにした。

# apt update
# apt upgrade
# ufw enable
# ufw default deny
# ufw allow from [自宅IPアドレス] to any port 22
# ufw allow from 66.133.109.36 to any port 80
# ufw allow from 64.78.149.164 to any port 80
# ufw allow from 133.167.4.0/24 to any port 443
# ufw allow from 153.121.0.0/24 to any port 443
# ufw reload
# ufw status verbose
状態: アクティブ
ロギング: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
新しいプロファイル: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    [自宅IPアドレス]
80                         ALLOW IN    66.133.109.36
80                         ALLOW IN    64.78.149.164
443                        ALLOW IN    133.167.4.0/24
443                        ALLOW IN    153.121.0.0/24

OS節約設定

・不要(だと思った)プロセスを停止し、OOM Killer対策としてスワップを追加しておく。

### Alt+ファンクションキーでバーチャルターミナルを起動させるデーモン
# systemctl disable autovt@.service
### LVM2のミラーデバイスを管理する
# systemctl disable blk-availability.service
# systemctl disable apparmor.service
# systemctl disable iscsi.service
# systemctl disable open-iscsi.service
# systemctl disable lvm2-monitor.service
# systemctl disable rsync.service
### クロック制御(負荷がかかるとクロックを上げ、負荷が下がるとクロックも下げる)
# systemctl disable ondemand.service
### 自動アップデートは無効にする
# systemctl disable unattended-upgrades.service

# mkdir /var/swap
# dd if=/dev/zero of=/var/swap/swap.img bs=1M count=4096
# chmod 600 /var/swap/swap.img
# mkswap /var/swap/swap.img
# swapon /var/swap/swap.img
# vi /etc/fstab
/var/swap/swap.img swap swap defaults 0 0

Nginx

特徴的な設定として
・wp-admin配下などは自宅からしかアクセスできないようにしている。
・フロントにさくらのウェブアクセラレーターを導入するため、以下2点を設定している。
 ・real_ipモジュールを利用してクライアントIPアドレスを取得できるように
 ・キャッシュしたいコンテンツにadd_header Cache-Control “s-maxage=***, public”を設定

# diff nginx.conf nginx.conf.default
<       ##
<       # Proxy
<       ##
<
<       set_real_ip_from 133.167.4.0/24;
<       set_real_ip_from 153.121.0.0/24;
<       real_ip_header X-Forwarded-For;
<       real_ip_recursive on;
<
<       ##
<       # アクセス制限
<       ##
<       map_hash_bucket_size 128;
<       include /etc/nginx/accessctl/ALLOW_PRIVATE;
# cat /etc/nginx/accessctl/ALLOW_PRIVATE
geo $allow_private {
default 0;
10.0.0.0/8 1;
172.16.0.0/12 1;
192.168.0.0/16 1;
127.0.0.1 1;
[自宅IPアドレス] 1;
}
# cat /etc/nginx/akat.conf.d/security.wordpress.ip.conf
location ~ wp-login\.php$|wp-config\.php$|/wp-admin {
        set $allow_f_private 0;
        if ( $allow_private = 1 ) { set $allow_f_private 1; }
        if ( $allow_f_private = 0 ) { return 403; }

        location ~ \.php$ {
                set $allow_f_private 0;
                if ( $allow_private = 1 ) { set $allow_f_private 1; }
                if ( $allow_f_private = 0 ) { return 403; }
                include fastcgi_params;
        }
}
# cat /etc/nginx/sites-enabled/tech.akat.info_ssl
server {
        ### SSL証明書設定 ###
        ssl on;
        ssl_certificate /etc/letsencrypt/live/tech.akat.info/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/tech.akat.info/privkey.pem; # managed by Certbot
        # SSLのセッションタイムアウトを利用する
        ssl_session_timeout 1d;
        # 使うべきプロトコルを指定する
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        # SSLエンジンが利用する暗号法を設定する
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        # サーバの暗号化をクライアントよりも優先すべきかどうか指定する
        ssl_prefer_server_ciphers on;

        ### 基本設定 ###
        listen  443; ## listen for ipv4; this line is default and implied
        server_name tech.akat.info;
        root /var/www/akat.info/tech/htdocs;
        index index.html index.php;
        client_max_body_size 20M;

        ### ホスト設定(違うホスト名からアクセスがあったときはエラーに) ###
        if ( $host != $server_name ) { return 400; }

        ### conf ###
        include /etc/nginx/akat.conf.d/security.wordpress.ip.conf;

        ### log設定 ###
        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
        }
        access_log /var/www/akat.info/tech/log/$year-$month-$day-access.log;
        error_log /var/www/akat.info/tech/log/error.log;

        ### WordPress用設定 ###
        location / {
                try_files $uri $uri/ /index.php;
        }

        ### さくらのウェブアクセラレータ ###
        location ~* \.(gif|jpeg|png|ico|css|js|html)$ {
                expires 1d;
                add_header Cache-Control "s-maxage=432000, public";
        }
        location ~* ^/wp-content/ {
                expires 1d;
                add_header Cache-Control "s-maxage=432000, public";
        }

        ### PHP用設定 ###
        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_send_timeout 180;
                fastcgi_read_timeout 180;
        }
}

さくらのウェブアクセラレーター設定概要

以下の2つを参考に設定した。こちらも概要だけ記載する。
https://help.sakura.ad.jp/hc/ja/articles/115000035961
https://knowledge.sakura.ad.jp/5983/




設定後は無効となっており、DNS設定を実施して初めて有効となる。

参考

https://qiita.com/tailak/items/77b90a4df07e4f6a1fc2
https://qiita.com/RyoMa_0923/items/681f86196997bea236f0
https://qiita.com/RentalCat__/items/862d0ec075e97ae52b52
https://server-setting.info/ubuntu/first-setting-ubuntu-server.html
https://qiita.com/kitsuyui/items/11b4c0ebb9d1d2181853

https://qiita.com/pinohara/items/481c95dc4c8c2568bf8d
https://qiita.com/yakumo3/items/dc38a9b6c19194a88922

https://ja.wordpress.org/support/topic/syntaxhighlighter-evolved%E3%81%AE%E4%B8%8D%E5%85%B7%E5%90%88%E3%82%92%E7%9B%B4%E3%81%99%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84/