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

提供:Dev Guides
移動先:案内検索

序章

「LAMP」スタックは、サーバーが動的なWebサイトやPHPで記述されたWebアプリをホストできるようにするために、通常は一緒にインストールされるオープンソースソフトウェアのグループです。 この用語は、 LinuxオペレーティングシステムとApacheWebサーバーを表す頭字語です。 サイトデータはM ySQLデータベースに保存され、動的コンテンツは PHPによって処理されます。

このガイドでは、Ubuntu22.04サーバーにLAMPスタックをセットアップします。

前提条件

このチュートリアルを完了するには、ルート以外のsudo対応のユーザーアカウントと基本的なファイアウォールを備えたUbuntu22.04サーバーが必要です。 これは、Ubuntu22.04初期サーバーセットアップガイドを使用して構成できます。

ステップ1—Apacheのインストールとファイアウォールの更新

Apache Webサーバーは、世界で最も人気のあるWebサーバーの1つです。 十分に文書化されており、ユーザーの活発なコミュニティがあり、Webの歴史の多くで広く使用されているため、Webサイトをホストするのに最適です。

パッケージマネージャーのキャッシュを更新することから始めます。 このセッションでsudoを初めて使用する場合は、aptでシステムパッケージを管理するための適切な権限があることを確認するためにユーザーのパスワードを入力するように求められます。

sudo apt update

次に、次のコマンドを使用してApacheをインストールします。

sudo apt install apache2

Apacheのインストールを確認するように求められます。 YENTERの順に押して確定します。

インストールが完了したら、HTTPトラフィックを許可するようにファイアウォール設定を調整する必要があります。 Ubuntuのデフォルトのファイアウォール構成ツールはUncomplicatedFirewall(UFW)と呼ばれています。 活用できるさまざまなアプリケーションプロファイルがあります。 現在利用可能なすべてのUFWアプリケーションプロファイルを一覧表示するには、次のコマンドを実行します。

sudo ufw app list
OutputAvailable applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

これらの各プロファイルの意味は次のとおりです。

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

現時点では、ポート80での接続のみを許可することをお勧めします。これは、Apacheの新規インストールであり、サーバーでHTTPSトラフィックを許可するようにTLS/SSL証明書を構成していないためです。

ポート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

デフォルトのUbuntu22.04Apache Webページは、情報提供とテストの目的であります。 以下は、ApacheのデフォルトのWebページの例です。

このページを表示できる場合は、Webサーバーが正しくインストールされており、ファイアウォールを介してアクセスできます。

サーバーのパブリックIPアドレスを見つける方法

サーバーのパブリックIPアドレスがわからない場合は、いくつかの方法で見つけることができます。 通常、これはSSH経由でサーバーに接続するために使用するアドレスです。

コマンドラインからこれを行うには、いくつかの異なる方法があります。 まず、iproute2ツールを使用して、次のように入力してIPアドレスを取得できます。

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

これにより、2行または3行戻ります。 これらはすべて正しいアドレスですが、コンピュータで使用できるのは1つだけである可能性があるため、それぞれを試してみてください。

別の方法は、curlユーティリティを使用して外部の関係者に連絡し、サーバーがどのように認識されているかを通知することです。 これは、特定のサーバーにIPアドレスを尋ねることによって行われます。

curl http://icanhazip.com

どちらの方法を選択した場合でも、WebブラウザにIPアドレスを入力して、サーバーが実行されていることを確認します。

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

Webサーバーが稼働しているので、サイトのデータを保存および管理できるようにデータベースシステムをインストールする必要があります。 MySQLは、PHP環境で使用される一般的なデータベース管理システムです。

ここでも、aptを使用して、このソフトウェアを入手してインストールします。

sudo apt install mysql-server

プロンプトが表示されたら、YENTERの順に入力してインストールを確認します。

インストールが完了したら、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の設定を選択したかどうかに関係なく、サーバーは次にMySQL rootユーザーのパスワードを選択して確認するように求めます。 これをシステムルートと混同しないでください。 データベースルートユーザーは、データベースシステムに対する完全な権限を持つ管理ユーザーです。 MySQLルートユーザーのデフォルトの認証方法ではパスワードを使用しませんが、パスワードが設定されている場合でも、追加の安全対策としてここで強力なパスワードを定義する必要があります。

