Linux、Nginx、MySQL、PHP(LEMPスタック)をUbuntu22.04にインストールする方法
序章
LEMPソフトウェアスタックは、動的なWebページおよびPHPで記述されたWebアプリケーションを提供するために使用できるソフトウェアのグループです。 これは、 L inuxオペレーティングシステムとNginx(「 E ngine-X」のように発音されます)Webサーバーを表す頭字語です。 バックエンドデータはM ySQLデータベースに保存され、動的処理は PHPによって処理されます。
このガイドは、Ubuntu22.04サーバーにLEMPスタックをインストールする方法を示しています。 Ubuntuオペレーティングシステムは、スタックのLinux部分を処理します。 残りのコンポーネントを稼働させる方法について説明します。
前提条件
このチュートリアルを完了するには、通常の非 root sudo
ユーザーとしてUbuntu22.04サーバーにアクセスし、サーバーでファイアウォールを有効にする必要があります。 これを設定するには、 Ubuntu22.04の初期サーバー設定ガイドに従ってください。
ステップ1-NginxWebサーバーをインストールする
サイト訪問者にWebページを表示するには、高性能WebサーバーであるNginxを使用します。 このソフトウェアを入手するには、APTパッケージマネージャーを使用します。
このセッションでapt
を使用するのはこれが初めてなので、サーバーのパッケージインデックスを更新することから始めます。
sudo apt update
その後、apt install
を実行してNginxをインストールします。
sudo apt install nginx
プロンプトが表示されたら、Y
とENTER
を押して、Nginxをインストールすることを確認します。 インストールが完了すると、Nginx Webサーバーがアクティブになり、Ubuntu22.04サーバーで実行されます。
ufw
ファイアウォールを有効にしている場合は、初期サーバーセットアップガイドで推奨されているように、Nginxへの接続を許可する必要があります。 Nginxは、インストール時にいくつかの異なるUFWアプリケーションプロファイルを登録します。 利用可能なUFWプロファイルを確認するには、次のコマンドを実行します。
sudo ufw app list
OutputAvailable applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH
必要なトラフィックを引き続き許可する最も制限の厳しいプロファイルを有効にすることをお勧めします。 このガイドではサーバーにSSLを構成していないため、ポート80
で通常のHTTPトラフィックのみを許可する必要があります。
次のコマンドを実行して、これを有効にします。
sudo ufw allow 'Nginx HTTP'
ステータスを確認することで、変更を確認できます。
sudo ufw status
この出力は、HTTPトラフィックが現在許可されていることを示しています。
OutputStatus: 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アドレスがわからない場合は、次のいずれかのコマンドを実行してドメイン名を見つけることができます。
ip addr show
hostname -I
これにより、いくつかのIPアドレスが出力されます。 Webブラウザでそれぞれを順番に試すことができます。
別の方法として、インターネット上の他の場所から見たときに、どのIPアドレスにアクセスできるかを確認できます。
curl -4 icanhazip.com
Webブラウザで受け取ったアドレスを入力すると、Nginxのデフォルトのランディングページに移動します。
http://server_domain_or_IP
このページが表示された場合は、Nginxが正常にインストールされ、WebサーバーのHTTPトラフィックが有効になったことを意味します。
ステップ2—MySQLをインストールする
Webサーバーが稼働しているので、サイトのデータを保存および管理するためのデータベースシステムをインストールする必要があります。 MySQLは、PHP環境で使用される一般的なデータベース管理システムです。
ここでも、apt
を使用して、このソフトウェアを入手してインストールします。
sudo apt install mysql-server
プロンプトが表示されたら、Y
、ENTER
の順に押してインストールを確認します。
インストールが完了したら、MySQLにプリインストールされているセキュリティスクリプトを実行することをお勧めします。 このスクリプトは、いくつかの安全でないデフォルト設定を削除し、データベースシステムへのアクセスをロックダウンします。 次のコマンドを実行して、対話型スクリプトを開始します。
sudo mysql_secure_installation
VALIDATE PASSWORD PLUGIN
を構成するかどうかを尋ねる質問が表示されます。
注:この機能を有効にすることは、判断の呼びかけのようなものです。 有効にすると、指定された基準に一致しないパスワードがMySQLによって拒否され、エラーが発生します。 検証を無効のままにしておくのは安全ですが、データベースの資格情報には常に強力で一意のパスワードを使用する必要があります。
Y
に「はい」と答えるか、有効にせずに続行する場合は次のように答えます。
OutputVALIDATE PASSWORD COMPONENT 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 component? Press y|Y for Yes, any other key for No:
「はい」と答えると、パスワード検証のレベルを選択するように求められます。 最強のレベルで2
と入力すると、数字、大文字と小文字、および特殊文字を含まないパスワードを設定しようとするとエラーが発生することに注意してください。
OutputThere 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
を押して「はい」を選択します。
OutputEstimated 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
キーを押してください。 これにより、一部の匿名ユーザーとテストデータベースが削除され、リモートルートログインが無効になり、これらの新しいルールが読み込まれるため、MySQLは行った変更をすぐに尊重します。
終了したら、MySQLコンソールにログインできるかどうかをテストします。
sudo mysql
これにより、管理データベースユーザー root としてMySQLサーバーに接続されます。これは、このコマンドの実行時にsudo
を使用することで推測されます。 次の出力が表示されます。
OutputWelcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.28-0ubuntu4 (Ubuntu) Copyright (c) 2000, 2022, Oracle and/or its affiliates. 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コンソールを終了するには、次のように記述します。
exit
mysql_secure_installation
スクリプトの実行時にパスワードを定義した場合でも、rootユーザーとして接続するためにパスワードを指定する必要がないことに注意してください。 これは、Ubuntuにインストールした場合、管理用MySQLユーザーのデフォルトの認証方法がパスワードを使用する方法ではなくauth_socket
であるためです。 これは最初はセキュリティ上の懸念のように思われるかもしれませんが、 root MySQLユーザーとしてログインできるのは、sudo
権限を持つシステムユーザーのみであるため、データベースサーバーの安全性が高まります。コンソールから、または同じ権限で実行されているアプリケーションを介して。 つまり、実際には、管理データベースrootユーザーを使用してPHPアプリケーションから接続することはできません。
セキュリティを強化するには、特にサーバーで複数のデータベースをホストする予定の場合は、データベースごとに拡張性の低い特権を持つ専用のユーザーアカウントを設定することをお勧めします。
注:ネイティブMySQLPHPライブラリの特定の古いリリースmysqlnd
は、作成されたユーザーMySQL8のデフォルトの認証方法であるcaching_sha2_authentication
をサポートしていません。 そのため、MySQL 8でPHPアプリケーションのデータベースユーザーを作成する場合は、代わりにmysql_native_password
を使用するように構成されていることを確認する必要があります。 ステップ6でその方法を説明します。
これで、MySQLサーバーがインストールされ、保護されました。 次に、LEMPスタックの最後のコンポーネントであるPHPをインストールします。
ステップ3–PHPのインストール
コンテンツを提供するためにNginxがインストールされ、データを保存および管理するためにMySQLがインストールされています。 これで、PHPをインストールしてコードを処理し、Webサーバーの動的コンテンツを生成できます。
Apacheは各リクエストにPHPインタープリターを埋め込みますが、Nginxには、PHP処理を処理し、PHPインタープリター自体とWebサーバー間のブリッジとして機能する外部プログラムが必要です。 これにより、ほとんどのPHPベースのWebサイトで全体的なパフォーマンスが向上しますが、追加の構成が必要になります。 「PHPfastCGIプロセスマネージャー」の略で、現在のバージョンのPHP(執筆時点)を使用するphp8.1-fpm
をインストールして、処理のためにこのソフトウェアにPHPリクエストを渡すようにNginxに指示する必要があります。 さらに、PHPがMySQLベースのデータベースと通信できるようにするPHPモジュールであるphp-mysql
が必要です。 コアPHPパッケージは、依存関係として自動的にインストールされます。
php8.1-fpm
およびphp-mysql
パッケージをインストールするには、次のコマンドを実行します。
sudo apt install php8.1-fpm php-mysql
プロンプトが表示されたら、Y
およびENTER
を押してインストールを確認します。
これで、PHPコンポーネントがインストールされました。 次に、それらを使用するようにNginxを構成します。
ステップ4—PHPプロセッサを使用するようにNginxを構成する
Nginx Webサーバーを使用する場合、サーバーブロック(Apacheの仮想ホストと同様)を作成して、構成の詳細をカプセル化し、単一のサーバーで複数のドメインをホストできます。 このガイドでは、ドメイン名の例としてyour_domainを使用します。
情報: DigitalOceanでドメイン名を設定する方法の詳細については、 DigitalOceanDNSの概要をご覧ください。
Ubuntu 22.04では、Nginxではデフォルトで1つのサーバーブロックが有効になっており、/var/www/html
のディレクトリからドキュメントを提供するように構成されています。 これは単一のサイトではうまく機能しますが、複数のサイトをホストしている場合は管理が難しくなる可能性があります。 /var/www/html
を変更する代わりに、 your_domain Webサイトの/var/www
内にディレクトリ構造を作成し、/var/www/html
をデフォルトのディレクトリとして残します。クライアントリクエストが他のサイトと一致しない場合に提供されます。
次のように、your_domainのルートWebディレクトリを作成します。
sudo mkdir /var/www/your_domain
次に、$USER
環境変数を使用してディレクトリの所有権を割り当てます。これにより、現在のシステムユーザーが参照されます。
sudo chown -R $USER:$USER /var/www/your_domain
次に、お好みのコマンドラインエディターを使用して、Nginxのsites-available
ディレクトリにある新しい構成ファイルを開きます。 ここでは、nano
を使用します。
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/php8.1-fpm.sock; } location ~ /\.ht { deny all; } }
これらのディレクティブとロケーションブロックのそれぞれの機能は次のとおりです。
listen
—Nginxがリッスンするポートを定義します。 この場合、HTTPのデフォルトポートであるポート80
でリッスンします。root
—このWebサイトによって提供されるファイルが保存されるドキュメントルートを定義します。index
—NginxがこのWebサイトのインデックスファイルに優先順位を付ける順序を定義します。 PHPアプリケーションでメンテナンスランディングページをすばやく設定できるように、index.php
ファイルよりも優先度の高いindex.html
ファイルを一覧表示するのが一般的な方法です。 これらの設定は、アプリケーションのニーズに合わせて調整できます。server_name
—このサーバーブロックが応答するドメイン名やIPアドレスを定義します。 このディレクティブをサーバーのドメイン名またはパブリックIPアドレスにポイントします。location /
—最初のロケーションブロックにはtry_files
ディレクティブが含まれ、URL要求に一致するファイルまたはディレクトリの存在をチェックします。 Nginxが適切なリソースを見つけることができない場合、404エラーを返します。location ~ \.php$
—このロケーションブロックは、Nginxがfastcgi-php.conf
構成ファイルとphp8.1-fpm.sock
ファイルをポイントすることで実際のPHP処理を処理します。このファイルは、php8.1-fpm
に関連付けられているソケットを宣言します。 ]。location ~ /\.ht
—最後のロケーションブロックは、Nginxが処理しない.htaccess
ファイルを処理します。deny all
ディレクティブを追加することにより、.htaccess
ファイルがドキュメントルートにたまたま入った場合、それらは訪問者に提供されません。
編集が終わったら、ファイルを保存して閉じます。 nano
を使用している場合は、CTRL+X
、Y
、ENTER
の順に押して確定します。
Nginxのsites-enabled
ディレクトリから構成ファイルにリンクして、構成をアクティブ化します。
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
次に、/sites-enabled/
ディレクトリからデフォルトの構成ファイルのリンクを解除します。
sudo unlink /etc/nginx/sites-enabled/default
注:デフォルト構成を復元する必要がある場合は、次のようにシンボリックリンクを再作成することで復元できます。
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
これにより、次にリロードされるときに構成を使用するようにNginxに指示されます。 次のコマンドを実行して、構成の構文エラーをテストできます。
sudo nginx -t
エラーが報告された場合は、構成ファイルに戻って内容を確認してから続行してください。
準備ができたら、Nginxをリロードして変更を適用します。
sudo systemctl reload nginx
これで新しいWebサイトがアクティブになりましたが、Webルート/var/www/your_domain
はまだ空です。 その場所にindex.html
ファイルを作成して、新しいサーバーブロックが期待どおりに機能することをテストできるようにします。
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>
次に、ブラウザに移動して、サーバーブロック構成ファイルのserver_name
ディレクティブにリストされているサーバーのドメイン名またはIPアドレスにアクセスします。
http://server_domain_or_IP
次のようなページが表示されます。
このページを受け取った場合は、Nginxサーバーブロックが期待どおりに機能していることを意味します。
index.php
ファイルを設定して置き換えるまで、このファイルをアプリケーションの一時的なランディングページとしてそのままにしておくことができます。 これを行ったら、デフォルトでindex.php
ファイルよりも優先されるため、ドキュメントルートからindex.html
ファイルを削除または名前変更することを忘れないでください。
これで、LEMPスタックが完全に構成されました。 次のステップでは、PHPスクリプトを作成して、Nginxが新しく構成されたWebサイト内の.php
ファイルを実際に処理できることをテストします。
ステップ5–Nginxを使用したPHPのテスト
これで、LEMPスタックが完全にセットアップされました。 これをテストして、Nginxが.php
ファイルをPHPプロセッサに正しく渡すことができることを検証できます。
これを行うには、ドキュメントルートにテストPHPファイルを作成します。 好みのテキストエディタで、ドキュメントルート内にinfo.php
という新しいファイルを開きます。
nano /var/www/your_domain/info.php
次の行を新しいファイルに追加します。 これは、サーバーに関する情報を返す有効なPHPコードです。
/var/www/your_domain/info.php
<?php phpinfo();
終了したら、ファイルを保存して閉じます。
これで、Nginx構成ファイルで設定したドメイン名またはパブリックIPアドレスにアクセスし、続いて/info.php
にアクセスして、Webブラウザーでこのページにアクセスできます。
http://server_domain_or_IP/info.php
サーバーに関する詳細情報を含むWebページが表示されます。
そのページでPHPサーバーに関する関連情報を確認した後、PHP環境とUbuntuサーバーに関する機密情報が含まれているため、作成したファイルを削除することをお勧めします。 rm
を使用して、そのファイルを削除できます。
sudo rm /var/www/your_domain/info.php
後で必要になった場合は、いつでもこのファイルを再生成できます。
ステップ6— PHPからのデータベース接続のテスト(オプション)
PHPがMySQLに接続してデータベースクエリを実行できるかどうかをテストする場合は、ダミーデータを使用してテストテーブルを作成し、PHPスクリプトからその内容をクエリできます。 その前に、テストデータベースとそれにアクセスするように適切に構成された新しいMySQLユーザーを作成する必要があります。
注:ネイティブMySQLPHPライブラリの特定の古いリリースmysqlnd
はサポートされていませんcaching_sha2_authentication
、MySQL8のデフォルトの認証方法です。代わりにmysql_native_password
を使用するように構成されていることを確認する必要があります。
example_databaseという名前のデータベースとexample_userという名前のユーザーを作成しますが、これらの名前を別の値に置き換えることができます。
まず、rootアカウントを使用してMySQLコンソールに接続します。
sudo mysql
新しいデータベースを作成するには、MySQLコンソールから次のコマンドを実行します。
CREATE DATABASE example_database;
これで、新しいユーザーを作成し、作成したカスタムデータベースに対する完全な権限をユーザーに付与できます。
次のコマンドは、デフォルトの認証方法としてmysql_native_password
を使用して、example_user
という名前の新しいユーザーを作成します。 このユーザーのパスワードをpassword
と定義していますが、この値を自分で選択した安全なパスワードに置き換える必要があります。
CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
次に、example_database
データベースに対するこのユーザー権限を付与する必要があります。
GRANT ALL ON example_database.* TO 'example_user'@'%';
これにより、 example_userユーザーにexample_database データベースに対する完全な権限が与えられ、このユーザーがサーバー上で他のデータベースを作成または変更することはできなくなります。
次に、次のコマンドを使用してMySQLシェルを終了します。
exit
今回はカスタムユーザーのクレデンシャルを使用してMySQLコンソールに再度ログインすることにより、新しいユーザーが適切な権限を持っているかどうかをテストできます。 このコマンドの-p
フラグに注意してください。これにより、example_userユーザーの作成時に使用されるパスワードの入力を求められます。
mysql -u example_user -p
MySQLコンソールにログインした後、example_databaseデータベースにアクセスできることを確認します。
SHOW DATABASES;
これにより、次の出力が返されます。
Output+--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)
次に、todo_listという名前のテストテーブルを作成します。 MySQLコンソールから、次のステートメントを実行します。
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)
テストテーブルに有効なデータがあることを確認したら、MySQLコンソールを終了できます。
exit
これで、MySQLに接続してコンテンツをクエリするPHPスクリプトを作成できます。 好みのエディタを使用して、カスタムWebルートディレクトリに新しいPHPファイルを作成します。 そのためにnano
を使用します。
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サイトとアプリケーションを提供するための柔軟な基盤を構築しました。 これはApacheWebサーバーでも実行できます。Ubuntu22.04にLinux、Apache、MySQL、PHP(LAMP)スタックをインストールする方法に関するチュートリアルを確認してください。 また、無料の信頼できる証明書を提供するLet'sEncryptを使用してサイトを保護することもできます。 Let's Encrypt forApacheのガイドでこれを行う方法を学びましょう。