対象: Ubuntu 22.04 LTS(PHP 8.1 / MySQL 8.0 / Apache 2.4)
22.04 の標準サポートは 2027 年までです(公式のリリース一覧では June 2027)。新規に構築する場合は、24.04 以降も検討してください。

以下の例では、ドメインに example.com、ステージング環境に stage.example.com、作業ユーザーに ubuntu を使っています。環境に合わせて読み替えてください。

参考

LAMP 構築

1. 初期設定とアップグレード

apt の実行後に、サービスの再起動を確認するダイアログ(needrestart)が表示されます。構築中はこれを抑制します。

$ echo "\$nrconf{restart} = 'a';" | sudo tee -a /etc/needrestart/conf.d/99_restart.conf
$ echo "\$nrconf{kernelhints} = '0';" | sudo tee -a /etc/needrestart/conf.d/99_restart.conf

$ sudo apt update -y && sudo apt upgrade -y

# 抑制されていたサービスの再起動を実行
$ sudo needrestart -r a

[!WARNING] 99_restart.conf の設定(restart = 'a')は、以後の apt の実行のたびに、必要なサービスを自動で再起動します。本番環境では、構築が終わったら削除するか、再起動のタイミングを管理できる設定に戻してください。

設定ファイルを残したくない場合は、環境変数でも抑制できます。

$ sudo NEEDRESTART_MODE=a apt upgrade -y

2. MySQL 8.0

$ sudo apt install -y mysql-server mysql-client
$ sudo mysql_secure_installation

WordPress 用のデータベースとユーザーを作成します(<強いパスワード> は実際の値に置き換え、Git には記録しないでください)。

$ sudo mysql
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY '<強いパスワード>';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;

3. PHP

22.04 では、php パッケージで PHP 8.1 と libapache2-mod-php(および Apache)がインストールされます。

$ sudo apt install -y php

PHP の拡張モジュールは、WordPress のサーバー環境 の区分に従います。

  • required:インストール
  • highly recommended:インストール
  • recommended:インストール(キャッシュ系。キャッシュ系のプラグインを使う可能性が高いため)
# required(mysqli は php-mysql に含まれる)
$ sudo apt install -y php-mysql

# highly recommended(dom は php-xml に含まれる)
$ sudo apt install -y php-curl php-imagick php-intl php-mbstring php-zip php-xml php-igbinary

# recommended
$ sudo apt install -y php-apcu php-memcached php-redis

[!NOTE]

  • PHP 8.x では json は本体に組み込まれています。php-json は不要です。
  • opcachephp パッケージの依存関係でインストールされます(php -mZend OPcache を確認できます)。
  • インストール後は、php -m で拡張モジュールを確認してください。

4. Apache2

Apache2 は必ず必要です。

Apache は php パッケージの依存でインストールされますが、単独でインストールする場合は次のとおりです。

$ sudo apt install -y apache2

必要なモジュールを有効化

# 有効化済みモジュールを確認
$ sudo apachectl -M
$ sudo a2enmod ssl \
 && sudo a2enmod headers \
 && sudo a2enmod rewrite

WordPress インストール

配置

WordPress は /var/www/html/example.com/wp に配置します。

$ sudo apt install -y unzip
$ sudo mkdir -p /var/www/html/example.com

# 一時ディレクトリでダウンロード・展開
$ wget -q https://ja.wordpress.org/latest-ja.zip -P /tmp
$ unzip -q /tmp/latest-ja.zip -d /tmp
$ sudo mv /tmp/wordpress /var/www/html/example.com/wp
$ rm -f /tmp/latest-ja.zip

# 所有者とグループ
$ sudo chown -R ubuntu:www-data /var/www/html/example.com/wp

パーミッションの目安:

$ sudo find /var/www/html/example.com/wp -type d -exec chmod 755 {} \;
$ sudo find /var/www/html/example.com/wp -type f -exec chmod 644 {} \;
  • アップロードやプラグインの更新のために、wp-content などに Web サーバー(www-data)の書き込み権限が必要な場合は、そのディレクトリだけにグループの書き込み権限を付与してください。
  • wp-config.php は、他のユーザーが読めないように制限します(例: chmod 640)。

WP-CLI(任意)

$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
$ wp --info

apt を使わずに入れたバイナリなので、/usr/local/bin に配置します(/usr/bin, /usr/local/bin を参照)。wp は、root ではなく、WordPress の所有ユーザーで実行してください。

Apache2 の設定

ディレクトリの作成と所有者

$ sudo mkdir -p /var/www/html/example.com/wp
$ sudo chown -R ubuntu:www-data /var/www/html/example.com/wp

(前の手順で作成済みの場合は、不要です。)

[!NOTE] /etc/apache2/apache2.conf には、次の設定があります。

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

ルートディレクトリ以下は、既定で拒否されています。VirtualHost でドキュメントルートのアクセスを許可する必要があります。

VirtualHost

/etc/apache2/sites-available/example.com.conf

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html/example.com/wp

    <Directory /var/www/html/example.com/wp>
        AllowOverride All
        Options -Indexes +FollowSymLinks
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

[!NOTE] Apache 2.4 では、Require all granted を使います。Apache 2.2 の記法(Order allow,deny / Allow from all)を、同じブロックに併記しないでください。

サイトを有効化して、設定を反映します。

$ sudo a2ensite example.com.conf
$ sudo a2dissite 000-default.conf
$ sudo apachectl configtest
$ sudo systemctl reload apache2

固定 IP アドレス

サーバーに固定の IP アドレスを割り当てます。AWS の場合は、Elastic IP を関連付けます。

Basic 認証(ステージング環境)

stage.example.com を Google にインデックスさせないため、ドメインを設定して公開する前に Basic 認証を設定します。

[!WARNING] Basic 認証は、ID とパスワードが平文(Base64)で送られます。HTTPS を有効にしてからSSL を先に)使ってください。

パスワードファイルの作成

パスワードファイル(.htpasswd)は、ドキュメントルートのに置きます。手書きせず、htpasswd で作成します。

$ sudo apt install -y apache2-utils
$ sudo htpasswd -c /etc/apache2/.htpasswd-stage <ユーザー名>
$ sudo chown root:www-data /etc/apache2/.htpasswd-stage
$ sudo chmod 640 /etc/apache2/.htpasswd-stage

(2 人目以降を追加する場合は、-c を付けません。-c は上書き作成です。)

設定

/var/www/html/stage.example.com/wp/.htaccess

AuthType Basic
AuthName "Restricted"
AuthUserFile "/etc/apache2/.htpasswd-stage"
Require valid-user

.htaccess を使うには、VirtualHost で AllowOverride All(または AuthConfig)が必要です。

検索エンジンへのインデックスを避けるために、レスポンスヘッダー(headers モジュールが必要)も併用できます。

Header set X-Robots-Tag "noindex, nofollow"

SFTP サーバー

WordPress のファイルを転送するための SFTP の設定です。

[!IMPORTANT] SFTP(SSH File Transfer Protocol)は、OpenSSH(sshd)が提供します。 FTP や FTPS のサーバー(vsftpd など)とは別のものです。特別な理由がなければ、FTP は使わず SFTP にしてください。

SFTP は SSH(22 番ポート)を使います。なお、FTP のウェルノウンポートは、制御用が 21、データ転送用が 20 です。

FTP ユーザーを作成

adduser

$ sudo adduser ftp-example
  • ユーザー ftp-example を追加
  • グループ ftp-example を追加
  • ホームディレクトリを作成
  • パスワードの入力を求められる

[!NOTE] Ubuntu(や Debian)では、adduseruseradd の機能が異なります。
useradd は、ホームディレクトリなどを作成しません(-m が必要)。
deluseruserdel も同様です。

$ sudo userdel ユーザー名            # ユーザーを削除
$ sudo userdel -r ユーザー名         # ユーザーのホームディレクトリも削除
$ sudo deluser --remove-home ユーザー名   # 上と同じ(ホームディレクトリも削除)

パスワード変更

$ sudo passwd ftp-example

[!WARNING] SFTP 用のユーザーを sudo グループや adm グループに追加しないでください(root 権限や、ログの閲覧権限を与えることになります)。

メイングループを www-data に変更

Apache / PHP の実行ユーザー:グループを www-data:www-data と仮定します。

$ sudo usermod -g www-data ftp-example
# 確認
$ id ftp-example
uid=1002(ftp-example) gid=33(www-data) groups=33(www-data)

sshd の設定(chroot と SFTP 専用)

SFTP を、特定のディレクトリ以下に制限(chroot)し、シェルを使わせない設定にします。

/etc/ssh/sshd_config.d/10-sftp.conf

Match User ftp-example
    PasswordAuthentication yes
    ChrootDirectory /var/www/html/example.com
    ForceCommand internal-sftp -u 0002
    AllowTcpForwarding no
    X11Forwarding no
  • ChrootDirectory に指定するディレクトリ(と、パスの各ディレクトリ)は、root が所有し、他のユーザーが書き込めない必要があります(root:root、755)。ユーザーが書き込むのは、その下の wp などです。
  • -u 0002 は、作成されるファイルの umask です(グループ www-data に書き込み権限を付与)。
  • パスワード認証は、鍵認証のみの環境(PasswordAuthentication no)で、このユーザーだけに有効にする場合の設定です。鍵認証だけで足りるなら、PasswordAuthentication yes は不要です。

[!NOTE] クラウドのイメージ(AWS など)では、/etc/ssh/sshd_config.d/60-cloudimg-settings.conf などが PasswordAuthentication no を設定していることがあります。sshd は先に読んだ設定を優先するため、sshd_config の末尾に Match を追記しても効かない場合があります。sshd_config.d/ の、それらよりも先に読まれる名前10- など)のファイルに書いてください。

設定を検証してから、反映します(Ubuntu のサービス名は ssh です)。

$ sudo sshd -t
$ sudo sshd -T -C user=ftp-example,host=localhost,addr=127.0.0.1 | grep -iE "passwordauthentication|chrootdirectory|forcecommand"
$ sudo systemctl reload ssh

接続の確認:

$ sftp ftp-example@example.com

(参考)vsftpd で FTP サーバーを構築する場合

[!WARNING] FTP は通信が暗号化されません。使用する場合は、FTPS(TLS)を設定してください。

$ sudo apt install vsftpd

/etc/vsftpd.conf(コメントは行頭に # で書きます。行末にコメントを書くと、値の一部になりエラーになります)

FTP の接続を、ホームディレクトリ以下に制限します。/etc/vsftpd.chroot_list を作成し、制限を受けないユーザーを記載します。

chroot_local_user=YES
# chroot_list_file を有効化
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd.chroot_list

ホームディレクトリに書き込み権限があると、refusing to run with writable root inside chroot になります。その場合は、allow_writeable_chroot=YES を追加するか、ホームディレクトリを書き込み不可にして、その下に書き込み可能なディレクトリを作ります。

SSL

Ref.

  • Lets Encrypt で SSL 化
  • https://certbot.eff.org/instructions?ws=apache&os=snap
  • https://snapcraft.io/docs/installing-snap-on-ubuntu

事前準備

  • DNS で、ドメインがサーバーの IP アドレスを指している
  • 80 番・443 番ポートが開いている(セキュリティグループ、ファイアウォール)
  • VirtualHost に ServerName が設定されている

snapd をインストール

Ubuntu 22.04 では、snapd は通常、初期状態でインストールされています。

$ sudo apt update
$ sudo apt install snapd

ref. https://snapcraft.io/docs/installing-snap-on-ubuntu

(あれば)既存の certbot を削除

$ sudo apt-get remove certbot

certbot をインストール

$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

証明書を作成

$ sudo certbot --apache

自動更新の確認

$ sudo certbot renew --dry-run

CloudFront

CloudFront

Apache Reverse Proxy

Apache リバースプロキシー

HTTP

HTTP