CentOS8にLinux、Nginx、MySQL、PHP(LEMP)スタックをインストールする方法
序章
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 + X
、Y
、ENTER
の順に押してください。
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データベースを設定しました。