はじめに
インターネットの世界では、いくつかの技術が組み合わさることで、インターネットユーザーがワールドワイドウェブ上で動的なコンテンツにアクセスできるようにするソリューションが形成されています。LEMPスタックは、そうしたソリューションの1つです。これは、高性能で動的なウェブサイトのための完全なサーバーソリューションを構成する4つの技術を組み合わせたものです。LEMPは、Linux、Nginx、MySQL、PHPの頭文字をとったものです。Linuxはサーバーのオペレーティングシステムです。 Nginx(エンジンエックスと発音されるため、アクロニムのEに対応します)はウェブサーバーソフトウェアです。次に、 MySQLはウェブサイトとユーザーのデータを保持するデータベースシステムです。PHPは動的処理のためのサーバーサイドスクリプト言語です。
このチュートリアルでは、LEMPスタックのインストールと設定方法、そしてすべてが期待通りに動作しているかを確認する手順を説明します。それでは始めましょう!
ステップ 1: Ubuntu 20.04でのサーバーの設定
Ubuntu 20.04はLinuxベースのオペレーティングシステムです。世の中にはいくつかのLinuxベースのサーバー オペレーティングシステムが存在し、それには無料のものやプレミアムなものが含まれます。このガイドでは、無料かつオープンソースであるUbuntu 20.04に焦点を当てます。このステップでは、LEMPスタックの頭文字の最初の要件である「L」を処理します。次のステップに進むには、VPSに実際のUbuntu 20.04 がインストールされている必要があります。次のガイドに従って、Ubuntuサーバーのセットアップ を行うことができます。また、オプションとして、このガイドをローカルコンピューターで進めたい場合は、Ubuntu 20.04サーバーのインストールイメージを直接Ubuntu のウェブサイトからダウンロードすることもできます。sudo権限を必要とするコマンドをいくつか実行するため、sudo権限を持つ通常の非rootユーザーを設定する必要があります。
ステップ 2: Nginxサーバーのインストールと設定
ウェブサーバーを使用すると、ウェブページなどのコンテンツをウェブサイトの訪問者に提供できます。Nginxは人気のウェブサーバーであり、開発者に好まれているトップ5のオープンソース ウェブサーバーの1つです。このステップでは、LEMPスタックの2番目の要件であるNginxの「E」を処理します。Ubuntuにはデフォルトのパッケージリポジトリがあり、このガイドで使用するパッケージはそこから取得します。UbuntuはDebianベースであり、パッケージの管理にはaptまたはdpkgを使用します。デフォルトリポジトリからのパッケージには、aptを使用します。
経験則として、Linuxシステムでインストールを開始する前には、必ずアップデートコマンドを実行する必要があります。まず、ターミナルで次のコマンドを入力します。
|
1 |
sudo apt update |
アップデートが完了したら、次のコマンドでNginxをインストールできます。
|
1 |
sudo apt install nginx |
インストールが完了すると、Nginxは自動的に起動します。次のステップは、トラフィックを許可するようにファイアウォールを設定することです。Ubuntuはファイアウォールの設定にufw (Uncomplicated Firewall)パッケージを使用します。インストール後、Nginxはufwにサービスとして自身を登録します。Ubuntuはシステム起動時にファイアウォールサービスを自動的に開始しますが、念のため、次のコマンドを入力して有効にします。
|
1 |
sudo ufw enable |
ufwが許可しているアプリケーション設定の一覧を表示するには、次のコマンドを入力します。
|
1 |
sudo ufw app list |
以下は、上記のコマンドの出力を示すスクリーンショットです。

ご覧の通り、Nginxはすでにufwに登録されており、以下で説明する3つのプロファイルを持っています。
- Nginx Full – ポート80と443の両方を開きます。ポート80は通常の暗号化されていないトラフィック(HTTP)用です。ポート443はTLS/SSLで暗号化されたトラフィック(https)用です。
- Nginx HTTP – ポート80のみを開きます(暗号化されていないトラフィック)。
- Nginx HTTPS – ポート443のみを開きます(TLS/SSL暗号化トラフィック)。
Nginxはufwに自動登録されますが、自分で許可を設定するまではサーバーへのトラフィックは許可されません。すべてのプロファイル、または一部 of プロファイルを許可することを選択できますが、ウェブサーバー用に設定したトラフィックを許可しつつ、最も制限の厳しいプロファイルを許可することをお勧めします。このチュートリアルではSSLを設定していないため、ポート80でのHTTPトラフィックのみを許可します。ご興味がある場合は、Certbotを使用してLet's EncryptからNginxサーバーにSSLを設定するガイドも用意しています。
次のコマンドを入力して、ポート80のトラフィックを有効にしましょう:
|
1 |
sudo ufw allow 'Nginx HTTP' |
変更が成功したことを確認するには、次のコマンドを入力します:
|
1 |
sudo ufw status |

