Tutorial

Linux、Apache、MySQL、PHP(LAMP)スタックをUbuntu 20.04にインストールする方法

UbuntuMySQLApachePHPLAMP StackUbuntu 20.04

はじめに

「LAMP」スタックとは、PHPで書かれた動的ウェブサイトやWebアプリをホストできるように、通常一緒にインストールされているオープンソースソフトウェアのグループです。この用語は、実際にはApache webサーバーが搭載されたLinuxオペレーティングシステムを表す頭字語です。このサイトデータはMySQLデータベースに保存されており、動的コンテンツはPHPが処理を行います。

このガイドでは、Ubuntu 20.04サーバーにLAMPスタックをインストールします。

必要条件

このチュートリアルを完了するには、非 root sudo対応のユーザーアカウントと基本的なファイアウォールを備えたUbuntu 20.04サーバーが必要です。これは、Ubuntu 20.04の初期サーバー設定ガイドを使用して設定できます。

ステップ1 — Apacheをインストールし、ファイアウォールを更新する

Apache Webサーバーは、世界で最も人気のあるWebサーバーの1つです。よく文書化されていて、ユーザーのアクティブなコミュニティがあり、Webの歴史で長らく広く使用されているため、Webサイトをホスティングするうえで素晴らしいデフォルトの選択肢となっています。

Ubuntuのパッケージマネージャー、aptを使用してApacheをインストールする

  • sudo apt update
  • sudo apt install apache2

このセッション内でsudoを使用しているのはこれが初めての場合、aptを使用してシステムパッケージを管理する権限があることを確認するために、ユーザーのパスワードを入力するよう画面が表示されます。Yを押してから、ENTERを押すと、Apacheのインストールを確認するよう画面が表示されます。

インストールが完了すると、HTTPトラフィックを許可するために、ファイアウォール設定を調整する必要があります。UFWには、ファイアウォール設定に利用できるさまざまなアプリケーションプロファイルがあります。現在利用可能なUFWアプリケーションプロファイルを一覧表示するには、次のことを行います。

  • sudo ufw app list

出力は次のようになります。

Output
Available applications: Apache Apache Full Apache Secure OpenSSH

これらのプロファイルがそれぞれ意味する内容は次のとおりです。

  • Apache: このプロファイルは、ポート80(通常、暗号化されていないWebトラフィック)のみを開きます。
  • Apache Full: このプロファイルは、ポート80(通常、暗号化されていないWebトラフィック)とポート443(TLS/SSL暗号化トラフィック)の両方を開きます。
  • Apache Secure: このプロファイルは、ポート443 (TLS/SSL暗号化トラフィック)のみを開きます。

今のところ、Apacheをインストールしたばかりで、お使いのサーバーのHTTPSトラフィックを許可するように設定されたTLS/SSL証明書がまだないため、ポート80での接続のみを許可することが最善となります。

ポート80でのトラフィックのみを許可するには、Apacheプロファイルを使用します。

  • sudo ufw allow in "Apache"

次を使用して変更を確認することができます。

  • sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)

ポート80へのトラフィックは、ファイアウォールを通じて許可されています。

WebブラウザでサーバーのパブリックIPアドレスにアクセスして、すべてが計画通りに進んだかどうかをすぐに確認することができます(パブリックIPアドレスの情報がない場合は、次の見出しにある注釈を参照してください)。

http://your_server_ip

情報およびテスト目的のために存在する、デフォルトのUbuntu 20.04 Apache Webページが表示されます。このように表示されるはずです。

Ubuntu 20.04 Apache default

このページが表示されたら、Webサーバーがファイアウォールを介して正しくインストールされ、アクセス可能になっています。

サーバーのパブリックIPアドレスを検索する方法

サーバーのパブリックIPアドレスが分からない場合、検索する方法は数多くあります。通常は、SSHを通じてお使いのサーバーへの接続に使用するアドレスとなります。

コマンドラインから行うという別の方法もいくつかあります。まず、IPアドレスを取得するためにiproute2ツールを使用して、次のように入力してください。

  • ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

これにより、2、3行が返されます。これらはすべて正しいアドレスですが、お使いのコンピュータでは1つしか使えない場合があります。どれでも1つを試してみましょう。

