序章

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

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

前提条件

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

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

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

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

  1. sudo apt update

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

  1. sudo apt install apache2

Apacheのインストールを確認するように求められます。 を押して確認 Y、 それから ENTER.

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

  1. 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暗号化トラフィック)。

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

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

  1. sudo ufw allow in "Apache"

次のコマンドで変更を確認します。

  1. 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

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

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

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

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

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

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

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

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

  1. curl http://icanhazip.com

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

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

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

繰り返しますが、 apt このソフトウェアを入手してインストールするには:

  1. sudo apt install mysql-server

プロンプトが表示されたら、次のように入力してインストールを確認します Y、 その後 ENTER.

インストールが完了したら、MySQLにプリインストールされているセキュリティスクリプトを実行することをお勧めします。 このスクリプトは、いくつかの安全でないデフォルト設定を削除し、データベースシステムへのアクセスをロックダウンします。 次のコマンドを実行して、インタラクティブスクリプトを開始します。

  1. 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ルートユーザーのデフォルトの認証方法ではパスワードを使用しませんが、パスワードが設定されている場合でも、追加の安全対策としてここで強力なパスワードを定義する必要があります。

パスワード検証を有効にした場合、入力したルートパスワードのパスワード強度が表示され、サーバーはそのパスワードを続行するかどうかを尋ねます。 現在のパスワードに満足している場合は、次のように入力します 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コンソールにログインできるかどうかをテストします。

  1. sudo mysql

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

Output
Welcome 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コンソールを終了するには、次のように入力します。

  1. exit

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

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

注:がサポートしていない古いバージョンのPHPがいくつかあります caching_sha2_password、MySQL8のデフォルトの認証方法。 そのため、MySQL 8でPHPアプリケーションのデータベースユーザーを作成する場合は、を使用するようにアプリケーションを構成する必要があります。 mysql_native_password 代わりにプラグイン。 このチュートリアルでは、ステップ6でその方法を説明します。

これで、MySQLサーバーがインストールされ、保護されました。 次に、LAMPスタックの最後のコンポーネントであるPHPをインストールします。

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

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

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

  1. sudo apt install php libapache2-mod-php php-mysql

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

  1. php -v
Output
PHP 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では、デフォルトで1つの仮想ホストが有効になっており、 /var/www/html ディレクトリ。 これは単一のサイトではうまく機能しますが、複数のサイトをホストしている場合は扱いにくくなる可能性があります。 変更する代わりに /var/www/html、内にディレクトリ構造を作成します /var/www your_domain サイトの場合、 /var/www/html クライアント要求が他のサイトと一致しない場合に提供されるデフォルトのディレクトリとして配置されます。

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

  1. sudo mkdir /var/www/your_domain

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

  1. sudo chown -R $USER:$USER /var/www/your_domain

次に、Apacheの新しい構成ファイルを開きます sites-available 好みのコマンドラインエディタを使用してディレクトリを作成します。 ここでは、 nano:

  1. 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、 それから YENTER.

これとともに VirtualHost 構成では、Apacheにサービスを提供するように指示しています your_domain を使用して /var/www/your_domain Webルートディレクトリとして。 ドメイン名なしでApacheをテストしたい場合は、オプションを削除またはコメントアウトできます ServerNameServerAlias ポンド記号を追加する(#)各オプションの行の先頭。

今、使用します a2ensite 新しい仮想ホストを有効にするには:

  1. sudo a2ensite your_domain

ApacheにインストールされているデフォルトのWebサイトを無効にすることをお勧めします。 カスタムドメイン名を使用していない場合は、これが必要です。この場合、Apacheのデフォルト構成が仮想ホストを上書きするためです。 ApacheのデフォルトのWebサイトを無効にするには、次のように入力します。

  1. sudo a2dissite 000-default

構成ファイルに構文エラーが含まれていないことを確認するには、次のコマンドを実行します。

  1. sudo apache2ctl configtest

最後に、Apacheをリロードして、これらの変更を有効にします。

  1. sudo systemctl reload apache2

新しいWebサイトはアクティブになりましたが、Webルート /var/www/your_domain まだ空です。 作成する index.html その場所にファイルして、仮想ホストが期待どおりに機能することをテストします。

  1. 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.html ドキュメントルートからのファイル。 index.php デフォルトではファイル。

についてのメモ DirectoryIndex Apacheで

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

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

  1. 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をリロードする必要があります。

  1. sudo systemctl reload apache2

次のステップでは、PHPスクリプトを作成して、PHPがサーバーに正しくインストールおよび構成されていることをテストします。

ステップ5—WebサーバーでのPHP処理のテスト

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

名前の付いた新しいファイルを作成します info.php カスタムWebルートフォルダ内:

  1. 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 そうするために:

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

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

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

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

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

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

  1. sudo mysql

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

  1. CREATE DATABASE example_database;

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

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

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

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

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

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

次に、このユーザーに権限を付与します example_database データベース:

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

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

次に、次のコマンドでMySQLシェルを終了します。

  1. exit

今回はカスタムユーザーのクレデンシャルを使用して、MySQLコンソールに再度ログインして、新しいユーザーが適切な権限を持っているかどうかをテストします。

  1. mysql -u example_user -p

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

  1. SHOW DATABASES;

これにより、次の出力が得られます。

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

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

  1. CREATE TABLE example_database.todo_list (
  2. item_id INT AUTO_INCREMENT,
  3. content VARCHAR(255),
  4. PRIMARY KEY(item_id)
  5. );

テストテーブルにコンテンツの数行を挿入します。 異なる値を使用して次のコマンドを数回繰り返し、テストテーブルにデータを入力します。

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

データがテーブルに正常に保存されたことを確認するには、次のコマンドを実行します。

  1. 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コンソールを終了します。

  1. exit

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

  1. 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証明書でサイトを保護できます。