開発者ドキュメント

Linux、Nginx、MariaDB、PHP(LEMPスタック)をDebian10にインストールする方法

序章

LEMPソフトウェアスタックは、動的WebページおよびWebアプリケーションを提供するために使用できるソフトウェアのグループです。 「LEMP」という名前は、( E )NginxWebサーバーを備えたLinuxオペレーティングシステムを表す頭字語です。 バックエンドデータはM ariaDBデータベースに保存され、動的処理は PHPによって処理されます。

このソフトウェアスタックには通常、データベース管理システムとして MySQL が含まれていますが、Debianを含む一部のLinuxディストリビューションでは、MySQLのドロップイン代替としてMariaDBを使用しています。

このガイドでは、データベース管理システムとしてMariaDBを使用して、Debian10サーバーにLEMPスタックをインストールします。

前提条件

このガイドを完了するには、Debian10サーバーにアクセスする必要があります。 このサーバーには、sudo特権で構成された通常のユーザーと、ufwで有効にされたファイアウォールが必要です。 これを設定するには、 Debian10を使用したサーバーの初期設定ガイドに従ってください。

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

サイト訪問者にWebページを提供するために、全体的なパフォーマンスと安定性でよく知られている人気のあるWebサーバーであるNginxを採用します。

この手順で使用するすべてのソフトウェアは、Debianのデフォルトのパッケージリポジトリから直接提供されます。 これは、aptパッケージ管理スイートを使用してインストールを完了することができることを意味します。

このセッションでaptを使用するのはこれが初めてなので、ローカルパッケージインデックスを更新することから始める必要があります。 その後、サーバーをインストールできます。

  1. sudo apt update
  2. sudo apt install nginx

Debian 10では、Nginxはインストール時に実行を開始するように構成されています。

ufwファイアウォールを実行している場合は、Nginxへの接続を許可する必要があります。 必要なトラフィックを引き続き許可する最も制限の厳しいプロファイルを有効にする必要があります。 サーバーにSSLをまだ構成していないため、現時点では、ポート80でHTTPトラフィックのみを許可する必要があります。

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

  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ブラウザでそれぞれを順番に試すことができます。

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

http://your_domain_or_IP

上記のページが表示されている場合は、Nginxが正常にインストールされています。

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

Webサーバーが稼働しているので、サイトのデータを保存および管理できるようにデータベースシステムをインストールする必要があります。

Debian 10では、MySQLサーバーのインストールに従来使用されていたメタパッケージmysql-serverが、default-mysql-serverに置き換えられました。 このメタパッケージは、Oracleによる元のMySQLサーバーのコミュニティフォークである MariaDB を参照し、現在、Debianベースのパッケージマネージャーリポジトリで使用可能なデフォルトのMySQL互換データベースサーバーです。

ただし、長期的な互換性のために、メタパッケージを使用する代わりに、プログラムの実際のパッケージmariadb-serverを使用してMariaDBをインストールすることをお勧めします。

このソフトウェアをインストールするには、以下を実行します。

  1. sudo apt install mariadb-server

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

  1. sudo mysql_secure_installation

このスクリプトは、MariaDBの設定にいくつかの変更を加えることができる一連のプロンプトを表示します。 最初のプロンプトでは、現在のデータベースルートパスワードを入力するように求められます。 これをシステムルートと混同しないでください。 データベースルートユーザーは、データベースシステムに対する完全な権限を持つ管理ユーザーです。 MariaDBをインストールしたばかりで、まだ構成を変更していないため、このパスワードは空白になります。プロンプトでENTERを押すだけです。

次のプロンプトでは、データベースルートパスワードを設定するかどうかを尋ねられます。 MariaDBは、 root ユーザーに対して、通常はパスワードを使用するよりも安全な特別な認証方法を使用するため、ここでこれを設定する必要はありません。 Nと入力し、ENTERを押します。

そこから、Y、次にENTERを押して、後続のすべての質問のデフォルトを受け入れることができます。 これにより、匿名ユーザーとテストデータベースが削除され、リモート root ログインが無効になり、これらの新しいルールが読み込まれるため、MariaDBは行った変更をすぐに尊重します。 終了したら、次のように入力してMariaDBコンソールにログインします。

  1. sudo mariadb

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

Output
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 74 Server version: 10.3.15-MariaDB-1 Debian 10 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>

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