別の方法としては、curl ユーティリティを使用して外部の第三者に連絡し、サーバー**がどのように表示されているかを教えてもらう方法があります。特定のサーバーにお使いのIPアドレスが何かを尋ねて行います。

  • curl http://icanhazip.com

IPアドレスを取得するために使用するメソッドに関係なくデフォルトのApache ページを表示するには、Webブラウザのアドレスバーにお使いのIPアドレスを入力します。

ステップ2 — MySQLをインストールする

Webサーバーを起動し実行したので、サイトのデータを保存および管理できるようにデータベースシステムをインストールする必要があります。MySQLはPHP環境で使用されている人気のデータベース管理システムです。

もう一度、aptを使用してこのソフトウェアを取得およびインストールします。

  • sudo apt install mysql-server

画面が表示されたら、Yを入力してからENTERキーを押して、インストールを確認します。

インストールが完了したら、MySQLがプリインストールされたセキュリティスクリプトを実行することをお勧めします。このスクリプトは、セキュリティに懸念のあるデフォルト設定の一部を削除し、データベースシステムへのアクセスをロックします。次を実行してインタラクティブスクリプトを起動します。

  • sudo mysql_secure_installation

これにより、``VALIDATE PASSWORD PLUGIN

注: この機能を有効にするかどうかは、判断する余地があります。有効にすると、指定した条件に一致しないパスワードはエラーとしてMySQLによって拒否されます。検証機能を無効にすれば安全ですが、データベース資格情報に常に強力でユニークなパスワードを使用する必要があります

「はい」の場合はYと回答し、有効化せずに続行する場合は他の回答にしてください。

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:

「はい」に答えると、パスワード検証のレベルを選択するよう画面が表示されます。最強レベルに2を入力すると、数字、大文字、小文字、特殊文字を含まないパスワードや、一般的な辞書に出てくる単語をベースにしたパスワードを設定しようとするとエラーになることに注意してください。

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

VALIDATE PASSWORD PLUGINこれはシステムrootと混同されません。データベースrootユーザーは、データベースシステム上の権限を持つ管理ユーザーです。MySQL rootユーザーのデフォルト認証方法はパスワードを使用しませんが、1つが設定されている場合でも、追加の安全対策としてここで強力なパスワードを定義する必要があります。この点については後でお話します。

パスワード検証を有効にした場合は、入力したrootパスワードのパスワード強度が表示されます。お使いのサーバーからそのパスワードで続行するかどうか尋ねられます。現在のパスワードでよければ、画面の表示でYと入力します。

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

残りの質問については、画面の表示が現れるたびにYを押してからENTERキーを押します。これにより、一部の匿名ユーザーとテストデータベースを削除し、リモートrootログインを無効にし、MySQLが行なった変更をすぐに反映できるようにこれらの新しいルールをロードします。

完了したら、次を入力してMySQLコンソールにログインできるかどうかをテストします。

  • sudo mysql

これにより、管理データベースユーザーrootとしてMySQLサーバーに接続することができます。このコマンドを実行する際にsudoを使用することで推測されます。出力は次のようになります。

Output
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 22 Server version: 8.0.19-0ubuntu5 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

MySQLコンソールを終了するには、次のように入力します。

  • exit

mysql_secure_installationスクリプトを実行する際にパスワードを定義しているにもかかわらず、rootユーザーとして接続するためにパスワードを指定する必要がないことに注意してください。これは、管理者MySQLユーザーのデフォルトの認証方法が、passwordではなくunixsocketであるためです。これはセキュリティ上の問題のように見えるかもしれませんが、MySQLのrootユーザーとしてログインできるのは、sudo権限を持つシステムユーザーのみであり、コンソールから接続するか、同じ権限を持つアプリケーションを介して接続することができるため、データベースサーバーをより安全なものにしています。実用的な意味では、管理データベースのrootユーザーを使用してPHPアプリケーションから接続することができないということになります。root MySQLアカウントにパスワードを設定することは、デフォルトの認証方法が`unixsocketからpasswordに変更された場合のセーフガードとして機能します。`

セキュリティを強化するためには、特にサーバー上に複数のデータベースをホストしている場合は、データベースごとに拡張性の低い専用のユーザーアカウントを設定しておくとよいでしょう。

