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

提供:Dev Guides
移動先:案内検索

序章

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

LEMPスタックのデータベース層は通常MySQLデータベースサーバーですが、CentOS 8がリリースされる前は、デフォルトのCentOSリポジトリからMySQLを利用できませんでした。 このため、MySQLのコミュニティフォークである MariaDB は、CentOSマシンのLEMPスタックのデフォルトのデータベースシステムとして、MySQLの代替として広く受け入れられるようになりました。 MariaDBは、元のMySQLサーバーのドロップイン代替として機能します。つまり、実際には、アプリケーションで構成やコードを変更することなく、MariaDBに切り替えることができます。

このガイドでは、CentOS8サーバーにLEMPスタックをインストールします。 MySQLはCentOS8のデフォルトのリポジトリから利用できますが、このガイドでは、データベース管理システムとしてMariaDBを使用してLEMPスタックを設定するプロセスについて説明します。

前提条件

このガイドに従うには、sudo権限を持つ非rootユーザーとしてCentOS 8サーバーにアクセスし、サーバーにアクティブなファイアウォールをインストールする必要があります。 これを設定するには、CentOS8初期サーバー設定ガイドに従ってください。

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

サイト訪問者にWebページを表示するために、高性能WebサーバーであるNginxを採用します。 このソフトウェアのインストールには、CentOS8の新しいデフォルトのパッケージマネージャーであるdnfパッケージマネージャーを使用します。

nginxパッケージを次のコマンドでインストールします。

sudo dnf install nginx

プロンプトが表示されたら、yと入力して、nginxをインストールすることを確認します。

インストールが完了したら、次のコマンドを実行してサーバーを有効にして起動します。

sudo systemctl start nginx

サーバーの初期設定ガイドに従ってfirewalldファイアウォールを有効にしている場合は、Nginxへの接続を許可する必要があります。 次のコマンドは、デフォルトでポート80で実行されるHTTP接続を永続的に有効にします。

sudo firewall-cmd --permanent --add-service=http

変更が適用されたことを確認するには、次のコマンドを実行します。

sudo firewall-cmd --permanent --list-all

次のような出力が表示されます。

Outputpublic
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

変更を有効にするには、ファイアウォール構成を再ロードする必要があります。

sudo firewall-cmd --reload

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

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


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

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

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

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

curl -4 icanhazip.com

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

このページが表示されている場合は、Webサーバーが正しくインストールされています。

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

Webサーバーが稼働しているので、サイトのデータを保存および管理できるようにデータベースシステムをインストールする必要があります。 オラクルが元のMySQLサーバーのコミュニティで開発したフォークであるMariaDBをインストールします。

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

sudo dnf install mariadb-server

インストールが完了したら、次のコマンドでMariaDBサーバーを有効にして起動できます。

sudo systemctl start mariadb

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

sudo mysql_secure_installation

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

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

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

終了したら、次のように入力してMariaDBコンソールにログインします。

sudo mysql

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

OutputWelcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.17-MariaDB MariaDB Server

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コンソールから次のコマンドを実行します。

CREATE DATABASE example_database;

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

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

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

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

FLUSH PRIVILEGES;

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

exit

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

mysql -u example_user -p

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

SHOW DATABASES;

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

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

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

exit

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

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

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

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

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

sudo dnf install php-fpm php-mysqlnd

インストールが完了したら、いくつかの設定を調整するために/etc/php-fpm.d/www.confファイルを編集する必要があります。

CentOS8に付属するデフォルトのテキストエディタはviです。 viは非常に強力なテキストエディタですが、経験が不足しているユーザーにとってはやや鈍感になる可能性があります。 CentOS 8サーバーでの構成ファイルの編集を容易にするために、nanoなどのよりユーザーフレンドリーなエディターをインストールすることをお勧めします。

sudo dnf install nano

次に、nanoまたは選択したエディターを使用して、/etc/php-fpm.d/www.conf構成ファイルを開きます。

sudo nano /etc/php-fpm.d/www.conf

次に、userおよびgroupディレクティブを探します。 nanoを使用している場合は、CTRL + Wを押して、開いているファイル内でこれらの用語を検索できます。

/etc/php-fpm.d/www.conf

…
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache
…

user変数とgroup変数の両方がapacheに設定されていることに気付くでしょう。 これらをnginxに変更する必要があります。

/etc/php-fpm.d/www.conf

…
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
…

編集が完了したら、ファイルを保存して閉じます。 nanoを使用している場合は、CTRL + XYENTERの順に押してください。

php-fpmサービスを有効にして開始するには、次のコマンドを実行します。

sudo systemctl start php-fpm

最後に、Nginx Webサーバーを再起動して、php-fpmインストールによって作成された構成ファイルをロードします。

sudo systemctl restart nginx

これで、Webサーバーが完全にセットアップされました。 次のステップでは、PHPテストスクリプトを作成して、すべてが期待どおりに機能することを確認します。

ステップ4—Nginxを使用したPHPのテスト

CentOS 8では、デフォルトのphp-fpmインストールにより、NginxWebサーバーが/usr/share/nginx/htmlにあるデフォルトのドキュメントルートで.phpファイルを処理できるようにする構成ファイルが自動的に作成されます。 PHPがWebサーバー内で正しく機能するために、Nginxの構成を変更する必要はありません。

唯一の調整は、Nginxドキュメントルートフォルダーのデフォルトのアクセス許可設定を変更することです。 このようにして、各コマンドの前にsudoを付ける必要なしに、通常のシステムユーザーでそのディレクトリにファイルを作成および変更できます。

次のコマンドは、デフォルトのNginxドキュメントルートの所有権を sammy というユーザーとグループに変更するため、このコマンドで強調表示されているユーザー名とグループを、システムのユーザー名とグループを反映するように置き換えてください。

sudo chown -R sammy.sammy /usr/share/nginx/html/

次に、テストPHPページを作成して、Webサーバーが期待どおりに機能することを確認します。

/usr/share/nginx/htmlディレクトリにinfo.phpという名前の新しいPHPファイルを作成します。

nano /usr/share/nginx/html/info.php

次のPHPコードは、サーバーで実行されている現在のPHP環境に関する情報を表示します。

/usr/share/nginx/html/info.php

<?php

phpinfo();

終了したら、ファイルを保存して閉じます。

これで、WebサーバーがPHPスクリプトによって生成されたコンテンツを正しく表示できるかどうかをテストできます。 ブラウザに移動し、サーバーのホスト名またはIPアドレスにアクセスし、続いて/info.phpにアクセスします。

http://server_host_or_IP/info.php

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

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

rm /usr/share/nginx/html/info.php

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

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

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

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

mysql -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)
);

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

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)

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

exit

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

nano /usr/share/nginx/html/todo_list.php

次のコンテンツをPHPスクリプトに追加します。

/usr/share/nginx/html/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();
}

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

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

http://server_host_or_IP/todo_list.php

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

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

結論

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