セキュリティを強化するには、特にサーバーで複数のデータベースをホストする予定の場合は、データベースごとに拡張性の低い特権を持つ専用のユーザーアカウントを設定することをお勧めします。 このような設定を示すために、example_databaseという名前のデータベースとexample_userという名前のユーザーを作成しますが、これらの名前を別の値に置き換えることができます。 新しいデータベースを作成するには、MariaDBコンソールから次のコマンドを実行します。

  1. CREATE DATABASE example_database;

これで、新しいユーザーを作成し、作成したカスタムデータベースに対する完全な権限をユーザーに付与できます。 次のコマンドは、このユーザーのパスワードをpasswordとして定義しますが、この値を自分で選択した安全なパスワードに置き換える必要があります。

  1. GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

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

特権をフラッシュして、それらが保存され、現在のセッションで使用可能であることを確認します。

  1. FLUSH PRIVILEGES;

これに続いて、MariaDBシェルを終了します。

  1. exit

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

  1. mariadb -u example_user -p

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

  1. SHOW DATABASES;

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

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

MariaDBシェルを終了するには、次のように入力します。

  1. exit

この時点で、データベースシステムがセットアップされ、LEMPスタックの最後のコンポーネントであるPHPのインストールに進むことができます。

ステップ3—処理のためのPHPのインストール

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

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

php-fpmおよびphp-mysqlパッケージをインストールするには、次のコマンドを実行します。

  1. sudo apt install php-fpm php-mysql

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

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

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

Debian 10では、Nginxはデフォルトで1つのサーバーブロックを有効にしており、/var/www/htmlのディレクトリからドキュメントを提供するように構成されています。 これは単一のサイトではうまく機能しますが、複数のサイトをホストしている場合は管理が難しくなる可能性があります。 /var/www/htmlを変更する代わりに、 your_domain Webサイトの/var/www内にディレクトリ構造を作成し、/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;
    listen [::]:80;

    root /var/www/your_domain;
    index index.php index.html index.htm;

    server_name your_domain;

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

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

これは、ポート80でリッスンし、作成したWebルートからファイルを提供する基本構成です。 server_nameの後に指定されたホストまたはIPアドレスへのリクエストにのみ応答し、.phpで終わるファイルは、Nginxが結果をユーザーに送信する前にphp-fpmによって処理されます。

注:PHP 7.3とは異なるPHPバージョンを実行している場合は、使用しているPHPバージョンと一致するようにfastcgi_passを調整する必要があります。

編集が終わったら、ファイルを保存して閉じます。 nanoを使用してファイルを作成した場合は、CTRL + Xと入力し、yENTERと入力して確認します。

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

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

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

  1. sudo nginx -t

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

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

  1. sudo systemctl reload nginx

次に、新しいWebルートディレクトリにファイルを作成して、PHP処理をテストします。

ステップ5—構成をテストするための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 + XyENTERの順に入力して、ファイルを保存して閉じます。

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

http://your_domain/info.php

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

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

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

後で必要になった場合は、いつでもこのファイルを再生成できます。 次に、PHP側からデータベース接続をテストします。

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

PHPがMariaDBに接続してデータベースクエリを実行できるかどうかをテストする場合は、ダミーデータを使用してテストテーブルを作成し、PHPスクリプトからその内容をクエリできます。

まず、このガイドのステップ2で作成したデータベースユーザーを使用してMariaDBコンソールに接続します。

  1. mariadb -u example_user -p

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

CREATE TABLE example_database.todo_list (
	item_id INT AUTO_INCREMENT,
	content VARCHAR(255),
	PRIMARY KEY(item_id)
);

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

  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)

テストテーブルに有効なデータがあることを確認したら、MariaDBコンソールを終了できます。

  1. exit

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

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

次のコンテンツを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();
}

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

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

http://your_domain/todo_list.php

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

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

結論

このガイドでは、NginxをWebサーバーとして使用して、訪問者にPHPWebサイトとアプリケーションを提供するための柔軟な基盤を構築しました。 php-fpmを介してPHPリクエストを処理するようにNginxを設定しました。また、ウェブサイトのデータを保存するためにMariaDBデータベースを設定しました。

現在の設定をさらに改善するために、PHPでの依存関係とパッケージ管理のためにComposer インストールできます。また、 Let’sEncryptを使用してWebサイトにOpenSSL証明書インストールできます。 ]。

モバイルバージョンを終了