注:執筆時点では、ネイティブのMySQL PHPライブラリmysqlndは、MySQL 8のデフォルトの認証方法であるcaching_sha2_authenticationサポートしていません。そのため、MySQL 8でPHPアプリケーションのデータベースユーザーを作成する際には、代わりにmysql_native_passwordを使用するように設定されていることを確認する必要があります。ステップ6でその方法について説明します。

これで MySQL サーバーがインストールされ、セキュリティが確保されました。次に、LAMPスタックの最終コンポーネントであるPHPをインストールします。

ステップ3 — PHPのインストール

コンテンツを提供するためにApacheがインストールされ、データを保存・管理するためにMySQLがインストールされています。PHPは、最終的なユーザーにダイナミックコンテンツを表示するコードを処理する設定のコンポーネントです。 phpパッケージに加えて、PHPがMySQLベースのデータベースと通信できるようにするPHPモジュールのphp-mysqlが必要になります。また、ApacheがPHPファイルを処理できるようにするために、libapache2-mod-phpが必要です。コアとなるPHPパッケージは依存関係として自動的にインストールされます。

これらのパッケージをインストールするには、次を実行します。

  • sudo apt install php libapache2-mod-php php-mysql

インストールが完了したら、PHPのバージョンを確認するために、次のコマンドを実行できます。

  • php -v
Output
PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

この時点で、LAMPスタックは完全に操作されていますが、PHPスクリプトを使用して設定をテストする前に、Webサイトのファイルとフォルダを保持するために適切なApache Virtual Hostを設定しておくとよいでしょう。次のステップでその設定を行います。

ステップ4 — Webサイトのバーチャルホストを作成

Apache Webサーバーを使用している場合、バーチャルホスト (Nginx のサーバブロックに似ています) を作成して設定の詳細をカプセル化し、単一のサーバーから複数のドメインをホストすることができます。このガイドでは、your_domainというドメインを設定しますが、このドメイン名を自分のドメイン名に置き換える必要があります。

:DNSホスティングプロバイダーとしてDigitalOceanを使用している場合、新しいドメイン名を設定してサーバーに指定する方法の詳細については、製品ドキュメントを参照してください。

Ubuntu 20.04上のApacheには、/var/www/htmlディレクトリからドキュメントを提供するように設定されているデフォルトで有効になっている1つのサーバーブロックがあります。これは単一のサイトに適していますが、複数のサイトをホストしている場合、扱いにくくなる可能性があります。var/www/htmlを変更する代わりに、クライアントのリクエストが他のサイトと一致しない場合に提供されるデフォルトのディレクトリとして/var/www/htmlをそのままにして、your_domainサイトの/var/www内のディレクトリ構造を作成します。

your_domainのディレクトリを次のように作成します。

  • sudo mkdir /var/www/your_domain

次に、現在のシステムユーザーを参照する環境変数$USERでディレクトリの所有権を割り当てます。

  • sudo chown -R $USER:$USER /var/www/your_domain

それから、お好みのコマンドラインエディタを使ってApacheのsites-availableディレクトリに新しい設定ファイルを開きます。ここでは、nanoを使用します。

  • sudo nano /etc/apache2/sites-available/your_domain.conf

これにより、新しい空白ファイルを作成します。次のbare-bones 設定に貼り付けます。

/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80>
    ServerName your_domain
    ServerAlias www.your_domain
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

完了したら、ファイルを保存して閉じます。nanoを使用している場合、CTRL+XYENTERの順に押して同じことができます。

このVirtualHost設定により、Web rootディレクトリとして/var/www/your_domainを使用して、Apacheにyour_domainにサービスを提供するよう指示します。ドメイン名を使用せずにApacheをテストしたい場合は、各オプションの行の先頭に#文字を追加することで、ServerNameServerAliasのオプションを削除したりコメントアウトしたりすることができます。

これで、新しいバーチャルホストを有効にするために、a2ensiteを使用できます。

  • sudo a2ensite your_domain

Apacheと一緒にインストールされているデフォルトのWebサイトを無効にしたい場合があります。Apacheのデフォルト設定はバーチャルホストを上書きするため、カスタムドメイン名を使用していない場合にはこれは必要です。ApacheのデフォルトのWebサイトを無効にするには、次のように入力します。

  • sudo a2dissite 000-default

