Ubuntu Server 20.04 LAMP環境インストールメモ

Linux
Linux
スポンサーリンク

Ubuntu(ウブントゥ)は、Debian をベースに開発されている Linuxディストリビューションのひとつです。Ubuntu ではデスクトップ版とサーバー版が別々に提供されているのが特徴です。Ubuntu といえばデスクトップ版のイメージがありますが、サーバー版の Ubuntu Server も Webサイト向けの Linuxディストリビューションとして圧倒的なシェアを誇っています。また Ubuntu Server は、利用可能なソフトウェアパッケージが多く比較的バージョンが新しいのが魅力です。そこで今回は、Ubuntu Server 20.04 で LAMP環境(Apache2.4/MySQL8/PHP7.4)をインストールする手順をまとめてみました。

マシン構成

Ubuntu 20.04 Server の推奨システム要件は次の通りです。比較的低スペックなサーバーや古いパソコンでもインストールすることができますね。

  • CPU:1GHz以上
  • RAM:1GB以上
  • ディスク:2.5GB以上

参考資料:Installation | Server documentation | Ubuntu

今回は以下の構成の VirtualBoxの仮想マシン に Ubuntu 20.04 Server をインストールします。

○仮想マシン構成
CPU:2コア
メモリ:2048MB
HDD:20GB

○ネットワークデバイス
アダプター1:NAT
アダプター2:ホストオンリーアダプター

○ネットワーク構成(※ご自分の環境に書き換えてください)
ホスト名: ubuntu2004
ネットワークアドレス:192.168.56.0/24
IPアドレス:192.168.56.10
DNSサーバ: 8.8.8.8, 1.1.1.1

Ubuntu Server 20.04 LTS のインストール

Ubuntu のダウンロードページ から Ubuntu Server 20.04 LTS(Long Term Support = 長期サポート版の略称です)をダウンロードします。

Ubuntuのダウンロードページ

インストール先の VirtualBoxの仮想マシンの「設定」→「ストレージ」を選択し、「コントローラ: IDE」にダウンロードした Ubuntu Server の ISOイメージファイルを追加して仮想マシンを起動します。

VirtualBoxの仮想マシンのストレージ設定画面

Ubuntu Server のインストーラーが起動したら言語を選択します。インストーラーは日本語に対応していませんので「English」を選択してエンターキーを押します。

以下のような画面が表示されたら(表示されない場合もあります)「Update to the new installer」を選択してエンターキーを押します。矢印キーもしくはタブキー(シフト+タブキーで逆に移動できます)で項目を移動できます。

キーボードの設定です。項目を「Layout」に移動して「Japanese」を選択します。選択したら「Done」に移動してエンターキーを押します。

ネットワークの設定です。「enp0s3」がアダプター1(NAT)、「enp0s8」がアダプター2(ホストオンリーアダプター)です。「enp0s3」は自動でIPアドレスが割り当てられますのでそのままでOKです。「enp0s8」には手動で固定IPアドレスを設定しますので、「enp0s8」に移動してエンターキーを押し、「Edit IPv4」を選択してエンターキーを押します。

IPv4 Method「Manual」を選択し、Subnet にネットワークアドレス(サブネットマスクではありません)、Address にホストオンリーアダプターに設定する IPアドレスを入力します。Name servers には DNSサーバのIPアドレス(複数の場合はカンマ「,」区切り)を入力し「Save」に移動してエンターキーを押します。(Gatewayは設定しないでください。アダプター1を使ったインターネット通信ができなくなります)

設定したIPアドレスが表示されていることを確認し「Done」に移動してエンターキーを押します。

プロキシーサーバーの設定です。必要がなければそのままエンターキーを押します。

パッケージなどのダウンロード元となるミラーサーバーの設定です。自動で近くのミラーサーバーが設定されますので、そのままエンターキーを押します。

HDDなどのストレージの設定です。必要に応じて暗号化やパーテーションを手動で設定できます。今回はそのままの設定で構いませんので「Done」に移動してエンターキーを押します。

ストレージの設定の確認画面です。内容を確認して問題がなければそのままエンターキーを押します。

「ストレージのデータが消えるけど大丈夫?」の旨が表示されます。問題がなければ「Continue」に移動してエンターキーを押します。

ユーザーアカウントとホスト名の設定です。「Your server's name」がホスト名、「Pick a username」がユーザー名です。ユーザー名は admin や adm などありがちな名前は設定できないようになっています。

