One place for hosting & domains

      2004にインストールする方法

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


      はじめに

      LEMPソフトウェアスタックは、PHPで記述された動的WebページとWebアプリケーションの提供に使用できるソフトウェアのグループです。これは、Nginx(「 Engine-X」と発音)Webサーバーを備えたL ** inuxオペレーティングシステムを表す頭字語です。バックエンドデータはMySQLデータベースに保存されており、動的コンテンツはP**HPが処理を行います。 

      このガイドは、Ubuntu 20.04サーバーにLEMPスタックをインストールする方法を示します。Ubuntuオペレーティングシステムが最初の要件を処理します。ここでは、残りのコンポーネントを起動して実行する方法を説明します。

      前提条件

      このチュートリアルを完了するには、Ubuntu 20.04サーバーに通常のroot以外のsudoユーザーとしてアクセス可能で、サーバーでファイアウォールが有効になっている必要があります。 これをセットアップするには、Ubuntu 20.04 初期サーバーセットアップ設定ガイドを参照してください。

      ステップ1 – Nginx Webサーバーのインストール

      サイト訪問者にWebページを表示するために、高性能なWebサーバーであるNginxを採用します。aptパッケージマネージャーを使用して、このソフトウェアを入手します。

      ここで初めてaptを使用するので、サーバーのパッケージインデックスを更新することから始めます。 その後、apt installを使用してNginxをインストールします。

      • sudo apt update
      • sudo apt install nginx

      Nginxをインストールするか確認を求められたら、Y を入力します。インストールが完了すると、Ubuntu 20.04サーバー上でNginx Webサーバーはアクティブになり、稼働します。

      初期セットアップガイドでも推奨されているように、ufw ファイアウォールを有効にしている場合は、Nginxへの接続を許可する必要があります。Nginxには、インストール時にufwアプリケーションプロファイルがいくつか登録されています。使用可能なUFWプロファイルを確認するには、次を実行します。

      Output

      Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

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

      次を入力してこれを有効にします。

      • sudo ufw allow 'Nginx HTTP'

      次のコマンドを実行して、変更を確認できます。

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

      Output

      Status: 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 eth0 | grep inet | awk '{ print $2; }' | sed 's//.*$//'

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

      別の方法として、インターネット上の他の場所から表示されるアクセス可能なIPアドレスを確認できます。

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

      http://server_domain_or_IP
      

      Nginxデフォルトページ

      このページが表示されたら、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と回答し、有効化せずに続行する場合は他の回答にしてください。

      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
      

      VALIDATE PASSWORD PLUGINを設定したかどうかに関わらず、サーバーから次にMySQLrootユーザーのパスワードを選択して確認するよう求められます。これはシステムrootと混同されません。データベースrootユーザーは、データベースシステム上の権限を持つ管理ユーザーです。MySQL rootユーザーのデフォルト認証方法はパスワードを使用しませんが、1つが設定されている場合でも、追加の安全対策としてここで強力なパスワードを定義する必要があります。この点については後でお話します。

      パスワード検証を有効にした場合は、入力したrootパスワードのパスワード強度が表示されます。お使いのサーバーからそのパスワードで続行するかどうか尋ねられます。現在のパスワードでよければ、画面の表示でYと入力します。

      Estimated 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キーを押します。これにより、一部の匿名ユーザーとテストデータベースを削除し、リモートrootログインを無効にし、MySQLが行なった変更をすぐに反映できるようにこれらの新しいルールをロードします。

      完了したら、次を入力してMySQLコンソールにログインできるかどうかをテストします。

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

      Output

      Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 22 Server version: 8.0.19-0ubuntu5 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. 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コンソールを終了するには、次のように入力します。

      mysql_secure_installationスクリプトを実行する際にパスワードを定義しているにもかかわらず、rootユーザーとして接続するためにパスワードを指定する必要がないことに注意してください。これは、管理者MySQLユーザーのデフォルトの認証方法が、passwordではなくunixsocketであるためです。これはセキュリティ上の問題のように見えるかもしれませんが、MySQLのrootユーザーとしてログインできるのは、sudo権限を持つシステムユーザーのみであり、コンソールから接続するか、同じ権限を持つアプリケーションを介して接続することができるため、データベースサーバーをより安全なものにしています。実用的な意味では、管理データベースのrootユーザーを使用してPHPアプリケーションから接続することができないということになります。root MySQLアカウントにパスワードを設定することは、デフォルトの認証方法が`unixsocketからpasswordに変更された場合のセーフガードとして機能します。`

      セキュリティを強化するためには、特にサーバー上に複数のデータベースをホストしている場合は、データベースごとに拡張性の低い専用のユーザーアカウントを設定しておくとよいでしょう。

      *注: *執筆時点では、ネイティブのMySQL PHPライブラリmysqlndは、MySQL 8のデフォルトの認証方法であるcaching_sha2_authenticationをサポートしていません。そのため、MySQL 8でPHPアプリケーションのデータベースユーザーを作成する際には、代わりにmysql_native_passwordを使用するように設定されていることを確認する必要があります。ステップ6でその方法について説明します。

      これで MySQL サーバーがインストールされ、セキュリティが確保されました。次に、LEMPスタックの最後のコンポーネント、PHPをインストールします。

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

      コンテンツを提供するNginxがインストールされ、データを保存および管理するMySQLがインストールされました。今度はコードを処理し、Webサーバーに動的コンテンツを生成するPHPをインストールします。 

      ApacheがPHPインタプリタを各リクエストに組み込むのに対し、Nginxは、PHP処理を行い、PHPインタプリタ自体とWebサーバーとの懸け橋として動作する外部プログラムを必要とします。これにより、ほとんどのPHPベースのWebサイトで全体的なパフォーマンスが向上できますが、追加設定が必要です。「PHP fastCGIプロセスマネージャー」を表すphp-fpmをインストールし、このソフトウェアにPHPリクエストを渡すよう、Nginxに指示します。また、PHPとMySQLベースのデータベースとの通信を可能にするPHPモジュールphp-mysqlも必要です。 コアとなるPHPパッケージは依存関係として自動的にインストールされます。

      php-fpmphp-mysqlパッケージをインストールするには、次を実行します。

      • sudo apt install php-fpm php-mysql

      インストールするか確認を求められたら、YENTERキーを押します。

      これで、PHPコンポーネントがインストールされました。次に、Nginxを設定して使用します。

      ステップ4 — PHPプロセッサを使用するためのNginxの設定

      Nginx Webサーバーを使用する場合、server blocks(Apacheの仮想ホストに類似)を作成すると、詳細設定をカプセル化して、単一サーバーで複数のドメインのホストが可能になります。   このガイドでは、your_domainをドメイン名の例として使用します。 DigitalOceanを使用したドメイン名の設定の詳細については、DigitalOcean DNSの紹介をご覧ください。

      Ubuntu 20.04のNginxには、デフォルトで有効になっているサーバーブロックが1つあり、/var/ www/html 内のディレクトリからドキュメントを提供するように設定されています。これは単一のサイトではうまく機能しますが、複数のサイトをホストしている場合は扱いにくいことがあります。var/www/htmlを修正する代わりに、クライアントのリクエストが他のサイトと一致しない場合に表示されるデフォルトのディレクトリとして/var/www/htmlをそのまま残し、/var/www内にyour_domainWebサイトのディレクトリ構造を作成します。       

      your_domainのroot 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

      これにより、新しい空白ファイルを作成します。次のbare-bones 設定に貼り付けます。

      /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/php7.4-fpm.sock;
           }
      
          location ~ /.ht {
              deny all;
          }
      
      }
      
      
      

      これらの各ディレクティブとロケーションブロックの機能は次のとおりです。

      • listenーNginxがリッスンするポートを定義します。この場合、HTTPのデフォルトポートであるポート80でリッスンします。
      • root — Webサイトが提供するファイルが保存されるドキュメントルートを定義します。
      • index — Nginxが優先するWebサイトのインデックスファイルの順位を定義します。PHPアプリケーションでメンテナンスランディングページを手早くセットアップできるように、index.htmlファイルの優先順位はindex.phpファイルより高いのが一般的です。 アプリケーションニーズに合わせてこれらの設定を調整できます。
      • server_name — このサーバーブロックがどのドメイン名および/またはIPアドレスに応答するかを定義します。このディレクティブをサーバーのドメイン名またはパブリックIPアドレスに指定します
      • location / — 最初のロケーションブロックに含まれるtry_filesは、URIリクエストに一致するファイル やディレクトリをチェックします。Nginxが該当するリソースを見つけられない場合、404エラーを返します。
      • location ~ .php$ーこのロケーションブロックは、実際のPHP処理を行い、Nginxを設定ファイルfastcgi-php.confとソケットファイルphp7.4-fpm.sockに接続します。php7.4-fpm.sockはphp-fpmと関連付けされたソケットを宣言します。
      • location ~ /.ht — 最後のロケーションブロックは、Nginxが処理しない.htaccessファイルを処理します。deny allディレクティブを追加することにより、.htaccessファイルがたまたまドキュメントルートを見つけても、訪問者がアクセスできないようにします。  

      編集が完了したら、ファイルを保存して閉じます。 nanoを使用した場合は、CTRL + XYENTERキーを押します。

      Nginxのsites-enabledディレクトリから、設定ファイルにリンクして設定を有効化します。

      • sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

      これは、Nginxが次回のリロード時にこの設定を使用するよう、Nginxに指示するものです。 次を入力して新しい設定に構文エラーがないかテストします。

      エラーが報告された場合は、設定ファイルに戻って内容を再確認してから続行してください。 

      準備ができたら、Nginxをリロードして変更を反映します。

      • sudo systemctl reload nginx

      新しいWebサイトはアクティブになりましたが、Web root /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サーバーブロック

      このページが表示されたら、お使いのNginxサーバーブロックが期待通りに動作していることを意味します。

      このファイルは、index.phpファイルを置き換えるために設定するまでの間、アプリケーションの一時的なランディングページとして残しておくことができます。設定したら、忘れずにindex.html ファイルをドキュメントrootから削除するか、名前を変更してください。デフォルトではindex.phpファイルよりも優先されます。

      これでLEMPスタックの設定は完了です。次のステップでは、Nginxが新たに設定したWebサイトで.phpファイルを実際に処理できるかテストするPHPスクリプトを作成します。

      ステップ5 – Nginxを使用したPHPテスト

      これでLEMPスタックは完全にセットアップされました。Nginxが問題なく php ファイルをPHPプロセッサに渡せるか、検証テストを実施します。 

      これを行うには、ドキュメントrootにテストPHPファイルを作成します。テキストエディターで、ドキュメントルートに info.phpという名前の新しいファイルを開きます。

      • nano /var/www/your_domain/info.php

      新しいファイルに次の行を入力するか貼り付けます。 これは、サーバー情報を返す有効なPHPコードです。

      /var/www/your_domain/info.php

      <?php
      phpinfo();
      

      完了したら、CTRL+XYENTERキーの順に押してファイルを保存して閉じます。

      これで、Webサイトに設定されているドメイン名またはパブリックIPアドレスの後に/info.phpを続けて、このページにアクセスすることができるようになりました。

      http://server_domain_or_IP/info.php
      

      サーバーに関する詳細情報が載ったWebページが表示されます。

      PHPInfo Ubuntu 20.04

      このページ上のPHPサーバーに関する情報を確認した後は、作成したファイルにはPHP環境およびUbuntuサーバーに関する機密情報が含まれているため、削除しておいた方がよいでしょう。rmを使用して、ファイルを削除できます。

      • sudo rm /var/www/your_domain/info.php

      後で必要になった場合は、いつでもこのファイルを再生成できます。

      ステップ6 — PHPからデータベース接続をテストする(オプション)

      PHPがMySQLに接続してデータベースクエリを実行できるかどうかをテストしたい場合は、ダミーデータを含むテストテーブルを作成し、PHPスクリプトからそのコンテンツをクエリすることができます。その前に、テスト用のデータベースを作成し、それにアクセスできるように適切に設定された新しいMySQLユーザーを用意する必要があります。

      執筆時点では、ネイティブのMySQL PHPライブラリであるmysqlndは、MySQL 8のデフォルトの認証方法であるcaching_sha2_authenticationをサポートしていません。PHPからMySQLデータベースに接続できるようにするためには、mysql_native_password認証方法で新しいユーザーを作成する必要があります。

      ここではexample_databaseという名前のデータベースと example_user という名前のユーザーを作成しますが、これらの名前は別の値に置き換えることができます。

      まず、rootアカウントを使用して、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シェルを終了します。

      新しいユーザーが適切な権限を持っているかどうかは、MySQLコンソールに再度ログインしてテストすることができます。カスタムユーザーの資格を使用します。

      このコマンドの -p フラグに注意してください。これは、example_userユーザーを作成する際に使用したパスワードを要求します。MySQLコンソールにログインした後、example_databaseデータベースにアクセスできることを確認してください。

      これにより、以下が出力されます。

      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コンソールを終了できます。

      これで、MySQLに接続してコンテンツにクエリを出すPHPスクリプトを作成することができます。お好みのエディタを使用して、カスタムWeb rootディレクトリに新しい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();
      }
      

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

      これで、ウェブサイトに設定されているドメイン名またはパブリックIPアドレスの後に、/todo_list.phpを続けて、このページにアクセスすることができます。

      http://server_domain_or_IP/todo_list.php
      

      ページが表示され、テストテーブルに挿入したコンテンツが表示されます。

      Example PHP todo list

      これでPHP環境はあなたのMySQLサーバーと接続してやりとりする準備ができました。

      まとめ

      このガイドでは、WebサーバーとしてNginxを、データベースシステムとしてMySQLを使用して、訪問者にPHP Webサイトやアプリケーションを提供するための柔軟な基盤を構築しました。  



      Source link

      Linux、Apache、MySQL、PHP(LAMP)スタックをUbuntu 20.04にインストールする方法


      はじめに

      「LAMP」スタックとは、PHPで書かれた動的ウェブサイトやWebアプリをホストできるように、通常一緒にインストールされているオープンソースソフトウェアのグループです。この用語は、実際にはApache webサーバーが搭載されたLinuxオペレーティングシステムを表す頭字語です。このサイトデータはMySQLデータベースに保存されており、動的コンテンツはPHPが処理を行います。

      このガイドでは、Ubuntu 20.04サーバーにLAMPスタックをインストールします。

      必要条件

      このチュートリアルを完了するには、非 root sudo対応のユーザーアカウントと基本的なファイアウォールを備えたUbuntu 20.04サーバーが必要です。これは、Ubuntu 20.04の初期サーバー設定ガイドを使用して設定できます。

      ステップ1 — Apacheをインストールし、ファイアウォールを更新する

      Apache Webサーバーは、世界で最も人気のあるWebサーバーの1つです。よく文書化されていて、ユーザーのアクティブなコミュニティがあり、Webの歴史で長らく広く使用されているため、Webサイトをホスティングするうえで素晴らしいデフォルトの選択肢となっています。

      Ubuntuのパッケージマネージャー、aptを使用してApacheをインストールする

      • sudo apt update
      • sudo apt install apache2

      このセッション内でsudoを使用しているのはこれが初めての場合、aptを使用してシステムパッケージを管理する権限があることを確認するために、ユーザーのパスワードを入力するよう画面が表示されます。Yを押してから、ENTERを押すと、Apacheのインストールを確認するよう画面が表示されます。

      インストールが完了すると、HTTPトラフィックを許可するために、ファイアウォール設定を調整する必要があります。UFWには、ファイアウォール設定に利用できるさまざまなアプリケーションプロファイルがあります。現在利用可能なUFWアプリケーションプロファイルを一覧表示するには、次のことを行います。

      出力は次のようになります。

      Output

      Available applications: Apache Apache Full Apache Secure OpenSSH

      これらのプロファイルがそれぞれ意味する内容は次のとおりです。

      • Apache: このプロファイルは、ポート80(通常、暗号化されていないWebトラフィック)のみを開きます。
      • Apache Full: このプロファイルは、ポート80(通常、暗号化されていないWebトラフィック)とポート443(TLS/SSL暗号化トラフィック)の両方を開きます。
      • Apache Secure: このプロファイルは、ポート443 (TLS/SSL暗号化トラフィック)のみを開きます。

      今のところ、Apacheをインストールしたばかりで、お使いのサーバーのHTTPSトラフィックを許可するように設定されたTLS/SSL証明書がまだないため、ポート80での接続のみを許可することが最善となります。

      ポート80でのトラフィックのみを許可するには、Apacheプロファイルを使用します。

      • sudo ufw allow in "Apache"

      次を使用して変更を確認することができます。

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)

      ポート80へのトラフィックは、ファイアウォールを通じて許可されています。

      WebブラウザでサーバーのパブリックIPアドレスにアクセスして、すべてが計画通りに進んだかどうかをすぐに確認することができます(パブリックIPアドレスの情報がない場合は、次の見出しにある注釈を参照してください)。

      http://your_server_ip
      

      情報およびテスト目的のために存在する、デフォルトのUbuntu 20.04 Apache Webページが表示されます。このように表示されるはずです。

      Ubuntu 20.04 Apache default

      このページが表示されたら、Webサーバーがファイアウォールを介して正しくインストールされ、アクセス可能になっています。

      サーバーのパブリックIPアドレスを検索する方法

      サーバーのパブリックIPアドレスが分からない場合、検索する方法は数多くあります。通常は、SSHを通じてお使いのサーバーへの接続に使用するアドレスとなります。

      コマンドラインから行うという別の方法もいくつかあります。まず、IPアドレスを取得するためにiproute2ツールを使用して、次のように入力してください。

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

      これにより、2、3行が返されます。これらはすべて正しいアドレスですが、お使いのコンピュータでは1つしか使えない場合があります。どれでも1つを試してみましょう。

      別の方法としては、curl ユーティリティを使用して外部の第三者に連絡し、サーバー**がどのように表示されているかを教えてもらう方法があります。特定のサーバーにお使いのIPアドレスが何かを尋ねて行います。

      • curl http://icanhazip.com

      IPアドレスを取得するために使用するメソッドに関係なくデフォルトのApache ページを表示するには、Webブラウザのアドレスバーにお使いのIPアドレスを入力します。

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

      Webサーバーを起動し実行したので、サイトのデータを保存および管理できるようにデータベースシステムをインストールする必要があります。MySQLはPHP環境で使用されている人気のデータベース管理システムです。

      もう一度、aptを使用してこのソフトウェアを取得およびインストールします。

      • sudo apt install mysql-server

      画面が表示されたら、Yを入力してからENTERキーを押して、インストールを確認します。

      インストールが完了したら、MySQLがプリインストールされたセキュリティスクリプトを実行することをお勧めします。このスクリプトは、セキュリティに懸念のあるデフォルト設定の一部を削除し、データベースシステムへのアクセスをロックします。次を実行してインタラクティブスクリプトを起動します。

      • sudo mysql_secure_installation

      これにより、“VALIDATE PASSWORD PLUGIN

      注: この機能を有効にするかどうかは、判断する余地があります。有効にすると、指定した条件に一致しないパスワードはエラーとして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
      

      VALIDATE PASSWORD PLUGINこれはシステムrootと混同されません。データベースrootユーザーは、データベースシステム上の権限を持つ管理ユーザーです。MySQL rootユーザーのデフォルト認証方法はパスワードを使用しませんが、1つが設定されている場合でも、追加の安全対策としてここで強力なパスワードを定義する必要があります。この点については後でお話します。

      パスワード検証を有効にした場合は、入力したrootパスワードのパスワード強度が表示されます。お使いのサーバーからそのパスワードで続行するかどうか尋ねられます。現在のパスワードでよければ、画面の表示でYと入力します。

      Estimated 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キーを押します。これにより、一部の匿名ユーザーとテストデータベースを削除し、リモートrootログインを無効にし、MySQLが行なった変更をすぐに反映できるようにこれらの新しいルールをロードします。

      完了したら、次を入力してMySQLコンソールにログインできるかどうかをテストします。

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

      Output

      Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 22 Server version: 8.0.19-0ubuntu5 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. 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コンソールを終了するには、次のように入力します。

      mysql_secure_installationスクリプトを実行する際にパスワードを定義しているにもかかわらず、rootユーザーとして接続するためにパスワードを指定する必要がないことに注意してください。これは、管理者MySQLユーザーのデフォルトの認証方法が、passwordではなくunixsocketであるためです。これはセキュリティ上の問題のように見えるかもしれませんが、MySQLのrootユーザーとしてログインできるのは、sudo権限を持つシステムユーザーのみであり、コンソールから接続するか、同じ権限を持つアプリケーションを介して接続することができるため、データベースサーバーをより安全なものにしています。実用的な意味では、管理データベースのrootユーザーを使用してPHPアプリケーションから接続することができないということになります。root MySQLアカウントにパスワードを設定することは、デフォルトの認証方法が`unixsocketからpasswordに変更された場合のセーフガードとして機能します。`

      セキュリティを強化するためには、特にサーバー上に複数のデータベースをホストしている場合は、データベースごとに拡張性の低い専用のユーザーアカウントを設定しておくとよいでしょう。

      注:執筆時点では、ネイティブのMySQL PHPライブラリmysqlndは、MySQL 8のデフォルトの認証方法であるcaching_sha2_authenticationをサポートしていません。そのため、MySQL 8でPHPアプリケーションのデータベースユーザーを作成する際には、代わりにmysql_native_passwordを使用するように設定されていることを確認する必要があります。ステップ6でその方法について説明します。

      これで MySQL サーバーがインストールされ、セキュリティが確保されました。次に、LAMPスタックの最終コンポーネントであるPHPをインストールします。

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

      コンテンツを提供するためにApacheがインストールされ、データを保存・管理するためにMySQLがインストールされています。PHPは、最終的なユーザーにダイナミックコンテンツを表示するコードを処理する設定のコンポーネントです。 phpパッケージに加えて、PHPがMySQLベースのデータベースと通信できるようにするPHPモジュールのphp-mysqlが必要になります。また、ApacheがPHPファイルを処理できるようにするために、libapache2-mod-phpが必要です。コアとなるPHPパッケージは依存関係として自動的にインストールされます。

      これらのパッケージをインストールするには、次を実行します。

      • sudo apt install php libapache2-mod-php php-mysql

      インストールが完了したら、PHPのバージョンを確認するために、次のコマンドを実行できます。

      Output

      PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

      この時点で、LAMPスタックは完全に操作されていますが、PHPスクリプトを使用して設定をテストする前に、Webサイトのファイルとフォルダを保持するために適切なApache Virtual Hostを設定しておくとよいでしょう。次のステップでその設定を行います。

      ステップ4 — Webサイトのバーチャルホストを作成

      Apache Webサーバーを使用している場合、バーチャルホスト (Nginx のサーバブロックに似ています) を作成して設定の詳細をカプセル化し、単一のサーバーから複数のドメインをホストすることができます。このガイドでは、your_domainというドメインを設定しますが、このドメイン名を自分のドメイン名に置き換える必要があります。

      :DNSホスティングプロバイダーとしてDigitalOceanを使用している場合、新しいドメイン名を設定してサーバーに指定する方法の詳細については、製品ドキュメントを参照してください。

      Ubuntu 20.04上のApacheには、/var/www/htmlディレクトリからドキュメントを提供するように設定されているデフォルトで有効になっている1つのサーバーブロックがあります。これは単一のサイトに適していますが、複数のサイトをホストしている場合、扱いにくくなる可能性があります。var/www/htmlを変更する代わりに、クライアントのリクエストが他のサイトと一致しない場合に提供されるデフォルトのディレクトリとして/var/www/htmlをそのままにして、your_domainサイトの/var/www内のディレクトリ構造を作成します。

      your_domainのディレクトリを次のように作成します。

      • sudo mkdir /var/www/your_domain

      次に、現在のシステムユーザーを参照する環境変数$USERでディレクトリの所有権を割り当てます。

      • sudo chown -R $USER:$USER /var/www/your_domain

      それから、お好みのコマンドラインエディタを使ってApacheのsites-availableディレクトリに新しい設定ファイルを開きます。ここでは、nanoを使用します。

      • sudo nano /etc/apache2/sites-available/your_domain.conf

      これにより、新しい空白ファイルを作成します。次のbare-bones 設定に貼り付けます。

      /etc/apache2/sites-available/your_domain.conf

      <VirtualHost *:80>
          ServerName your_domain
          ServerAlias www.your_domain
          ServerAdmin webmaster@localhost
          DocumentRoot /var/www/your_domain
          ErrorLog ${APACHE_LOG_DIR}/error.log
          CustomLog ${APACHE_LOG_DIR}/access.log combined
      </VirtualHost>
      

      完了したら、ファイルを保存して閉じます。nanoを使用している場合、CTRL+XYENTERの順に押して同じことができます。

      このVirtualHost設定により、Web rootディレクトリとして/var/www/your_domainを使用して、Apacheにyour_domainにサービスを提供するよう指示します。ドメイン名を使用せずにApacheをテストしたい場合は、各オプションの行の先頭に#文字を追加することで、ServerNameServerAliasのオプションを削除したりコメントアウトしたりすることができます。

      これで、新しいバーチャルホストを有効にするために、a2ensiteを使用できます。

      • sudo a2ensite your_domain

      Apacheと一緒にインストールされているデフォルトのWebサイトを無効にしたい場合があります。Apacheのデフォルト設定はバーチャルホストを上書きするため、カスタムドメイン名を使用していない場合にはこれは必要です。ApacheのデフォルトのWebサイトを無効にするには、次のように入力します。

      • sudo a2dissite 000-default

      設定ファイルに構文エラーが含まれていないことを確認するには、次を実行します。

      • sudo apache2ctl configtest

      最後に、Apacheをリロードすると、これらの変更が有効になります。

      • sudo systemctl reload apache2

      新しいWebサイトはアクティブになりましたが、Web root /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>
      

      ここでブラウザにアクセスして、もう一度サーバーのドメイン名またはIPアドレスにアクセスしてください。

      http://server_domain_or_IP
      

      以下のページが表示されます。

      Apache virtual host test

      このページが表示されたら、お使いのApacheバーチャルホストが期待通りに動作していることを意味します。

      このファイルは、index.phpファイルを置き換えるために設定するまでの間、アプリケーションの一時的なランディングページとして残しておくことができます。設定したら、忘れずにindex.html ファイルをドキュメントrootから削除するか、名前を変更してください。デフォルトではindex.phpファイルよりも優先されます。

      Apache上のDirectoryIndexに関する注記

      ApacheでデフォルトのDirectoryIndex設定を使用すると、index.htmlという名前のファイルは常にindex.phpファイルよりも優先されます。これは、訪問者に有益なメッセージを含む一時的なindex.htmlファイルを作成することにより、PHPアプリケーションでメンテナンスページを設定するのに便利です。このページがindex.phpページに優先されるため、アプリケーションのランディングページになります。メンテナンスが終わったら、index.htmlは名前が変更されるか、ドキュメントrootから削除され、通常のアプリケーションページが元に戻ります。

      この動作を変更する場合は、 /etc/apache2/mods-ableded/dir.confファイルを編集し、DirectoryIndexディレクティブ内でindex.phpファイルが表示されている順序を修正する必要があります。

      • sudo nano /etc/apache2/mods-enabled/dir.conf

      /etc/apache2/mods-enabled/dir.conf

      <IfModule mod_dir.c>
              DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
      </IfModule>
      

      ファイルを保存して閉じた後、変更が有効になるようにApacheをリロードする必要があります。

      • sudo systemctl reload apache2

      次のステップでは、PHPがサーバーに正しくインストールされ、設定されているかどうかをテストするためのPHPスクリプトを作成します。

      ステップ5 — WebサーバーでPHP処理をテストする

      Webサイトのファイルとフォルダをホストする場所を指定したので、ApacheがPHPファイルへのリクエストを処理できることを確認するためのPHPテストスクリプトを作成します。

      指定したWeb rootフォルダにinfo.phpという名前の新しいファイルを作成します。

      • nano /var/www/your_domain/info.php

      これにより、空白ファイルを開きます。ファイルの中に、有効なPHPコードである以下のテキストを追加します。

      /var/www/your_domain/info.php

      <?php
      phpinfo();
      

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

      このスクリプトをテストするには、Webブラウザでサーバーのドメイン名やIPアドレスにアクセスし、スクリプト名の後にinfo.phpという名前をつけてください。

      http://server_domain_or_IP/info.php
      

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

      Ubuntu 20.04 PHP info

      このページでは、PHPの視点からお使いのサーバーに関する情報を提供します。デバッグや設定が正しく適用されているかどうかを確認するのに便利です。

      ブラウザでこのページが表示できれば、PHP のインストールは期待通りに動作していることになります。

      このページ上のPHPサーバーに関する情報を確認した後は、作成したファイルにはPHP環境およびUbuntuサーバーに関する機密情報が含まれているため、削除しておいた方がよいでしょう。rmを使用して、削除できます。‏‏

      • sudo rm /var/www/your_domain/info.php

      後でもう一度情報にアクセスする必要がある場合は、いつでもこのページを再作成できます。

      ステップ6 — PHPからデータベース接続をテストする(オプション)

      PHPがMySQLに接続してデータベースクエリを実行できるかどうかをテストしたい場合は、ダミーデータを含むテストテーブルを作成し、PHPスクリプトからそのコンテンツをクエリすることができます。その前に、テスト用のデータベースを作成し、それにアクセスできるように適切に設定された新しいMySQLユーザーを用意する必要があります。

      執筆時点では、ネイティブのMySQL PHPライブラリであるmysqlndは、MySQL 8のデフォルトの認証方法であるcaching_sha2_authenticationをサポートしていません。PHPからMySQLデータベースに接続できるようにするためには、mysql_native_password認証方法で新しいユーザーを作成する必要があります。

      ここではexample_databaseという名前のデータベースと example_user という名前のユーザーを作成しますが、これらの名前は別の値に置き換えることができます。

      まず、rootアカウントを使用して、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シェルを終了します。

      新しいユーザーが適切な権限を持っているかどうかは、MySQLコンソールに再度ログインしてテストすることができます。カスタムユーザーの資格を使用します。

      このコマンドの -p フラグに注意してください。これは、example_userユーザーを作成する際に使用したパスワードを要求します。MySQLコンソールにログインした後、example_databaseデータベースにアクセスできることを確認してください。

      これにより、以下が出力されます。

      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コンソールを終了できます。

      これで、MySQLに接続してコンテンツにクエリを出すPHPスクリプトを作成することができます。お好みのエディタを使用して、カスタムWeb rootディレクトリに新しい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();
      }
      

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

      これで、ウェブサイトに設定されているドメイン名またはパブリックIPアドレスの後に、/todo_list.phpを続けて、このページにアクセスすることができます。

      http://your_domain_or_IP/todo_list.php
      

      ページが表示され、テストテーブルに挿入したコンテンツが表示されます。

      Example PHP todo list

      これでPHP環境はあなたのMySQLサーバーと接続して対話する準備ができました。

      まとめ

      このガイドでは、WebサーバーとしてApacheを、データベースシステムとしてMySQLを使用して、訪問者にPHP Webサイトやアプリケーションを提供するための柔軟な基盤を構築しました。

      この後のステップとして、HTTPS経由でサービスを提供することにより、Webサーバーへの接続のセキュリティが確保されていることを確認する必要があります。これには、Let’s Encryptによる無料のTLS /SSL証明書を使用し、サイトのセキュリティを確保してください。



      Source link