ウェブサイト検索

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


Ubuntu 18.04を使用していませんか?別のバージョンやディストリビューションを選択してください。

紹介

LEMPソフトウェアスタックは、動的ウェブページやウェブアプリケーションを提供するために使用できるソフトウェアのグループです。これは、Linuxオペレーティングシステム、Nginx(「Engine-X」のように発音します)ウェブサーバーを説明する頭字語です。バックエンドデータはMySQLデータベースに保存され、動的処理はPHPによって行われます。

このガイドは、Ubuntu 18.04サーバーにLEMPスタックをインストールする方法を示しています。Ubuntuオペレーティングシステムが最初の要件を満たします。残りのコンポーネントをセットアップして動作させる方法について説明します。

前提条件

このチュートリアルを完了する前に、あなたのサーバーに通常の非ルートユーザーアカウントを持ち、sudo権限が付与されている必要があります。このアカウントの設定は、Ubuntu 18.04の初期サーバー設定ガイドを完了することで行ってください。

ユーザーが利用可能になったら、このガイドに記載されている手順を開始する準備が整います。

ステップ1 – Nginxウェブサーバーのインストール

サイト訪問者にウェブページを表示するために、あなたは最新かつ効率的なウェブサーバーであるNginxを使用します。

この手順で使用されるすべてのソフトウェアは、Ubuntuのデフォルトのパッケージリポジトリから来ます。つまり、必要なインストールを完了するためにaptパッケージ管理スイートを使用することになります。

このセッションで初めて apt を使用するので、最初にサーバーのパッケージインデックスを更新してください:

  1. sudo apt update

次に、サーバーをインストールします:

  1. sudo apt install nginx

Ubuntu 18.04では、Nginxはインストール時に自動的に起動するように設定されています。

初期設定ガイドに記載されているように、ufwファイアウォールが実行されている場合、Nginxへの接続を許可する必要があります。Nginxはインストール時にufwに登録されるため、手続きは非常に簡単です。

望ましいのは、必要なトラフィックを許可する最も制限の厳しいプロファイルを有効にすることです。このガイドではサーバーのSSLを設定していないため、ポート80のトラフィックのみを許可する必要があります。

次のように入力してこれを有効にします:

  1. sudo ufw allow 'Nginx HTTP'

変更を確認するには、ステータスをチェックしてください。

  1. sudo ufw status

このコマンドの出力は、HTTPトラフィックが許可されていることを示します。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

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

サーバーにポイントされたドメイン名がなく、サーバーのパブリックIPアドレスがわからない場合、次のコマンドを実行することで見つけることができます:

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

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

代わりに、インターネット上の他の場所から見たときにどのIPアドレスがアクセス可能かを確認できます:

  1. curl -4 icanhazip.com

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

http://server_domain_or_IP

もし ”Welcome to nginx ”というウェブページを受け取ったなら、Nginxが正常にインストールされたことになります。

ステップ2 – サイトデータを管理するためのMySQLのインストール

ウェブサーバーがあるので、サイトのデータを保存・管理するためにMySQL(データベース管理システム)をインストールする必要があります。

次のコマンドを入力してMySQLをインストールします:

  1. sudo apt install mysql-server

MySQLデータベースソフトウェアは現在インストールされていますが、その設定はまだ完了していません。

インストールを安全にするために、MySQLにはいくつかの安全でないデフォルトを変更するかどうか尋ねるスクリプトが付属しています。次のコマンドを入力してスクリプトを開始します:

  1. sudo mysql_secure_installation

このスクリプトは、VALIDATE PASSWORD PLUGINを設定するかどうかを尋ねます。

警告: この機能を有効にするかどうかは判断が必要です。有効にすると、指定された基準に合わないパスワードは、MySQLによってエラーとともに拒否されます。これは、phpMyAdminのためのUbuntuパッケージのように、MySQLユーザーの認証情報を自動的に設定するソフトウェアと組み合わせて弱いパスワードを使用した場合に問題を引き起こします。検証を無効のままにしておくことは安全ですが、データベースの認証情報には常に強力でユニークなパスワードを使用するべきです。

はいの場合はYと入力し、無効にしたままで続けるにはそれ以外の何かを入力してください。

VALIDATE PASSWORD PLUGIN 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 plugin?

Press y|Y for Yes, any other key for No:

バリデーションを有効にしている場合、スクリプトはパスワードバリデーションのレベルを選択するように求めます。最も強力なレベルの2を入力した場合、数字、大文字、小文字、特殊文字を含まないパスワードや、一般的な辞書の単語に基づいたパスワードを設定しようとするとエラーが発生することに注意してください。

