22.04 LAMP / WordPress / SFTP 構築メモ | Ubuntu
対象: 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は不要です。opcacheはphpパッケージの依存関係でインストールされます(php -mでZend 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)では、
adduserとuseraddの機能が異なります。
useraddは、ホームディレクトリなどを作成しません(-mが必要)。
deluserとuserdelも同様です。
$ 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)を設定してください。
- 参照: vsftpd
$ 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