設定ファイルに構文エラーが含まれていないことを確認するには、次を実行します。

  • sudo apache2ctl configtest

最後に、Apacheをリロードすると、これらの変更が有効になります。

  • sudo systemctl reload apache2

新しいWebサイトはアクティブになりましたが、Web root /var/www/your_domainはまだ空です。その場所にindex.htmlファイルを作成し、バーチャルホストが予想通りに動作するかどうかテストできます。

  • nano /var/www/your_domain/index.html

このファイルに以下のコンテンツを含みます。

/var/www/your_domain/index.html
<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

ここでブラウザにアクセスして、もう一度サーバーのドメイン名またはIPアドレスにアクセスしてください。

http://server_domain_or_IP

以下のページが表示されます。

Apache virtual host test

このページが表示されたら、お使いのApacheバーチャルホストが期待通りに動作していることを意味します。

このファイルは、index.phpファイルを置き換えるために設定するまでの間、アプリケーションの一時的なランディングページとして残しておくことができます。設定したら、忘れずにindex.html ファイルをドキュメントrootから削除するか、名前を変更してください。デフォルトではindex.phpファイルよりも優先されます。

Apache上のDirectoryIndexに関する注記

ApacheでデフォルトのDirectoryIndex設定を使用すると、index.htmlという名前のファイルは常にindex.phpファイルよりも優先されます。これは、訪問者に有益なメッセージを含む一時的なindex.htmlファイルを作成することにより、PHPアプリケーションでメンテナンスページを設定するのに便利です。このページがindex.phpページに優先されるため、アプリケーションのランディングページになります。メンテナンスが終わったら、index.htmlは名前が変更されるか、ドキュメントrootから削除され、通常のアプリケーションページが元に戻ります。

この動作を変更する場合は、 /etc/apache2/mods-ableded/dir.confファイルを編集し、DirectoryIndexディレクティブ内でindex.phpファイルが表示されている順序を修正する必要があります。

  • sudo nano /etc/apache2/mods-enabled/dir.conf
/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
        DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

ファイルを保存して閉じた後、変更が有効になるようにApacheをリロードする必要があります。

  • sudo systemctl reload apache2

次のステップでは、PHPがサーバーに正しくインストールされ、設定されているかどうかをテストするためのPHPスクリプトを作成します。

ステップ5 — WebサーバーでPHP処理をテストする

Webサイトのファイルとフォルダをホストする場所を指定したので、ApacheがPHPファイルへのリクエストを処理できることを確認するためのPHPテストスクリプトを作成します。

指定したWeb rootフォルダにinfo.phpという名前の新しいファイルを作成します。

  • nano /var/www/your_domain/info.php

これにより、空白ファイルを開きます。ファイルの中に、有効なPHPコードである以下のテキストを追加します。

/var/www/your_domain/info.php
<?php
phpinfo();

完了したら、ファイルを保存して閉じます。

このスクリプトをテストするには、Webブラウザでサーバーのドメイン名やIPアドレスにアクセスし、スクリプト名の後にinfo.phpという名前をつけてください。

http://server_domain_or_IP/info.php

このようなページが表示されます。

Ubuntu 20.04 PHP info

このページでは、PHPの視点からお使いのサーバーに関する情報を提供します。デバッグや設定が正しく適用されているかどうかを確認するのに便利です。

ブラウザでこのページが表示できれば、PHP のインストールは期待通りに動作していることになります。

このページ上のPHPサーバーに関する情報を確認した後は、作成したファイルにはPHP環境およびUbuntuサーバーに関する機密情報が含まれているため、削除しておいた方がよいでしょう。rmを使用して、削除できます。‏‏

  • sudo rm /var/www/your_domain/info.php

後でもう一度情報にアクセスする必要がある場合は、いつでもこのページを再作成できます。

ステップ6 — PHPからデータベース接続をテストする(オプション)

PHPがMySQLに接続してデータベースクエリを実行できるかどうかをテストしたい場合は、ダミーデータを含むテストテーブルを作成し、PHPスクリプトからそのコンテンツをクエリすることができます。その前に、テスト用のデータベースを作成し、それにアクセスできるように適切に設定された新しいMySQLユーザーを用意する必要があります。