There 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

次に、ルートパスワードを提出して確認するように求められます:

Please set the password for root here.

New password:

Re-enter new password:

残りの質問については、各プロンプトでYを押してENTERキーを押す必要があります。これにより、一部の匿名ユーザーとテストデータベースが削除され、リモートルートログインが無効化され、MySQLが即座に私たちが行った変更を尊重するようにこれらの新しいルールが読み込まれます。

UbuntuシステムでMySQL 5.7(およびそれ以降のバージョン)を実行している場合、root MySQLユーザーはデフォルトでパスワードではなくauth_socketプラグインを使用して認証するように設定されています。これにより、多くの場合、セキュリティと使いやすさが向上しますが、外部プログラム(例:phpMyAdmin)がユーザーにアクセスする必要がある場合は、物事が複雑になることがあります。

auth_socketプラグインを使用してMySQLにアクセスすることがあなたのワークフローに合うなら、ステップ3に進むことができます。しかし、rootとしてMySQLに接続する際にパスワードを使用したい場合は、その認証方法をauth_socketからmysql_native_passwordに切り替える必要があります。これを行うには、ターミナルからMySQLプロンプトを開いてください:

  1. sudo mysql

次に、次のコマンドを使って各MySQLユーザーアカウントが使用している認証方法を確認してください。

  1. SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

この例は、root ユーザーが実際に auth_socket プラグインを使用して認証されることを示しています。root アカウントをパスワードで認証するように設定するには、以下の ALTER USER コマンドを実行してください。password を自分の選んだ強力なパスワードに変更することを忘れないでください:

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

次に、FLUSH PRIVILEGESを実行して、サーバーに権限テーブルを再読み込みし、新しい変更を有効にするように指示します:

  1. FLUSH PRIVILEGES;

各ユーザーが使用している認証方法を再確認し、root がもはや auth_socket プラグインを使用して認証されていないことを確認してください:

  1. SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

この例の出力は、root MySQLユーザーが現在パスワードを使用して認証されていることを示しています。これを自分のサーバーで確認したら、MySQLシェルを終了できます:

  1. exit

注: root MySQLユーザーをパスワードで認証するように設定した後は、以前使用されていた sudo mysql コマンドでMySQLにアクセスできなくなります。その代わりに、次のコマンドを実行する必要があります:

  1. mysql -u root -p

設定したパスワードを入力すると、MySQLプロンプトが表示されます。

この時点で、あなたのデータベースシステムはセットアップされており、PHPのインストールに進むことができます。

ステップ3 - PHPのインストールとNginxをPHPプロセッサーで使用するための設定

Nginx はあなたのページを提供するためにインストールされ、MySQL はあなたのデータを保存・管理するためにインストールされています。しかし、まだ動的コンテンツを生成できるものは何もありません。ここで PHP が登場します。

Nginxは他のウェブサーバーのようなネイティブPHP処理を含まないため、<code>php-fpm</code>(「fastCGIプロセスマネージャー」の略)をインストールする必要があります。その後、NginxにPHPリクエストをこのソフトウェアに処理させるよう指示します。

注意: クラウドプロバイダーによっては、php-fpm パッケージをインストールする前に、Ubuntu コミュニティによって管理されている無料およびオープンソースソフトウェアを含む Ubuntu の universe リポジトリを追加する必要がある場合があります。これを次のコマンドを入力することで行うことができます:

  1. sudo add-apt-repository universe

php-fpm モジュールと追加のヘルパーパッケージである php-mysql をインストールします。これにより、PHPがデータベースバックエンドと通信できるようになります。インストールすると、必要なPHPコアファイルが引き込まれます。以下のコマンドを入力して実行してください:

  1. sudo apt install php-fpm php-mysql

LEMPスタックの必要なコンポーネントがすべてインストールされていても、Nginxに動的コンテンツにPHPプロセッサを使用するように指示するためにいくつかの設定変更を行う必要があります。

これはサーバーブロックレベルで行われます(サーバーブロックはApacheの仮想ホストに似ています)。これを行うには、お好みのテキストエディタを使用して/etc/nginx/sites-available/ディレクトリ内に新しいサーバーブロック構成ファイルを作成します。この例では、nanoを使用し、新しいサーバーブロック構成ファイルにyour_domainと記載するため、自分の情報に置き換えてください:

  1. sudo nano /etc/nginx/sites-available/your_domain

既存のデフォルトの設定ファイルを編集するのではなく、新しいサーバーブロックの設定ファイルを作成することで、必要に応じてデフォルトの設定を復元することができます。