コマンドを実行した上記の出力は、HTTPトラフィックが許可されたことを示しています。ブラウザでドメインまたはサーバーのパブリックIPにアクセスして、サーバーが動作しているかどうかを確認できます。ドメイン名を設定しておらず、サーバーのパブリックIPアドレスがわからない場合は、curl を使用して、次のコマンドを実行することで見つけることができます:
|
1 |
curl -4 icanhazip.com |
上記のコマンドの出力(パブリックIPアドレス)をブラウザのアドレスバーにコピーします。ページを読み込むと、デフォルトのNginxランディングページが表示されます:

上記のページは、Nginxが正常にインストールされたことを示しています。
ステップ3:MySQLデータベース管理システムのインストール
データ管理は、あらゆる動的ウェブサイトの重要な部分です。MySQLは、ウェブサイトのデータを保存および管理するデータベース管理システムです。このステップでは、LEMPスタックの3番目の要件である「M」を処理します。次のコマンドを入力してMySQLをインストールします:
|
1 |
sudo apt install mysql-server |
MySQLのインストールが完了したら、使用する前に設定を行う必要があります。設定の一部には、データベースサーバーのセキュリティ保護が含まれます。MySQLには、セキュリティ保護とパスワードの設定を案内するスクリプトが付属しています。次のコマンドでスクリプトを開始します:
|
1 |
sudo mysql_secure_installation |

スクリプトは、VALIDATE PASSWORD(パスワード検証)コンポーネントをセットアップするか、または任意の文字を押してコンポーネントを有効にせずに続行するかを尋ねます。
VALIDATE PASSWORDコンポーネントは、データベースサーバー上の特定のユーザーに対して入力したパスワードが、特定の基準に一致しているかどうかをチェックするために使用される機能です。長さ、数字、大文字または小文字の有無などをチェックするように設定できます。有効にしていない場合は、任意のパスワードを設定できます。ただし、有効にした場合は、指定した基準に一致するパスワードを使用する必要があります。これを有効にすると、Ubuntu用のphpMyAdminパッケージなど、MySQLのユーザー資格情報を自動的に設定するパッケージで問題が発生する可能性があります。有効にするかどうかは個人の選択です。有効にしなくてもデータベースは安全ですが、強力でユニークなパスワードを使用するようにしてください。
コンポーネントを有効にするために「Y」を押した場合、スクリプトはパスワード検証のレベルを選択するように求めます:

スクリプトは3つのレベルのパスワード検証を提供します。LOWレベルでは、パスワードに8文字以上のみを含める必要があります。MEDIUMレベルでは、パスワードに8文字以上を含め、大文字、小文字、特殊文字を混在させる必要があります。STRONGレベルでは、8文字以上の複雑なパスワードが必要で、大文字、小文字、特殊文字、単語を混在させ、一般的な辞書の単語に基づかないものである必要があります。そうでない場合はエラーが発生します。ここではLowレベルを選択し、「0」を入力してEnterキーを押しましょう。
スクリプトは、パスワードの入力と再入力を求めます:

「y」を入力してEnterキーを押し、入力したパスワードをrootパスワードとして受け入れます。その後のプロンプトは、MySQLサーバーのセキュリティを向上させるためのものです。まず、すべてのMySQLインストールに付属しているデフォルトの匿名ユーザーの削除、リモート接続からのrootログインの無効化、およびテストデータベースの削除から始まります。最後のプロンプトでは、コマンドを有効にするために権限テーブルをリロードするかどうかを尋ねられます。すべてのプロンプトに対して「y」を入力してEnterキーを押します:

初期のセキュリティ設定が完了しました。
次のコマンドを実行して、インストールしたMySQLのバージョンを確認できます:
|
1 |
sudo mysql –V |
このチュートリアルで使用しているバージョンは次のとおりです:
![]()
MySQLバージョン5.7以降を実行しているUbuntuシステムでは、rootユーザーはパスワードではなくauth_socketプラグインを使用して認証するように設定されています。これによりセキュリティは向上しますが、phpMyAdminパッケージなどの外部パッケージで問題が発生する可能性があります。auth_socketプラグインの使用を継続する場合は、ステップ4に進んでください。
代わりにパスワードを使用して接続したい場合は、認証方法をmysql_native_passwordを使用するように設定する必要があります。
次のコマンドを入力してMySQLプロンプトを開始します。
|
1 |
sudo mysql |
MySQLには、いくつかのデフォルトのデータベースが付属しています。ターミナルで次のクエリを入力すると、デフォルトのデータベースの一覧を表示できます。
|
1 |
show databases; |

mysqlと呼ばれるデータベースには、いくつかのMySQL関連の設定が保存されています。このデータベースには、ユーザーの詳細とそれぞれの認証方法が格納されたusersというテーブルがあります。テーブルから情報を取得、変更、削除するために、SQLクエリを使用できます。各ユーザーがどの認証方法を使用しているか詳細を確認するには、ターミナルで次のクエリを入力します。
|
1 |
SELECT user, authentication_string, plugin, host FROM mysql.user; |

上記の出力は、rootユーザーが実際にはauth_socketプラグインを使用して認証していることを示しています。rootユーザーの認証方法を変更するには、ターミナルで次のステートメントを入力します。前のステップで設定した中レベルのパスワード強度に一致するように変更することを忘れないでください。そうしないとエラーが発生します。
|
1 |
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword'; |
クエリが正常に実行されたら、変更をすぐに反映させるためにflush privilegesコマンドを実行します。
|
1 |
FLUSH PRIVILEGES; |
変更が反映されたかどうかを確認するために、もう一度以下のselectステートメントを実行します。
|
1 |
SELECT user,authentication_string,plugin,host FROM mysql.user; |

出力から、rootユーザーがmysql_native_passwordを使用して認証されるようになったことがわかります。exitと入力してEnterキーを押すことで、mysqlプロンプトを終了できます。
次のコマンドを入力して、設定したパスワードでログインを試みることができます。
|
1 |
mysql -u root –p |
プロンプトでパスワードを求められます。パスワードが一致すると、MySQLプロンプトが表示されます。これでMySQLを使用したサーバーのセットアップが正常に完了しました。次に、MySQLプロンプトを終了します。
ステップ4:PHPのインストールとPHPプロセッサを使用するためのNginxの設定
PHPは、PHP: Hypertext Preprocessorの略称です。これは、WebサイトやWebアプリケーションで広く使用されているオープンソースのサーバーサイドスクリプト言語です。PHPは、LEMPスタックにおける4番目の要件を担います。PHPは、Webサイト上で動的なコンテンツを生成するのに役立ちます。Webページとデータベースシステムの間の仲介役として使用できます。データベースからデータを読み取り、Webサイトの訪問者に提示します。さらに、データベースからのデータの挿入、更新、削除も可能です。
Nginxには他のWebサーバーのようなネイティブのPHP処理プラグインがないため、NginxからPHPにリクエストを渡して処理するためにphp-fpmをインストールする必要があります。まず、Ubuntuのコミュニティによってメンテナンスされている無料のオープンソースソフトウェアが含まれるUbuntu universeリポジトリを追加します。ターミナルで次のコマンドを入力します。
|
1 |
sudo add-apt-repository universe |
次に、以下のコマンドを使用して、PHPがMySQLと通信できるようにするためのphp-mysqlヘルパーパッケージと一緒にphp-fpmパッケージをインストールします。
|
1 |
sudo apt install php-fpm php-mysql |
このガイドの執筆時点では、上記のコマンドからインストールされるPHPのバージョンは7.2.24です。そのため、php-fpm7.2 packageがインストールされます。サーバーブロックを更新する際はこの点に注意し、正しいバージョンを入力してください。そうしないとページが読み込まれません。
次のコマンドを入力して、PHPのバージョンを確認できます。
|
1 |
php -v |

