IDCFクラウドでUbuntu18.04をインストールしWordPressが動くWebサーバを構築してみる

はじめに

IDCFクラウドにUbuntu18.04とPHPとMySQLをインストールしてWordPressが動くWebサーバを構築します。
今のところうまく動いていますが、本当にこのパッケージや設定が必要かなどはしっかり検証できてないです。(そのうちやりたい)

使用環境

今回使用した環境、機材は以下の通りです。

  • クライアント: macOS 10.13(iMac)
  • サーバ: Ubuntu 18.04 (IDCFクラウド S1プラン メモリ1GB)

Ubuntuをインストール

IDCFクラウドには、Ubuntuのテンプレートが用意されています。
これを使うとクリックするだけでUbuntuがインストールされ使えるようになるのですが、私は今回、ディスク容量をケチるためisoインストールを使いました。

ちなみにisoでインストールする際に、言語を日本語にすると、アップデートでループにはまり、インストールが終わらない現象が起きました。英語では発生しなかったため、英語でインストールしました。

公開鍵認証を設定する

総当たり攻撃が怖いので、サーバにログインするのにパスワードは使わず公開鍵認証を使うようにします。

Macで鍵を作成します。
-f オプションを使うと鍵の名前を指定できます。

ssh-keygen -t rsa -f hogehoge

作成した公開鍵を、サーバに登録します。

scp hogehoge.pub 
root@<IPアドレス>:~/.ssh/authorized_keys

SSHの設定を変更します。
sshd_configを触ります。

パスワード認証を拒否します。

PasswordAuthentication no

編集が終わったら、公開鍵認証でログインできるか確認し、大丈夫そうならsshdを再起動します。
面倒臭がって確認しないと、僕のように実は公開鍵認証の設定がうまくできておらず、サーバから締め出され再度設定し直す手間が発生するかもしれない。

SSHログインで使用するポート番号も、変更した方が良いのですが、IDCFクラウドはファイアウォールでSSHログインできるIPアドレスを指定できるため、私は変えませんでした。

そういえば、sshd_configはコメントアウトされている設定がデフォルト値だと下記ブログに書かれていました。
なので、デフォルト値でよい設定はコメントを外さなくて良さそう。(ただマニュアルに仕様として書かれているか調べられていないので本当か分からず。そのうち探したい。)

sshd_config&PAMの設定 | OpenGroove

nginx インストール

Webサーバとしてnginxをインストールします。

sudo apt-get install nginx

nginx v1.14.0が入りました。
Ubuntuは、何もリポジトリを追加しなくても新しめのソフトウェアが入るので楽です。

nginx -v
nginx version: nginx/1.14.0 (Ubuntu)

PHPをインストール

続けてPHPをインストールします。

sudo apt-get install php-fpm

バージョンは7.2がインストールされました。

php -v
PHP 7.2.7-0ubuntu0.18.04.2 (cli) (built: Jul  4 2018 16:55:24) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.7-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zend Technologies

PHPでMySQLを扱えるようにする拡張機能をインストールします。これがないと「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです 」と表示されWordPressが動きません。

sudo apt install php7.2-mysql

参考: お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。と表示された対応

php7.2-gdはサムネイルの作成等で使用するらしい。
mbstringは入れているサイトが多かったのでとりあえず入れている。

sudo apt install php7.2-mbstring  
sudo apt-get install php7.2-gd

JetpackやWordPress iOS版アプリの連携に失敗するため、以下の拡張機能もインストールします。

sudo apt-get -s install php-xml php-xmlrpc

WordPressを動かすために必要なPHP拡張機能の一覧でもあれば良いのだけど、ざっとみた限り無かったので困った。
どこかのレンタルサーバのphpinfoを参考にして一通り入れた方が良いのだろうか。

PHP 実行時間を変更する

WordPressのインポートツールが途中で停止してしまうため、スクリプトの実行時間を120秒へ伸ばします。

max_execution_time = 120

MySQLをインストール

MySQLをインストールします。
mysql-clientは入れてみたけど不要かもしれない。

sudo apt-get install mysql-server mysql-client

以前の記憶では、インストール時にパスワードを何にするか聞かれ設定したが、今回は何も聞かれなかった。

パスワードは mysql_secure_installation コマンドで設定できるらしい。(ドキュメントに書かれてるのかな…見つけられんかった。)

参考: MySQL5.7の初期設定まとめ

作業用ユーザ作成

WordPressで使うユーザを作成します。
今回はwpuserというユーザを作成し、
wpuserで始まるデータベースの全権限をwpuserに割り当て、wpuserというデータベースを作成します。

CREATE USER wpuser IDENTIFIED BY [PASSWORD] 'hogehoge';
grant all on wpuser.* to wpuser;
create database wpuser;

文字コード変更

MySQLのデータの文字コードをUTF8にします。以下のサイトを参照。

参考: Ubuntu で MySQL

HTTPS対応

サイトをHTTPSに対応させるため、Let’s Encrypt を導入します。

sudo apt-get install letsencrypt

ドメインを指定して証明書を発行します。
この時、80番ポートを使うため、nginxは停止させておきます。

sudo letsencrypt certonly --standalone -d example.com

メアドとか入力してライセンスに同意すると証明書が発行され、以下に格納されます。

Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem

定期的に証明書を自動更新する

証明書の有効期限が切れる前に、自動で証明書を更新するようにcronに登録します。
cronは指定した時間にコマンドを実行してくれるスケジューラのようなものです。
以下の設定例では、毎月1日と15日の午前3時にnginxを停止し、証明書を更新した後、nginxを起動します。

sudo crontab -e
00 03 01,15 * * sudo systemctl stop nginx; sudo letsencrypt renew; sudo systemctl start nginx

参考:letsencryptをUbuntu16.04 + Nginxで使ってみた

nginxの設定

nginxは以下の要件を満たすように設定しました。

  • PHPが動く。
  • HTTPのアクセスをHTTPSへリダイレクトする。
  • 10MBまでのデータ(ファイル)のやり取りを許可する。
  • HTTPS、HTTP/2、GZIPを有効にする。
server {
        listen 80;
        listen [::]:80;
        server_name example.com;
        return 301 https://$host$request_uri;
}

server {
        client_max_body_size 10M;

        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

        gzip on;
        gzip_types text/css application/javascript application/json application/font-woff application/font-tff image/gif image/png image/jpeg application/octet-stream;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        root /var/www/html/;

        index index.html index.htm index.php;

        server_name example.com;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

WordPressのインストール

あとは、いつも通りWordPressをインストールします。
で、出来上がったのがこのサイトです。はい。

(余談) サーバのメモリ使用率とか

実際どのくらいサーバのメモリを使っているか top コマンドで見てみました。
1GBのうち、200MBほどMySQLが使用しています。PHPは300MBほど使ってますね。

PHP、MySQLで特にメモリの設定(どのくらいまでメモリを使わせるか)は行なっていないので、そのうちやらないと
空きメモリが91MBしかなくて一瞬ビビりましたが、バッファ(キャッシュ)に418MBあるようなので、余裕はありそうって見方で良いのだろうか。

top - 21:49:06 up 11 days, 24 min,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 112 total,   1 running,  60 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.3 us,  0.3 sy,  0.0 ni, 94.7 id,  2.7 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   985104 total,    91708 free,   474480 used,   418916 buff/cache
KiB Swap:   999420 total,   959996 free,    39424 used.   329968 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                             
 39465 mysql     20   0 1158236 199936   9996 S  0.3 20.3   2:26.56 mysqld                                                                                                              
 48539 www-data  20   0  383872  56548  35156 S  0.0  5.7   0:22.86 php-fpm7.2                                                                                                          
 48537 www-data  20   0  385520  56480  33420 S  2.3  5.7   0:22.78 php-fpm7.2                                                                                                          
 53353 www-data  20   0  380540  52596  34544 S  0.0  5.3   0:04.04 php-fpm7.2                                                                                                          
 53431 www-data  20   0  380544  51648  33596 S  0.0  5.2   0:04.10 php-fpm7.2                                                                                                          
 53351 www-data  20   0  380916  51624  33216 S  0.0  5.2   0:04.71 php-fpm7.2                                                                                                          
   428 root      19  -1  112188  22336  20508 S  0.0  2.3   0:03.21 systemd-journal                                                                                                     
 45333 www-data  20   0  145404  10716   7292 S  0.0  1.1   0:10.95 nginx  
以下略                                                                                                             

あとがき

WordPressの管理画面も瞬時に表示されるし、ページの方も(広告を非表示にすれば)概ね2-3秒以内にロードが終わるようなので、Ubuntu18.04にできたし、PHP7.2が使えるし、私は満足や。。。
ではでは。