序章

LEMPソフトウェアスタックは、動的なWebページおよびPHPで記述されたWebアプリケーションを提供するために使用できるソフトウェアのグループです。 これは、 L inuxオペレーティングシステムとNginx(「 E ngine-X」のように発音されます)Webサーバーを表す頭字語です。 バックエンドデータはM ySQLデータベースに保存され、動的処理は PHPによって処理されます。

このガイドは、Ubuntu20.04サーバーにLEMPスタックをインストールする方法を示しています。 Ubuntuオペレーティングシステムが最初の要件を処理します。 残りのコンポーネントを稼働させる方法について説明します。

前提条件

このチュートリアルを完了するには、通常の非ルートとしてUbuntu20.04サーバーにアクセスする必要があります。 sudo ユーザー、およびサーバーで有効になっているファイアウォール。 これを設定するには、 Ubuntu20.04の初期サーバー設定ガイドに従ってください。

ステップ1-NginxWebサーバーをインストールする

サイト訪問者にWebページを表示するために、高性能WebサーバーであるNginxを採用します。 を使用します apt このソフトウェアを入手するためのパッケージマネージャー。

初めて使うので apt このセッションでは、サーバーのパッケージインデックスを更新することから始めます。 その後、あなたは使用することができます apt install Nginxをインストールするには:

  1. sudo apt update
  2. sudo apt install nginx

プロンプトが表示されたら、次のように入力します Y Nginxをインストールすることを確認します。 インストールが完了すると、Nginx Webサーバーがアクティブになり、Ubuntu20.04サーバーで実行されます。

あなたが持っている場合 ufw サーバーの初期設定ガイドで推奨されているように、ファイアウォールが有効になっている場合は、Nginxへの接続を許可する必要があります。 Nginxは、インストール時にいくつかの異なるUFWアプリケーションプロファイルを登録します。 利用可能なUFWプロファイルを確認するには、次のコマンドを実行します。

  1. sudo ufw app list
Output
Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

必要なトラフィックを引き続き許可する最も制限の厳しいプロファイルを有効にすることをお勧めします。 このガイドではサーバーのSSLを構成していないため、ポートで通常のHTTPトラフィックのみを許可する必要があります。 80.

次のように入力して、これを有効にします。

  1. sudo ufw allow 'Nginx HTTP'

次のコマンドを実行して、変更を確認できます。

  1. sudo ufw status

このコマンドの出力は、HTTPトラフィックが現在許可されていることを示しています。

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

新しいファイアウォールルールを追加すると、Webブラウザでサーバーのドメイン名またはパブリックIPアドレスにアクセスして、サーバーが稼働しているかどうかをテストできます。

サーバーを指すドメイン名がなく、サーバーのパブリックIPアドレスがわからない場合は、次のコマンドを実行してドメイン名を見つけることができます。

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

これにより、いくつかのIPアドレスが出力されます。 Webブラウザでそれぞれを順番に試すことができます。

別の方法として、インターネット上の他の場所から見たときに、どのIPアドレスにアクセスできるかを確認できます。

  1. curl -4 icanhazip.com

Webブラウザーで受け取ったアドレスを入力すると、Nginxのデフォルトのランディングページに移動します。

http://server_domain_or_IP

このページが表示されている場合は、Nginxが正常にインストールされ、WebサーバーのHTTPトラフィックが有効になっていることを意味します。

ステップ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

質問のrestについては、を押してください 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 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

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

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

注:この記事の執筆時点では、ネイティブMySQLPHPライブラリ mysqlnd はサポートしていません caching_sha2_authentication、MySQL8のデフォルトの認証方法。 そのため、MySQL 8でPHPアプリケーションのデータベースユーザーを作成するときは、それらが使用するように構成されていることを確認する必要があります。 mysql_native_password 代わりは。 ステップ6でその方法を説明します。

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

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

コンテンツを提供するためにNginxがインストールされ、データを保存および管理するためにMySQLがインストールされています。 これで、PHPをインストールしてコードを処理し、Webサーバーの動的コンテンツを生成できます。

Apacheは各リクエストにPHPインタープリターを埋め込みますが、Nginxには、PHP処理を処理し、PHPインタープリター自体とWebサーバー間のブリッジとして機能する外部プログラムが必要です。 これにより、ほとんどのPHPベースのWebサイトで全体的なパフォーマンスが向上しますが、追加の構成が必要になります。 インストールする必要があります php-fpm、は「PHP fastCGIプロセスマネージャー」の略で、処理のためにこのソフトウェアにPHPリクエストを渡すようにNginxに指示します。 さらに、あなたは必要になります php-mysql、PHPがMySQLベースのデータベースと通信できるようにするPHPモジュール。 コアPHPパッケージは、依存関係として自動的にインストールされます。

をインストールするには php-fpmphp-mysql パッケージ、実行:

  1. sudo apt install php-fpm php-mysql

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

これで、PHPコンポーネントがインストールされました。 次に、それらを使用するようにNginxを構成します。

ステップ4—PHPプロセッサを使用するようにNginxを構成する

Nginx Webサーバーを使用する場合、サーバーブロック(Apacheの仮想ホストと同様)を作成して、構成の詳細をカプセル化し、単一のサーバーで複数のドメインをホストできます。 このガイドでは、ドメイン名の例としてyour_domainを使用します。 DigitalOceanを使用したドメイン名の設定の詳細については、 DigitalOceanDNSの概要を参照してください。