この時点で、LEMPスタックのすべてのコンポーネントがインストールされました。次に行う必要があるのは、リクエストをPHPプロセッサに転送するようにNginxを設定することです。Nginxでは、設定はサーバーブロック内で行われます。サーバーブロックはApacheのバーチャルホストに相当します。詳細については、Nginxサーバーブロックに関するチュートリアルをご覧ください。
このチュートリアルでは、同名のtest.comドメイン用のサーバーブロックを作成しましょう。名前は自由に変更して構いません。サーバーブロックは /etc/nginx/sites-available/ ディレクトリにあります。次のコマンドを入力し、nanoを使用してサーバーブロックファイルを作成します。
|
1 |
sudo nano /etc/nginx/sites-available/test.com |
ファイルに次のスクリプトを入力します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
server { listen 80; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name test.com; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } } |
各ディレクティブの機能の簡単な説明は次のとおりです。
- listen – Nginxがリッスンするポートを定義します。ポート80がデフォルトのポートですが、SSLを設定している場合は443を指定します。
- root – サイトのディレクトリが保存されるディレクトリを指定します。
- index – リクエストがあった場合に、index.phpファイルが利用可能であれば、それを優先して提供するようにNginxに指示します。
- server_name – サーバーブロックの名前を定義します。ここにはサーバーのパブリックIPアドレスまたはドメイン名が入ります。
- location/ – 最初のlocationブロックにはtry_filesディレクティブがあります。これはURIリクエストに一致するファイルの存在を確認し、見つからない場合は404エラーを返します。
- location ~ \.php$ – このディレクティブは、Nginxのリクエストをfastcgi-php.confファイルと、php-fpmに関連付けるソケットを定義するphp7.2-fpm.sockファイルに転送することで、PHPの処理を処理します。このコマンドはphp-fpmのステータスを確認します。ここではインストールされているバージョンである7.2を指定しています。ご自身のバージョンに合わせて確認してください。
|
1 |
sudo service php7.2-fpm status |
- location ~ /\.ht – このディレクティブは、Nginxでは処理されない.htaccessファイルを処理します。deny allディレクティブにより、訪問者にhtaccessファイルが提供されないようにします。
test.comファイルにスクリプトを追加した後、Ctrl + Oを入力し、Enterキーを押してファイルを保存します。Ctrl + Xを入力してエディタを閉じます。
次に、以下のコマンドを入力して/etc/nginx/sites-enabledへのシンボリックリンクを作成し、サーバーブロックを有効にする必要があります。
|
1 |
sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/ |
次に、以下のコマンドを入力して、デフォルトのサーバーブロックをsites-enabledからアンリンクします。
|
1 |
sudo unlink /etc/nginx/sites-enabled/default |
以下のコマンドを入力して、新しい設定をテストします。
|
1 |
sudo nginx -t |
構文に問題がなければ、次のコマンドでNginxをリロードします。
|
1 |
sudo systemctl reload nginx |
この段階で、LEMPスタックのインストールと設定が完了しました。次のステップでは、各コンポーネントが正常に接続されているか確認するために、テストファイルを作成します。
ステップ 5: LEMPスタックをテストするためのPHPファイルの作成
このステップでは、.phpファイルを作成してNginxサーバー上で実行し、正常に動作するかどうかを確認します。グローバルなphpinfo()関数を使用して、利用可能なPHPパッケージを確認します。次のコマンドを入力して、nanoで.phpファイルを開きます。
|
1 |
sudo nano /var/www/html/test.php |
nanoエディタで、次のコードスニペットを入力します。
|
1 |
<?php phpinfo(); |
ファイルを保存して閉じます。ブラウザで作成したページにアクセスするには、ドメインまたはIPアドレスを確認し、次のようにアクセスします。
|
1 |
http://your_server_domain_or_IP/test.php |
PHP情報ページが表示されるはずです。

上記のページが表示されれば、Nginxのセットアップは成功です。テスト用に作成したファイルにはサーバーの詳細な情報が含まれているため、必ず削除してください。次のコマンドを入力してファイルを削除します。
|
1 |
sudo rm /var/www/html/test.php |
将来的に設定をテストする必要がある場合は、いつでもこのファイルを再作成できます。
まとめ
このチュートリアルでは、最も強力なWebアプリケーション開発スタックの1つであるLEMPスタックをUbuntu 20.04に設定しました。ここから、ほぼすべてのWebサイト、Webアプリ、またはモバイルアプリケーション用のサーバーサイドロジックをホストできるようになります。Webサイトが安全なSSL接続を介してコンテンツを提供できるように、NginxサーバーでのSSL証明書の設定に関するチュートリアルを用意していますので、ぜひご覧になることをお勧めします。
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。