SSHの設定です。スペースキーを押して「Install OpenSSH server」にチェックを入れ、「Done」に移動してエンターキーを押します。

インストールするパッケージの選択です。今回はなにも選択せずそのまま「Done」に移動してエンターキーを押します。

インストールが開始しますのでしばし待ちます。

インストールが終わると下のような画面になります。「Reboot」に移動してエンターキーを押して再起動します。

再起動できない場合は、一度 VirtualBoxの仮想マシンの電源を一度オフにして、仮想マシンに追加した ISOイメージファイルを削除してから仮想マシンを起動します。

以下の画面が表示されていれば起動完了です。

SSHでログインできることを確認してください。

ssh uadmin@192.168.56.10

これから Ubuntu Server の各種設定やミドルウェアのインストールを行うのですが、ほとんどの操作は root 権限が必要になるためコマンドの先頭に sudo を付ける必要があります。

そのため、以下のコマンドで root になって作業を進めます。いちいち sudo を打ち込まなくてよくなるので楽なのですが、ログにコマンド履歴が残らないとういデメリットもあります。サーバーの運用が始まったら sudo を使うことをオススメします。

sudo -s

パッケージのアップデート

インストール済みのパッケージを、最新版にアップデートします。

apt -y update
apt -y upgrade

アップデートが終わったらOSを再起動します。

shutdown -r now

ufw(ファイアウォール)設定

初期状態では ufw(ファイアウォール)が無効になっていますので、許可するポートを設定してから有効にします。

ufw status
Status: inactive ←無効

SSH(22)と WEBアクセス(80 と 443)ポートを許可します。

ufw allow 22
ufw allow 80
ufw allow 443

ufw を有効化します。「SSH接続ができなくなるかもよ!」と聞いてくれます。SSH(22)ポートは許可していますので「y」を入力してください。

ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

ufw が有効になっていることを確認します。

ufw status
Status: active ←有効

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                  
80                         ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
22 (v6)                    ALLOW       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)  

日時設定(timesyncd)

タイムゾーンを日本に変更します。

timedatectl set-timezone Asia/Tokyo

参照する NTPサーバーを指定します。複数設定する場合は半角スペース区切りで指定します。
vi /etc/systemd/timesyncd.conf

#NTP=
 ↓
NTP=ntp.nict.jp 0.jp.pool.ntp.org 1.jp.pool.ntp.org 2.jp.pool.ntp.org 3.jp.pool.ntp.org

timesyncd を再起動します。

systemctl restart systemd-timesyncd

NTPサーバーと同期していることを確認します。

timedatectl status
(略)   
System clock synchronized: yes ←同期OK           
              NTP service: active                     
          RTC in local TZ: no   

メール送信設定(Gmail経由)

サーバーから Gmail 経由でメールを送信できるように設定します。(必要がなければこの設定は不要です)

Gmail 経由でメールを送信するには、Google アカウントの設定で「安全性の低いアプリ」を許可する必要があります。そのため通常利用している Google アカウントではなく、メール送信用に Google アカウントを新たに取得して複雑なパスワードを設定しておくことをオススメします。

参考資料:安全性の低いアプリと Google アカウント - Google アカウント ヘルプ

Postfix のインストール

メールサーバーの Postfix をインストールします。

apt -y install postfix

Postfix をどのように構成するか聞かれます。初期値の「Internet Site」で構いませんので、そのままエンターキーを押します。

送信元に表示されるメールアドレスのドメイン名の設定です。そのままエンターキーを押します。(本来はメッセージの通り FQDNである必要がありますが、Gmail を経由する場合は送信元メールアドレスが Gmail のメールアドレスに書き換えられますのでそのままで構いません)

以上で Postfix のインストールが開始します。

Postfix の設定

Postfix のインストールが終わったら Gmail(すなわち Google アカウント)の認証情報ファイルを以下の形式で作成します。
vi /etc/postfix/gmail

[smtp.gmail.com]:587 <Gmailのアドレス>:<Gmailのパスワード>

パスワードを書いているので、パーミッションを変更(root のみアクセス可)

chmod 600 /etc/postfix/gmail

PostfixのDBファイルを生成

postmap /etc/postfix/gmail

Postfix の設定ファイルを編集します。
vi /etc/postfix/main.cf

relayhost =
 ↓
relayhost = [smtp.gmail.com]:587
 
inet_interfaces = all
 ↓
