序章

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

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

前提条件

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

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

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

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

  1. sudo apt update

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

  1. sudo apt install apache2

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

インストールが完了したら、HTTPトラフィックを許可するようにファイアウォール設定を調整する必要があります。 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

情報提供とテストの目的で存在するデフォルトのUbuntu20.04ApacheWebページが表示されます。 次のようになります。

Ubuntu 20.04 Apache default

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

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

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

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

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

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

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

  1. curl http://icanhazip.com

IPアドレスの取得に使用する方法に関係なく、Webブラウザのアドレスバーに入力して、デフォルトのApacheページを表示します。

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

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

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

  1. sudo apt install mysql-server

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

インストールが完了したら、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ルートユーザーのデフォルトの認証方法ではパスワードの使用は不要ですが、パスワードが設定されている場合でも、追加の安全対策としてここで強力なパスワードを定義する必要があります。 これについては後で説明します。

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

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

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

  1. exit

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

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

注:この記事の執筆時点では、ネイティブMySQLPHPライブラリmysqlnd は、MySQL8のデフォルトの認証方法である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パッケージは、依存関係として自動的にインストールされます。

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

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

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

  1. php -v
Output
PHP 7.4.3 (cli) (built: Jul 5 2021 15:13:35) ( 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仮想ホストをセットアップすることをお勧めします。 次のステップでそれを行います。

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

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

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

Ubuntu 20.04上のApacheでは、/var/www/htmlディレクトリからドキュメントを提供するように構成された1つのサーバーブロックがデフォルトで有効になっています。 これは単一のサイトではうまく機能しますが、複数のサイトをホストしている場合は扱いにくくなる可能性があります。 /var/www/htmlを変更する代わりに、 your_domain サイトの/var/www内にディレクトリ構造を作成し、/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 [email protected]
    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を使用して、新しい仮想ホストを有効にできます。

  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

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

Apache virtual host test

このページが表示されている場合は、Apache仮想ホストが期待どおりに機能していることを意味します。

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ディレクティブ内にリストされている順序を変更する必要があります。

  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ファイルの要求を処理および処理できることを確認します。

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

  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

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

Ubuntu 20.04 PHP info

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

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

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

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

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

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

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

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

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

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

  1. sudo mysql

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

  1. CREATE DATABASE example_database;

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

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

  1. CREATE USER 'example_user'@'%' 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ファイルを作成します。 そのためにnanoを使用します。

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

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

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

http://your_domain_or_IP/todo_list.php

テストテーブルに挿入したコンテンツを示す次のようなページが表示されます。

Example PHP todo list

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

結論

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

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