Linux、Apache、MySQL、PHP(LAMP)スタックをUbuntu22.04にインストールする方法
序章
「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のインストールを確認するように求められます。 Y
、ENTER
の順に押して確定します。
インストールが完了したら、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
プロンプトが表示されたら、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
の設定を選択したかどうかに関係なく、サーバーは次に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+X
、Y
、ENTER
の順に押してください。
この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_user
とpassword
を独自のものに置き換えることを忘れないでください。
/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証明書でサイトを保護できます。