inet_interfaces = loopback-only
 
#(↓以下を最終行に追加)
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes

Postfix を再起動します。

systemctl restart postfix

メール送信確認

mail コマンドをインストールします。

apt -y install mailutils

以下のコマンドでメールが送信できることを確認します。

echo test | mail -s 'test mail' <送信先のメールアドレス>

各種ミドルウェアのインストール

※バージョンは2020年7月22日時点のものです。

Apache(2.4.41)

apt -y install apache2

PHP(7.4.3)

apt -y install php-fpm
apt -y install php-dev
apt -y install php-mysql
apt -y install php-mbstring
apt -y install php-gd
apt -y install php-curl
apt -y install php-intl
apt -y install php-zip

【補足】
PHP は「apt install php」でインストールすると Apache モジュール版の PHP がインストールされます。その場合、Apache の MPM(動作モードのようなものです)が event から prefork に変更されます。(モジュール版の PHP ではセキュリティ上の理由から prefork 以外は使えません)しかし、prefork では HTTP/2(効率的にWeb通信を行うためのプロトコル)を使えないため、Apache の MPM を event のままで使える php-fpm をインストールしています。

MySQL(8.0.20)

apt -y install mysql-server

Apache の設定

Ubuntu での Apache の設定は Debian から引き継いだ独特の作法があります。はじめて Ubuntu を扱う方は公式ドキュメントを確認しておきましょう。

参考資料:Web Servers - Apache | Server documentation | Ubuntu

セキュリティ関連設定

GCIを使わない場合は、GCI設定を無効にします。

a2disconf serve-cgi-bin

ファイルの一覧を表示しないように Indexes オプションを外しておきます。
vi /etc/apache2/apache2.conf

<Directory /var/www/>
        Options Indexes FollowSymLinks
          ↓
        Options FollowSymLinks

UTF-8 以外の文字エンコーディングを使わない場合は、AddDefaultCharset ディレクティブで UTF-8 を指定することをオススメします。
vi /etc/apache2/conf-available/charset.conf

#AddDefaultCharset UTF-8
 ↓
AddDefaultCharset UTF-8

その他のセキュリティ設定を行います。
vi /etc/apache2/conf-available/security.conf

ServerTokens OS
 ↓
ServerTokens Prod
 
ServerSignature On
 ↓
ServerSignature Off
 
#Header set X-Content-Type-Options: "nosniff"
 ↓
Header set X-Content-Type-Options: "nosniff"
 
#(↓以下を追加)クロスサイトスクリプティング(XSS)対策
Header set X-XSS-Protection "1; mode=block"

ブラウザキャッシュ設定

ブラウザキャッシュの設定ファイルを作成します。キャッシュさせるファイルの種類や期限はコンテンツの内容に合わせて設定してください。
vi /etc/apache2/mods-available/expires.conf

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 seconds"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType image/svg+xml "access plus 1 year"
    #ExpiresByType text/css "access plus 1 year"
    #ExpiresByType text/js "access plus 1 year"
    #ExpiresByType text/javascript "access plus 1 year"
</IfModule>

SSL/TLS設定

SSL/TLS関連の設定です。
vi /etc/apache2/mods-available/ssl.conf

    SSLSessionCache         shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
    SSLSessionCacheTimeout  300
         ↓
    SSLSessionCache         shmcb:${APACHE_RUN_DIR}/ssl_scache(1024000)
    SSLSessionCacheTimeout  3600
        
    SSLCipherSuite HIGH:!aNULL
         ↓
SSLCipherSuite "ECDHE-ECDSA-AES128-GCM-SHA256 \
ECDHE-ECDSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-AES128-SHA \
ECDHE-ECDSA-AES256-SHA \
ECDHE-ECDSA-AES128-SHA256 \
ECDHE-ECDSA-AES256-SHA384 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-RSA-AES128-SHA \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES128-SHA256 \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES128-GCM-SHA256 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES128-SHA \
DHE-RSA-AES256-SHA \
DHE-RSA-AES128-SHA256 \
DHE-RSA-AES256-SHA256 \
EDH-RSA-DES-CBC3-SHA"

    #SSLHonorCipherOrder on
         ↓        
    SSLHonorCipherOrder on
        
    SSLProtocol all -SSLv3
         ↓
    SSLProtocol -all +TLSv1.2 +TLSv1.3
         
    #(↓以下を追加)
    SSLCompression off
    SSLUseStapling On
    SSLStaplingReturnResponderErrors off
    SSLStaplingCache shmcb:/run/httpd/stapling_cache(128000)
    #(↑追加ここまで)
</IfModule>

SSL/TLS設定の詳細は以下の記事にまとめました。よければご参照ください。

関連記事:安全な SSL/TLS 設定にするための10のポイント(Apache httpd 2.4)

バーチャルホスト設定

バーチャルホストの設定です。サーバー証明書は、自動で生成される自己署名の証明書 ssl-cert-snakeoil.pem を使っていますが、実際に Webサイトを公開する場合は Let's Encrypt など正規の認証局が発行したサーバー証明書を使いましょう。

関連記事:Let's Encrypt サーバー証明書の取得と自動更新設定メモ

デフォルトのバーチャルホストを無効にします。

a2dissite 000-default

バーチャルホストの設定ファイルを作成します。ServerName に指定するドメイン名は、ご自分が所有しているドメインに書き換えてください。
vi /etc/apache2/sites-available/www.example.com.conf

<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>

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

    <Directory "/var/www/html">
        Options FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

   SSLEngine on
   Header always set Strict-Transport-Security "max-age=31536000"
   SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
   SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
   #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt

    SetEnvIf Request_URI "\.(gif|jpg|png|css|js)$" nolog
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined env=!nolog
</VirtualHost>

作成したバーチャルホストを有効化します。

a2ensite www.example.com

モジュールの有効化と Apache の再起動

必要なモジュールを有効化します。

a2enmod headers
a2enmod expires
a2enmod ssl
a2enmod http2
a2enmod proxy_fcgi setenvif
a2enconf php7.4-fpm

Apache を再起動します。

systemctl restart apache2

動作確認

確認用の PHP ファイルを作成します。
vi /var/www/html/test.php

<?php
phpinfo();

Webブラウザで確認用の PHP ファイルが実行されていることを確認します。
http://www.example.com/test.php

【補足】
自己署名のサーバー証明書の場合は警告が表示され、接続できない場合があります。FireFox で「危険性を承知で続行」ボタンを押して接続するか、Google Chrome の場合は「thisisunsafe」とタイプすると接続できます。

確認がおわったら PHP ファイルは削除しておきましょう。

rm /var/www/html/test.php

PHP の設定

PHP の設定です。
vi /etc/php/7.4/fpm/php.ini

expose_php = On
 ↓
expose_php = Off
 
;date.timezone =
 ↓
date.timezone = 'Asia/Tokyo'
 
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
 ↓
error_reporting = E_ALL & ~E_NOTICE

設定が終わったら php-fpm を再起動します。

systemctl restart php7.4-fpm

MySQL の設定

MySQL の設定です。
vi /etc/mysql/mysql.conf.d/mysqld.cnf

#(↓以下を最終行に追加)
log_timestamps=SYSTEM
default_authentication_plugin=mysql_native_password

(設定の詳細)
log_timestamps=SYSTEM
 標準では MySQLのログの出力時間が UTC になるため、サーバーのタイムゾーンと同じになるように設定します。

default_authentication_plugin=mysql_native_password
 MySQL 8.0 からデフォルトの認証プラグインが「caching_sha2_password」になりました。しかし、現状ではほとんどのWebアプリケーション(WordPressやZabbixなど)が caching_sha2_password に対応していないため、従来の認証プラグイン「mysql_native_password」に変更します。

設定が終わったら mysql を再起動します。

systemctl restart mysql

mysql_secure_installation の実行

初期状態では、rootユーザーがパスワードなしで MySQLに接続できるようになっていますのでパスワードを設定しておきましょう。

mysql_secure_installation --use-default
 
(略)
Please set the password for root here.
 
New password: <新しいパスワード>
 
Re-enter new password: <新しいパスワード>
(略)
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
(不要なユーザーやDBを削除)
All done!

おわりに

はじめて Ubuntu を使ってみたのですが、Ubuntu ではインストールされていないコマンドを打つと、「次のコマンドでインストールできるよ」と教えてくれるのがとても便利です。Ubuntu はアフリカの言葉で「他者への思いやり」という意味があるそうです。こんな Ubuntu の設計思想が多くの人に使われている理由なのかもしれませんね。

mail
 
Command 'mail' not found, but can be installed with:
 
apt install mailutils

コメント

タイトルとURLをコピーしました