パスワード検証を有効にした場合、入力したルートパスワードのパスワード強度が表示され、サーバーはそのパスワードを続行するかどうかを尋ねます。 現在のパスワードに満足している場合は、プロンプトで「yes」に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キーを押してください。 これにより、一部の匿名ユーザーとテストデータベースが削除され、リモートルートログインが無効になり、これらの新しいルールが読み込まれるため、MySQLは行った変更をすぐに尊重します。

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

sudo mysql

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

OutputWelcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

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であるためです。 これはセキュリティ上の懸念のように思われるかもしれませんが、 root MySQLユーザーとしてログインできるのは、コンソールまたはコンソールから接続するsudo権限を持つシステムユーザーのみであるため、データベースサーバーの安全性が高まります。同じ権限で実行されているアプリケーション。 つまり、実際には、管理データベースrootユーザーを使用してPHPアプリケーションから接続することはできません。 root MySQLアカウントのパスワードを設定すると、デフォルトの認証方法がunix_socketからpasswordに変更された場合の安全策として機能します。

セキュリティを強化するには、特にサーバーで複数のデータベースをホストする予定の場合は、データベースごとに拡張性の低い特権を持つ専用のユーザーアカウントを設定することをお勧めします。

注:MySQL8のデフォルトの認証方法であるcaching_sha2_authenticationをサポートしていない古いバージョンのPHPがいくつかあります。 そのため、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
OutputPHP 8.1.2 (cli) (built: Mar  4 2022 18:13:46) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies

この時点で、LAMPスタックは完全に機能していますが、PHPスクリプトを使用してセットアップをテストする前に、Webサイトのファイルとフォルダーを保持する適切なApache仮想ホストをセットアップすることをお勧めします。

ステップ4—Webサイトの仮想ホストを作成する

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

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


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

次のように、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

これにより、新しい空白のファイルが作成されます。 独自のドメイン名を使用して、次の必要最低限の構成を追加します。

/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構成では、/var/www/your_domainをWebルートディレクトリとして使用してyour_domainを提供するようにApacheに指示しています。 ドメイン名なしで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ルート/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

Webページには、編集したファイルの内容が反映されている必要があります。

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

ApacheのDirectoryIndexに関するメモ

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

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

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サイトのファイルとフォルダーをホストするカスタムの場所ができたので、PHPテストスクリプトを作成して、ApacheがPHPファイルの要求を処理および処理できることを確認します。

カスタムWebルートフォルダ内に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

デフォルトのPHPWebページの例を次に示します。

このページでは、PHPの観点からサーバーに関する情報を提供します。 デバッグや、設定が正しく適用されていることを確認するのに役立ちます。

ブラウザにこのページが表示されている場合、PHPのインストールは期待どおりに機能しています。

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

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

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

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

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

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

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

sudo mysql

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

CREATE DATABASE example_database;

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

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

CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';

:前のALTER USERステートメントは、 rootMySQLユーザーがcaching_sha2_passwordプラグインで認証するように設定します。 MySQLの公式ドキュメントによると、caching_sha2_passwordは、古いがまだ広く使用されているmysql_native_passwordよりも安全なパスワード暗号化を提供するため、MySQLの推奨認証プラグインです。

ただし、PHPの一部のバージョンは、caching_sha2_passwordでは確実に機能しません。 PHPは、この問題がPHP 7.4 で修正されたことを報告していますが、後でphpMyAdminにログインしようとしたときにエラーが発生した場合は、rootを設定して認証することをお勧めします。代わりにmysql_native_password

ALTER USER 'root'@'localhost' 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ルートディレクトリに新しいPHPファイルを作成します。

nano /var/www/your_domain/todo_list.php

次のPHPスクリプトは、MySQLデータベースに接続し、 todo_list テーブルのコンテンツを照会して、結果をリストに表示します。 データベース接続に問題がある場合は、例外がスローされます。

このコンテンツをtodo_list.phpスクリプトに追加し、example_userpasswordを独自のものに置き換えることを忘れないでください。

/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();
}

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

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

http://your_domain_or_IP/todo_list.php

このWebページでは、テストテーブルに挿入したコンテンツを訪問者に公開する必要があります。

これは、PHP環境がMySQLサーバーに接続して対話する準備ができていることを意味します。

結論

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

次のステップとして、HTTPS経由でサービスを提供することにより、Webサーバーへの接続が保護されていることを確認する必要があります。 これを実現するために、 Let's Encrypt を使用して、無料のTLS/SSL証明書でサイトを保護できます。