デフォルトのサーバーブロック設定ファイルから取得し、わずかに修正された以下の内容を新しいサーバーブロック設定ファイルに追加してください:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name your_domain;

        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がリッスンするポートを定義します。この場合、HTTPのデフォルトポートである80にリッスンします。
  • root — サイトによって提供されるファイルが保存されているドキュメントルートを定義します。
  • index — Nginxを設定して、インデックスファイルが要求されたときに利用可能であれば、index.phpという名前のファイルを優先して提供するようにします。
  • server_name — あなたのサーバーに対するリクエストに対して、どのサーバーブロックを使用すべきかを定義します。このディレクティブをあなたのサーバーのドメイン名またはパブリックIPアドレスに指し示してください。
  • location / — 最初の location ブロックには try_files ディレクティブが含まれています。これは、URI リクエストに一致するファイルの存在をチェックします。Nginx が適切なファイルを見つけられない場合、404 エラーを返します。
  • location ~ \.php$ — このロケーションブロックは、Nginxがfastcgi-php.conf設定ファイルとphp7.2-fpm.sockファイルを指し示すことによって、実際のPHP処理を処理します。このファイルでは、どのソケットがphp-fpmに関連付けられているかが宣言されています。
  • location ~ /\.ht — 最後のロケーションブロックは、Nginx が処理しない .htaccess ファイルに関連しています。deny all ディレクティブを追加することで、もし .htaccess ファイルがドキュメントルートに入ってしまった場合でも、訪問者に提供されることはありません。

この内容を追加した後、ファイルを保存して閉じます。nanoを使用している場合は、CTRL + Xを押してからYとENTERを押すことでこれを行えます。新しいサーバーブロックを有効にするには、新しいサーバーブロック設定ファイル(/etc/nginx/sites-available/ディレクトリ内)から/etc/nginx/sites-enabled/ディレクトリへのシンボリックリンクを作成します。

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

次に、/sites-enabled/ディレクトリからデフォルトの設定ファイルのリンクを解除します:

  1. sudo unlink /etc/nginx/sites-enabled/default

注: 既定の設定を復元する必要がある場合は、以下のようなコマンドを使用してシンボリックリンクを再作成することで可能です:

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

新しい設定ファイルの構文エラーをテストしてください:

  1. sudo nginx -t

エラーが報告された場合は、続行する前にファイルを再確認してください。

準備ができたら、必要な変更を行うためにNginxを再読み込みしてください。

  1. sudo systemctl reload nginx

これでLEMPスタックのインストールと設定が完了しました。ただし、すべてのコンポーネントが互いに通信できることを確認することが賢明です。

ステップ4 – 設定をテストするためのPHPファイルを作成する

LEMPスタックは今や完全にセットアップされているはずです。Nginxが.phpファイルをPHPプロセッサに正しく渡せるかどうかを確認するためにテストできます。

これを行うには、お好みのテキストエディタを使用して、ドキュメントルートに info.php という名前のテストPHPファイルを作成してください。

  1. sudo nano /var/www/html/info.php

次の行を新しいファイルに入力してください。これは、サーバーに関する情報を返す有効なPHPコードです:

<?php
phpinfo();

終わったら、ファイルを保存して閉じてください。

今、あなたはサーバーのドメイン名またはパブリックIPアドレスに /info.php を付けて、このページをウェブブラウザで訪れることができます:

http://your_server_domain_or_IP/info.php

あなたのブラウザは、サーバーに関する情報をPHPで生成した次のようなウェブページを読み込みます:

あなたのページが説明した通りであれば、NginxでPHP処理を正常に設定しています。

Nginxがページを正しくレンダリングしていることを確認した後は、作成したファイルを削除するのが最良です。このファイルは、無許可のユーザーに設定についてのヒントを与える可能性があり、侵入を試みる手助けになるかもしれません。必要になった場合は、後でこのファイルを再生成することができます。

とりあえず、ファイルを削除してください。

  1. sudo rm /var/www/html/info.php

これで、あなたのUbuntu 18.04サーバーに完全に設定され、機能しているLEMPスタックがあります。

結論

LEMPスタックは、サーバーからほぼどんなウェブサイトやアプリケーションも設定し、提供することを可能にする強力なプラットフォームです。

ここから取ることができる次のステップはいくつかあります。たとえば、サーバーへの接続が安全であることを確認する必要があります。この目的のために、NginxのインストールをLet’s Encryptで保護することができます。このガイドに従うことで、サーバーのための無料のTLS/SSL証明書を取得し、HTTPSを介してコンテンツを配信できるようになります。

関連記事: