公開用のWordPressサーバを構築する!(Ubuntu 20.04)

Ubuntu Server 20.04を使用して、公開用のWordPressサーバを構築します。作業は、root権限を使用して行います。

SSHの通信が可能であることを確認する!

SSHで通信できないと、サーバの操作が行えないため、まずSSHでログインできることを確認します。

Apacheをインストールする!

Apacheをインストールします。

Apacheのパッケージをインストールする!

Apacheをインストールします。Apachは、aptコマンドでインストールできます。

# apt install -y apache2

Firewallの設定を行う!

Apacheがインストールされたところで、Firewallの設定を行います。ApacheとSSHの通信を許可します。Apacheは、HTTPとHTTPSの双方を通信可能に設定します。

# ufw app list
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH
# ufw allow in "Apache Full"
Rules updated
Rules updated (v6)
# ufw allow in "OpenSSH"
Rules updated
Rules updated (v6)

Firewallの設定は、設定を行っただけでは有効化されません。ファイアウォールのサービスが起動していることを確認して、設定を有効化します。

# systemctl status ufw
● ufw.service - Uncomplicated firewall
     Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
     Active: active (exited) since Sun 2021-01-17 20:46:32 JST; 1h 44min ago
...

Firewallの状態を確認します。サービスは起動していますが、状態は「inactive」ですので、設定を有効化するコマンドを実行します。

# ufw status
Status: inactive
# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
# ufw status
Status: active

To                         Action      From
--                         ------      ----
Apache Full                ALLOW       Anywhere                  
OpenSSH                    ALLOW       Anywhere                  
Apache Full (v6)           ALLOW       Anywhere (v6)             
OpenSSH (v6)               ALLOW       Anywhere (v6)             

http://〜/でApache2のページが表示されることを確認します。

MariaDBをインストールする!

MariaDBをインストールします!

MariaDBをインストールする!

MariaDBをaptコマンドでインストールします!

# apt update
# apt install -y mariadb-server

MariaDBの文字コードを確認する!

MariaDBの文字コードを確認します。デフォルトで目的の「utf8mb4」になっていました。

# grep utf8 /etc/mysql/mariadb.conf.d/50-server.cnf
# utf8 4-byte character set. See also client.cnf
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

MariaDBのセキュリティ設定を行う!

「mysql_secure_installation」コマンドで、MariaDBのセキュリティ設定を行います。

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] 
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] 
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] 
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] 
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] 
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

MariaDBにログインする!

MariaDBにログインできることを確認しましょう!以下では、ログイン後、DBの文字コードの設定を確認しています。

# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 58
Server version: 10.3.25-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.003 sec)

MariaDB [(none)]> quit
Bye

PHPをインストールする!

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

PHPのパッケージをインストールする!

PHP7.4をインストールします。Ubuntu 20.04では、リポジトリの登録作業を行わなくても、PHP7.4をインストールすることができます。注意深くログを見ると、Apacheの設定が変更されていることなどが確認できます。

# apt install php7.4 php7.4-mysql
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libapache2-mod-php7.4 php-common php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-readline
Suggested packages:
  php-pear
The following NEW packages will be installed:
  libapache2-mod-php7.4 php-common php7.4 php7.4-cli php7.4-common php7.4-json php7.4-mysql php7.4-opcache php7.4-readline
...
Creating config file /etc/php/7.4/apache2/php.ini with new version
Module mpm_event disabled.
Enabling module mpm_prefork.
apache2_switch_mpm Switch to prefork
apache2_invoke: Enable module php7.4
...

その他、WordPressで必要となる以下のモジュールもインストールしておきましょう。php-gdは、必須モジュールです。その他は、プラグインで使用されることがあります。

# apt install php-gd php-mbstring
# apt install php-zip
# apt install php-curl
# apt install php-dom
# apt install php-imagick

PHPの設定を行う!

以下のように、PHPのタイムゾーンおよび日本語に関する設定を行います。

# vi /etc/php/7.4/apache2/php.ini
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 0
mbstring.strict_detection = Off

Apacheを再起動する!

追加したモジュールを有効化するため、Apacheを再起動します。

# systemctl restart apache2

PHPの動作確認を行う!

PHPの動作確認を行います。以下のように「phpcheck.php」のファイルを作成します。

# cd /var/www/html
# vi phpcheck.php
<?php
    phpinfo();
?>
# chmod 755 phpcheck.php 
root@118-27-109-28:/var/www/html# ls -l
total 16
-rw-r--r-- 1 root root 10918 Jan 17 22:25 index.html
-rwxr-xr-x 1 root root    24 Jan 17 23:13 phpcheck.php

http://<サーバのIPアドレス>/phpcheck.phpでアクセスして、PHPの設定情報が出力されれば、インストール成功です。

HTTPSを使用する!(Let's Encript)

HTTPSを使用できるように、Let's Encriptをaptコマンドでインストールできます。

# apt install certbot python3-certbot-apache

ApacheでSSL通信が可能になるように、SSLの機能を有効化します。HTTPをHTTPSにリダイレクトするため、URLリライトの機能も有効にします。

# a2ensite default-ssl
Enabling site default-ssl.
To activate the new configuration, you need to run:
  systemctl reload apache2
# a2enmod ssl 
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2
# a2enmod rewrite 
Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl restart apache2

今回は、Let's Encriptで稼働中のサーバの移行であったため、サーバ証明書を移行します。「/etc/letsencrypt」配下の資源をすべて、tarコマンド等でアーカイブして、そのまま移行します。その他、CA局の証明書は、「/etc/apache2/ssl.crt」ディレクトリを作成して別途移行します。

「/etc/apache2/sites-available」ディレクトリの「default-ssl.conf」の設定を変更します。当サイトでは、以下のように設定しています。

SSLCertificateFile /etc/letsencrypt/live/lab4ict.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/lab4ict.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/lab4ict.com/chain.pem
SSLCACertificateFile /etc/apache2/ssl.crt/ca-lab4ict.pem

その他、DocumentRootや、Aliasの設定をサイトの構成に合わせて行います。

DocumentRoot /var/www/html/wordpress
...

サーバ証明書の自動更新のため、サーバ証明書を自動更新するコマンドが正常終了するか確認します。

# certbot renew --pre-hook "sudo systemctl stop apache2" --post-hook "sudo systemctl start apache2"

サーバ証明書を自動更新するため、上記で確認したコマンドをcronに登録します。以下は、週1回、月曜日の朝1:00に実行する例になります。

# crontab -e
0 1 * * 1 certbot renew --pre-hook "sudo systemctl stop apache2" --post-hook "sudo systemctl start apache2"

HTTPをHTTPSにリダイレクトする設定を行います。

# vi /etc/apache2/sites-available/000-default.conf 
...
#       DocumentRoot /var/www/html
        DocumentRoot /var/www/html/wordpress
...
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

「.htaccess」を有効化します。

# vi /etc/apache2/apache2.conf
...
<Directory /var/www/>
        Options Indexes FollowSymLinks
#       AllowOverride None
        AllowOverride All
        Require all granted
</Directory>
...

設定が一通り終わったところで、Apacheを再起動してサイトアクセスしてみましょう。

# systemctl restart apache2

Postfixをインストールする!

Postfixをaptコマンドで、インストールします。設定方法をきかれますが、あとで手動で設定するため、No Configurationを選択します。

# apt install postfix

以下、基本的な設定を行います。

# cd /etc/postfix
# cp main.cf.proto main.cf
# vi main.cf
〜以下をコメントアウトする!〜
#sendmail_path =
#newaliases_path =
#mailq_path =
#setgid_group =
#html_directory =
#manpage_directory =
#sample_directory =
#readme_directory =
〜以下を追加する!〜
mail_owner = postfix
myhostname = mx.lab4ict.com
mydomain = lab4ict.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
alias_maps = hash:/etc/aliases
setgid_group = postdrop

newaliasコマンドを実行して、postfixを再起動します。

# newaliases
# systemctl restart postfix 

mailコマンドを使用できるようにするため、「mailutils」をインストールします。

# apt install mailutils

mailコマンドで自サーバのアカウントにメールを送信できるか確認します。

# mail root@lab4ict.com
Cc: 
Subject: TEST
TEST
<ctrl-d>

メールが受信できれば、OKです。

# mail
"/var/mail/root": 1 message 1 new
>N   1 root               Sun Jan 24 19:33  13/415   TEST
? q
Saved 1 message in /root/mbox
Held 0 messages in /var/mail/root

WordPressをインストールする!

WordPressをインストールします。

WordPressをインストールする!

WordPressをダウンロードし、展開します。以下では、展開したwordpressディレクトリを「system」にリネームしています。サイトに合わせて変更します。

# cd /tmp
# wget http://wordpress.org/latest.tar.gz
# cd /var/www/html
# tar -xzvf /tmp/latest.tar.gz
# touch /var/www/html/wordpress/.htaccess
# chown -R www-data:www-data wordpress

WordPress用のDBを作成する!

WordPress用のDBを作成します。

# mysql -u root -p
CREATE DATABASE db01;
GRANT ALL PRIVILEGES ON db01.* TO "db01admin"@"localhost" IDENTIFIED BY "password";
FLUSH PRIVILEGES;
EXIT

DocumentRootを調整する!

URLを調整するために、必要な場合DocumentRootを変更します。

# cd /etc/apache2/sites-available
# vi 000-default.conf
...
#       DocumentRoot /var/www/html
        DocumentRoot /var/www/html/wordpress
...

SSL化が完了している場合は以下のファイルを編集して、必要な場合DocumentRootを変更します。

# cd /etc/apache2/sites-available
# vi default-ssl.conf
...
        DocumentRoot /var/www/html
	Alias /wordpress /var/www/html/wordpress
...

Apacheを再起動します。

# systemctl restart apache2

WordPressの初期設定を行う!

WordPressの初期設定を開始します。HTTPの場合は、以下のURLにアクセスします。

http://lab4ict.com/wordpress/wp-admin/install.php

SSL化が完了してる場合は、以下のURLにアクセスします。

https://lab4ict.com/wordpress/wp-admin/install.php

最初に言語(日本語)を選択して、セットアップを開始します。DB接続情報として、事前に決めておいた以下等の値を設定します。

データベース名 db01
データベースのユーザー名 db01admin
データベースのパスワード **********
データベースホスト localhost
データベースの接頭辞 wp_

サイトの情報として、以下を設定します。

サイトのタイトル LAB4ICT
サイトのユーザー名 wpsusr001
サイトのユーザーのパスワード **********
サイトのメールアドレス lab4ict@gmail.com

作成したユーザで、WordPressにログインします。

".htaccess"にパーマリンクを使用するための設定が追加されたか確認します。

# cat /var/www/html/wordpress/.htaccess

SSHによるrootでのログインを不可にする!

OpenSSHの設定ファイルを変更して、rootでのログインを不可に設定します。

# vi /etc/ssh/sshd_config
...
#PermitRootLogin yes
PermitRootLogin no
...

OpenSSHを再起動します。

# systemctl restart sshd

SSHでrootでログイン不可であることを確認します。

# root@vmswps11
root@vmswps11's password: 
Permission denied, please try again.

おわりに

OSインストール後の状態からWordPressのインストールを行い、Webブラウザからサイトアクセスができるようになりました。

関連記事