Ubuntu 20.04では、Nginxではデフォルトで1つのサーバーブロックが有効になっており、次のディレクトリからドキュメントを提供するように構成されています。 /var/www/html. これは単一のサイトではうまく機能しますが、複数のサイトをホストしている場合は管理が難しくなる可能性があります。 変更する代わりに /var/www/html、内にディレクトリ構造を作成します /var/www your_domain Webサイトの場合、 /var/www/html クライアント要求が他のサイトと一致しない場合に提供されるデフォルトのディレクトリとして配置されます。

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

  1. sudo mkdir /var/www/your_domain

次に、現在のシステムユーザーを参照する$USER環境変数を使用してディレクトリの所有権を割り当てます。

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

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

  1. sudo nano /etc/nginx/sites-available/your_domain

これにより、新しい空白のファイルが作成されます。 次の必要最低限の構成で貼り付けます。

/ etc / nginx / sites-available / your_domain
server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
     }

    location ~ /\.ht {
        deny all;
    }

}


これらのディレクティブとロケーションブロックのそれぞれの機能は次のとおりです。

  • listen —Nginxがリッスンするポートを定義します。 この場合、ポートでリッスンします 80、HTTPのデフォルトポート。
  • root —このWebサイトによって提供されるファイルが保存されるドキュメントルートを定義します。
  • index —NginxがこのWebサイトのインデックスファイルに優先順位を付ける順序を定義します。 リストするのが一般的な方法です index.html 優先順位が高いファイル index.php PHPアプリケーションでメンテナンスランディングページをすばやく設定できるようにするファイル。 これらの設定は、アプリケーションのニーズに合わせて調整できます。
  • server_name —このサーバーブロックが応答するドメイン名やIPアドレスを定義します。 このディレクティブをサーバーのドメイン名またはパブリックIPアドレスにポイントします。
  • location / —最初のロケーションブロックには、 try_files URI要求に一致するファイルまたはディレクトリの存在をチェックするディレクティブ。 Nginxが適切なリソースを見つけることができない場合、404エラーを返します。
  • location ~ \.php$ —このロケーションブロックは、Nginxをポイントすることで実際のPHP処理を処理します fastcgi-php.conf 構成ファイルと php7.4-fpm.sock どのソケットが関連付けられているかを宣言するファイル php-fpm.
  • location ~ /\.ht —最後のロケーションブロックは .htaccess Nginxが処理しないファイル。 追加することにより deny all ディレクティブ(ある場合) .htaccess ファイルはたまたまドキュメントルートに到達し、訪問者には提供されません。

編集が終わったら、ファイルを保存して閉じます。 使用している場合 nano、次のように入力してください CTRL+X その後 yENTER 確認するために。

Nginxから構成ファイルにリンクして構成をアクティブ化します sites-enabled ディレクトリ:

  1. sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

次に、デフォルトの構成ファイルのリンクを解除します。 /sites-enabled/ ディレクトリ:

  1. sudo unlink /etc/nginx/sites-enabled/default

:デフォルト構成を復元する必要がある場合は、次のようにシンボリックリンクを再作成することで復元できます。

  1. sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

これにより、次にリロードされるときに構成を使用するようにNginxに指示されます。 次のように入力して、構成の構文エラーをテストできます。

  1. sudo nginx -t

エラーが報告された場合は、構成ファイルに戻って内容を確認してから続行してください。

準備ができたら、Nginxをリロードして変更を適用します。

  1. sudo systemctl reload nginx

新しい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アドレスにアクセスします。 server_name サーバーブロック構成ファイルのディレクティブ:

http://server_domain_or_IP

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

このページが表示されている場合は、Nginxサーバーブロックが期待どおりに機能していることを意味します。

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

これで、LEMPスタックが完全に構成されました。 次のステップでは、PHPスクリプトを作成して、Nginxが実際に処理できることをテストします。 .php 新しく構成したWebサイト内のファイル。

ステップ5–Nginxを使用したPHPのテスト

これで、LEMPスタックが完全にセットアップされました。 Nginxが正しく処理できることを検証するためにテストできます .php PHPプロセッサにファイルを送ります。

これを行うには、ドキュメントルートにテストPHPファイルを作成します。 と呼ばれる新しいファイルを開きます info.php テキストエディタのドキュメントルート内:

  1. nano /var/www/your_domain/info.php

次の行を入力するか、新しいファイルに貼り付けます。 これは、サーバーに関する情報を返す有効なPHPコードです。

/var/www/your_domain/info.php
<?php
phpinfo();

終了したら、次のように入力してファイルを保存して閉じます CTRL+X その後 yENTER 確認するために。

これで、Nginx構成ファイルで設定したドメイン名またはパブリックIPアドレスにアクセスし、続いてWebブラウザーでこのページにアクセスできます。 /info.php:

http://server_domain_or_IP/info.php

サーバーに関する詳細情報を含むWebページが表示されます。

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

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

後で必要になった場合は、いつでもこのファイルを再生成できます。

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

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

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

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

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

  1. sudo mysql

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

  1. CREATE DATABASE example_database;

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

次のコマンドは、という名前の新しいユーザーを作成します example_user、を使用して mysql_native_password デフォルトの認証方法として。 このユーザーのパスワードを次のように定義しています 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://server_domain_or_IP/todo_list.php

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

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

結論

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