執筆時点では、ネイティブのMySQL PHPライブラリであるmysqlndは、MySQL 8のデフォルトの認証方法であるcaching_sha2_authenticationをサポートしていません。PHPからMySQLデータベースに接続できるようにするためには、mysql_native_password認証方法で新しいユーザーを作成する必要があります。

ここではexample_databaseという名前のデータベースと example_user という名前のユーザーを作成しますが、これらの名前は別の値に置き換えることができます。

まず、rootアカウントを使用して、MySQLコンソールに接続します。

  • sudo mysql

新しいデータベースを作成するには、MySQLコンソールから以下のコマンドを実行します。

  • CREATE DATABASE example_database;

これで、新しいユーザーを作成し、作成したカスタムデータベースに完全な権限を付与できます。

次のコマンドは、デフォルトの認証方法としてmysql_native_passwordを使用して、example_userという名前の新しいユーザーを作成します。 このユーザーのパスワードをpasswordとして定義していますが、この値を自分で選択した安全なパスワードに置き換える必要があります。

  • CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

ここで、このユーザーにexample_databaseデータベースに対する権限を与える必要があります。

  • GRANT ALL ON example_database.* TO 'example_user'@'%';

これにより、example_userユーザーにexample_databaseデータベースに対する完全な権限が与えられ、またこのユーザーによるサーバー上の他のデータベースの作成・変更を防ぎます。

以下を使用してMySQLシェルを終了します。

  • exit

新しいユーザーが適切な権限を持っているかどうかは、MySQLコンソールに再度ログインしてテストすることができます。カスタムユーザーの資格を使用します。

  • mysql -u example_user -p

このコマンドの -p フラグに注意してください。これは、example_userユーザーを作成する際に使用したパスワードを要求します。MySQLコンソールにログインした後、example_databaseデータベースにアクセスできることを確認してください。

  • SHOW DATABASES;

これにより、以下が出力されます。

Output
+--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)

次に、todo_listという名前のテストテーブルを作成します。MySQLコンソールから、次のステートメントを実行します。

  • CREATE TABLE example_database.todo_list (
  • item_id INT AUTO_INCREMENT,
  • content VARCHAR(255),
  • PRIMARY KEY(item_id)
  • );

テストテーブルにコンテンツの数行を挿入します。異なる値を使用して、次のコマンドを数回繰り返したい場合があります。

  • INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

データが正常にテーブルに保存されたことを確認するには、以下を実行します。

  • SELECT * FROM example_database.todo_list;

次の出力が表示されます。

Output
+---------+--------------------------+ | item_id | content | +---------+--------------------------+ | 1 | My first important item | | 2 | My second important item | | 3 | My third important item | | 4 | and this one more thing | +---------+--------------------------+ 4 rows in set (0.000 sec)

テストテーブルに有効なデータがあることを確認した後、MySQLコンソールを終了できます。

  • exit

これで、MySQLに接続してコンテンツにクエリを出すPHPスクリプトを作成することができます。お好みのエディタを使用して、カスタムWeb rootディレクトリに新しいPHPファイルを作成してください。ここでは、nanoを使用します。

  • nano /var/www/your_domain/todo_list.php

次のPHPスクリプトは、MySQLデータベースに接続してtodo_listテーブルの内容をクエリし、結果をリストで表示します。データベース接続に問題がある場合、例外をスローします。このコンテンツをtodo_list.phpスクリプトにコピーします。

/var/www/your_domain/todo_list.php
<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>";
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

編集が完了したら、ファイルを保存して閉じます。

これで、ウェブサイトに設定されているドメイン名またはパブリックIPアドレスの後に、/todo_list.phpを続けて、このページにアクセスすることができます。

http://your_domain_or_IP/todo_list.php

ページが表示され、テストテーブルに挿入したコンテンツが表示されます。

Example PHP todo list

これでPHP環境はあなたのMySQLサーバーと接続して対話する準備ができました。

まとめ

このガイドでは、WebサーバーとしてApacheを、データベースシステムとしてMySQLを使用して、訪問者にPHP Webサイトやアプリケーションを提供するための柔軟な基盤を構築しました。

この後のステップとして、HTTPS経由でサービスを提供することにより、Webサーバーへの接続のセキュリティが確保されていることを確認する必要があります。これには、Let’s Encryptによる無料のTLS /SSL証明書を使用し、サイトのセキュリティを確保してください。

Creative Commons License