Developer Advocate
「LAMP」スタックとは、PHPで書かれた動的ウェブサイトやWebアプリをホストできるように、通常一緒にインストールされているオープンソースソフトウェアのグループです。この用語は、実際にはApache webサーバーが搭載されたLinuxオペレーティングシステムを表す頭字語です。このサイトデータはMySQLデータベースに保存されており、動的コンテンツはPHPが処理を行います。
このガイドでは、Ubuntu 20.04サーバーにLAMPスタックをインストールします。
このチュートリアルを完了するには、非 root sudo
対応のユーザーアカウントと基本的なファイアウォールを備えたUbuntu 20.04サーバーが必要です。これは、Ubuntu 20.04の初期サーバー設定ガイドを使用して設定できます。
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
出力は次のようになります。
OutputAvailable applications:
Apache
Apache Full
Apache Secure
OpenSSH
これらのプロファイルがそれぞれ意味する内容は次のとおりです。
80
(通常、暗号化されていないWebトラフィック)のみを開きます。443
(TLS/SSL暗号化トラフィック)のみを開きます。今のところ、Apacheをインストールしたばかりで、お使いのサーバーのHTTPSトラフィックを許可するように設定されたTLS/SSL証明書がまだないため、ポート80
での接続のみを許可することが最善となります。
ポート80
でのトラフィックのみを許可するには、Apache
プロファイルを使用します。
- sudo ufw allow in "Apache"
次を使用して変更を確認することができます。
- sudo ufw status
OutputStatus: 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ページが表示されます。このように表示されるはずです。
このページが表示されたら、Webサーバーがファイアウォールを介して正しくインストールされ、アクセス可能になっています。
サーバーのパブリック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アドレスを入力します。
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
を使用することで推測されます。出力は次のようになります。
OutputWelcome 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
ではなくunix_socketであるためです。これはセキュリティ上の問題のように見えるかもしれませんが、MySQLのrootユーザーとしてログインできるのは、sudo権限を持つシステムユーザーのみであり、コンソールから接続するか、同じ権限を持つアプリケーションを介して接続することができるため、データベースサーバーをより安全なものにしています。実用的な意味では、管理データベースのrootユーザーを使用してPHPアプリケーションから接続することができないということになります。root MySQLアカウントにパスワードを設定することは、デフォルトの認証方法がunix_socket
からpassword
に変更された場合のセーフガードとして機能します。``
セキュリティを強化するためには、特にサーバー上に複数のデータベースをホストしている場合は、データベースごとに拡張性の低い専用のユーザーアカウントを設定しておくとよいでしょう。
**注:**執筆時点では、ネイティブのMySQL PHPライブラリmysqlnd
は、MySQL 8のデフォルトの認証方法であるcaching_sha2_authentication
をサポートしていません。そのため、MySQL 8でPHPアプリケーションのデータベースユーザーを作成する際には、代わりにmysql_native_password
を使用するように設定されていることを確認する必要があります。ステップ6でその方法について説明します。
これで MySQL サーバーがインストールされ、セキュリティが確保されました。次に、LAMPスタックの最終コンポーネントである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
OutputPHP 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を設定しておくとよいでしょう。次のステップでその設定を行います。
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 設定に貼り付けます。
<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+X
、Y
、ENTER
の順に押して同じことができます。
このVirtualHost
設定により、Web rootディレクトリとして/var/www/your_domain
を使用して、Apacheにyour_domain
にサービスを提供するよう指示します。ドメイン名を使用せずにApacheをテストしたい場合は、各オプションの行の先頭に#
文字を追加することで、ServerName
とServerAlias
のオプションを削除したりコメントアウトしたりすることができます。
これで、新しいバーチャルホストを有効にするために、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
このファイルに以下のコンテンツを含みます。
<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バーチャルホストが期待通りに動作していることを意味します。
このファイルは、index.php
ファイルを置き換えるために設定するまでの間、アプリケーションの一時的なランディングページとして残しておくことができます。設定したら、忘れずにindex.html
ファイルをドキュメントrootから削除するか、名前を変更してください。デフォルトではindex.php
ファイルよりも優先されます。
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
<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スクリプトを作成します。
Webサイトのファイルとフォルダをホストする場所を指定したので、ApacheがPHPファイルへのリクエストを処理できることを確認するためのPHPテストスクリプトを作成します。
指定したWeb rootフォルダにinfo.php
という名前の新しいファイルを作成します。
- nano /var/www/your_domain/info.php
これにより、空白ファイルを開きます。ファイルの中に、有効なPHPコードである以下のテキストを追加します。
<?php
phpinfo();
完了したら、ファイルを保存して閉じます。
このスクリプトをテストするには、Webブラウザでサーバーのドメイン名やIPアドレスにアクセスし、スクリプト名の後にinfo.php
という名前をつけてください。
http://server_domain_or_IP/info.php
このようなページが表示されます。
このページでは、PHPの視点からお使いのサーバーに関する情報を提供します。デバッグや設定が正しく適用されているかどうかを確認するのに便利です。
ブラウザでこのページが表示できれば、PHP のインストールは期待通りに動作していることになります。
このページ上のPHPサーバーに関する情報を確認した後は、作成したファイルにはPHP環境およびUbuntuサーバーに関する機密情報が含まれているため、削除しておいた方がよいでしょう。rm
を使用して、削除できます。
- sudo rm /var/www/your_domain/info.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
スクリプトにコピーします。
<?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
ページが表示され、テストテーブルに挿入したコンテンツが表示されます。
これでPHP環境はあなたのMySQLサーバーと接続して対話する準備ができました。
このガイドでは、WebサーバーとしてApacheを、データベースシステムとしてMySQLを使用して、訪問者にPHP Webサイトやアプリケーションを提供するための柔軟な基盤を構築しました。
この後のステップとして、HTTPS経由でサービスを提供することにより、Webサーバーへの接続のセキュリティが確保されていることを確認する必要があります。これには、Let’s Encryptによる無料のTLS /SSL証明書を使用し、サイトのセキュリティを確保してください。
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!