前書き

今日のトラフィックの多いWebアプリケーションは、洗練された高速応答Webサーバー、スケーラブルなエンタープライズクラスのデータベース、機能豊富なスクリプト言語が提供する動的コンテンツによって強化されています。 典型的なLinux Webアプリケーションスタックは、LAMPアーキテクチャ(Li​​nux、Apache、MySQL、およびPHP / Python)に従います。 広く利用可能なチュートリアルは、これらのコンポーネントを1つのサーバーにインストールして構成する方法を示しています。

実生活ではめったにありません。 プロフェッショナルな3層セットアップでは、データベースバックエンドは独自のサーバーに隔離されます。 Webサーバーは、データベースとWebサイトの間のミドルウェアとして機能するアプリ層にリクエストを送信します。

Apacheはいまだに最も広く使用されているWebサーバーですが、Nginxはフットプリントが小さく応答時間が速いため、急速に人気を集めています。 MySQLのコミュニティエディションは依然としてデータベースに人気のある選択肢ですが、多くのサイトではPostgreSQLと呼ばれる別のオープンソースデータベースプラットフォームも使用しています。

目標

このチュートリアルでは、2層アーキテクチャで単純なWebアプリケーションを作成します。 両方のノードの基本オペレーティングシステムはCentOS 7です。 このサイトは、PostgreSQLデータベースと通信するPHPコードを実行するNginx Webサーバーによって強化されます。

他のLAMPまたはLEMPチュートリアルで見られる「トップダウン」アプローチを採用する代わりに、「グラウンドアップ」アプローチを使用します。最初にデータベース層を作成し、次にWebサーバーを作成してから、Webサーバーの接続方法を確認しますデータベースに。

この構成をLEPP(Linux、Nginx、PHP、PostgreSQL)スタックと呼びます。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • 少なくとも2 GBのRAMと2つのCPUコアを備えた2つのCentOS 7ドロップレット。それぞれがデータベースサーバーとWebサーバー用です。

これらのマシンのIPアドレスをそれぞれ「」と「」と呼びます。これらのマシンの実際のIPアドレスは、DigitalOceanコントロールパネルで確認できます。

  • 両方のDropletのSudo非ルートユーザー。 これを設定するには、https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-a-centos-7-server [このチュートリアル]に従ってください。

ステップ1-PostgreSQLのインストール

この手順では、データベースサーバーにPostgreSQLをインストールします。

PostgreSQLをインストールする、新しくインストールした空のCentOS 7ボックスに接続します。 リポジトリにはデフォルトでCentOS 7が付属していないため、最初にyumリポジトリRPMをダウンロードする必要があります。

sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm

RPMを保存したら、リポジトリをインストールします。

sudo yum install pgdg-centos94-9.4-1.noarch.rpm -y

最後に、PostgreSQL 9.4サーバーとそのcontribモジュールをインストールします。

sudo yum install postgresql94-server postgresql94-contrib -y

ステップ2-PostgreSQLの構成

この手順では、PostgreSQLのインストール後の構成をいくつかカスタマイズします。

CentOS 7では、PostgreSQL 9.4データおよび設定ファイルのデフォルトの場所は `+ / var / lib / pgsql / 9.4 / data / `であり、プログラムバイナリの場所は ` / usr / pgsql-9.4 / bin / `です。 。 データディレクトリは最初は空です。 データベースクラスターを初期化してその中に必要なファイルを作成するには、 ` initdb +`プログラムを実行する必要があります。

sudo /usr/pgsql-9.4/bin/postgresql94-setup initdb

データベースクラスターが初期化されると、データフォルダーに `+ postgresql.conf `というファイルが作成されます。これはPostgreSQLのメイン設定ファイルです。 このファイルの2つのパラメーターを変更します。 ` vi +`またはお気に入りのテキストエディターを使用して、編集するファイルを開きます。

sudo vi /var/lib/pgsql/9.4/data/postgresql.conf

そして、次の行を変更します。

  • `+ listen_addresses = ” `を ` listen_addresses = ‘*’ +`に変更します

  • 「+ port = 5432+」を「+ port = 5432+」に変更します

最初のパラメーターは、データベースサーバーがリッスンするIPアドレスを指定します。 セキュリティ対策として、標準のPostgresインストールではローカルホスト接続のみが許可されます。 これを「*」に変更すると、Postgresはあらゆるソースからのトラフィックをリッスンします。 2番目のパラメーターは、コメントマーカー(#)を外すことで有効になりました。 Postgresのデフォルトポートを指定します。

ファイルを保存して終了します。

次に、 `+ pg_hba.conf +`を編集します。これは、PostgreSQLのHost Based Access(HBA)設定ファイルです。 データベースサーバーに接続できるホストとIP範囲を指定します。 各エントリは、接続をローカルまたはリモート(ホスト)で行うことができるか、接続できるデータベース、接続できるユーザー、要求の送信元のIPブロック、使用する認証モードを指定します。 これらのエントリのいずれとも一致しない接続要求は拒否されます。

編集のために `+ pg_hba.conf`を開きます。

sudo vi /var/lib/pgsql/9.4/data/pg_hba.conf

ファイルの一番下までスクロールし、次の行を追加します。

host        all             all             /32          md5

この行は、パスワード認証に標準のmd5チェックサムを使用して、IPアドレス「++」からのみ来るデータベース接続を受け入れるようにPostgreSQLに指示します。 任意のユーザーとして、任意のデータベースに対して接続を確立できます。

ファイルを保存して終了します。

次に、Postgresサービスを開始します。

sudo systemctl start postgresql-9.4.service

そして、それを有効にします:

sudo systemctl enable postgresql-9.4.service

データベースサーバーが接続を受け入れているかどうかを確認するために、最新のPostgresログファイルの最後の数行を確認できます。 データベースエラーログは、 `+ / var / lib / pgsql / 9.4 / data / pg_log +`ディレクトリに保存されます。 次のコマンドを実行して、このディレクトリ内のファイルを表示します。

sudo ls -l /var/lib/pgsql/9.4/data/pg_log

ログファイル名のパターンは「+ postgresql-.log 」です(たとえば、「 postgresql-Wed.log + `」)。 現在の日付に対応するログファイルを見つけ、最新のログファイルの最後の数行を調べます。

sudo tail -f -n 20 /var/lib/pgsql/9.4/data/pg_log/postgresql-.log

出力はこれに類似した何かを示す必要があります:

...

< 2015-02-26 21:32:24.159 EST >LOG:  database system is ready to accept connections
< 2015-02-26 21:32:24.159 EST >LOG:  autovacuum launcher started
  • CTRL + C *を押して、 `+ tail +`コマンドからの出力を停止します。

ステップ3-データベースサーバーファイアウォールの更新

また、Postgresデータベースのトラフィックがファイアウォールを通過できるようにする必要があります。 CentOS 7は、「+ firewalld 」デーモンを介して動的ファイアウォールを実装します。変更を有効にするためにサービスを再起動する必要はありません。 ` firewalld +`サービスはシステムの起動時に自動的に開始するはずですが、常に確認するのが良いでしょう。

sudo firewall-cmd --state

デフォルトの状態は「+ running」である必要がありますが、「+ not running」の場合は次のように起動します。

sudo systemctl start firewalld

次に、ポート5432のルールを追加します。 これは、PostgreSQLデータベーストラフィックのポートです。

sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp

次に、ファイアウォールをリロードします。

sudo firewall-cmd --reload

ステップ4-データベースの作成とデータ投入

このステップでは、データベースを作成し、そこにデータを追加します。 これは、Webアプリケーションが動的に取得して表示するデータです。

最初のステップは、PostgreSQLが最初にインストールされたときに作成される* postgres と呼ばれるPostgresスーパーユーザーのパスワードを変更することです。 OSプロンプトではなく、Postgres内からユーザーのパスワードを変更することをお勧めします。 これを行うには、 postgres *ユーザーに切り替えます。

sudo su - postgres

これにより、コマンドプロンプトが「+ -bash-4.2 $ +」に変更されます。 次に、組み込みのクライアントツールを起動します。

psql

デフォルトでは、これによりpostgresユーザーがPostgresデータベースに記録されます。 プロンプトは、OSプロンプトではなく、psqlプロンプトの `+ postgres =#`に変わります。 ` \ password +`コマンドを発行すると、パスワードの変更を求めるプロンプトが表示されます。

\password

Postgresユーザーの安全なパスワードを提供します。

次に、* product *というデータベースを作成します。

CREATE DATABASE product;

次に、* product *データベースに接続します。

\connect product;

次に、* product_list *というデータベースにテーブルを作成します。

CREATE TABLE product_list (id int, product_name varchar(50));

次の各コマンドを1つずつ実行します。 各コマンドは、1つのレコードを `+ product_list +`テーブルに追加します。

INSERT INTO product_list VALUES (1, 'Book');
INSERT INTO product_list VALUES (2, 'Computer');
INSERT INTO product_list VALUES (3, 'Desk');

最後に、データが正しく追加されたことを確認します。

SELECT * FROM product_list;

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

id | product_name
----+--------------
 1 | Book
 2 | Computer
 3 | Desk
(3 rows)

データベースサーバーで行う必要があるのはこれだけです。これで切断できます。

ステップ5-Nginxのインストール

次に、他のドロップレットにNginx Webサーバーをインストールして構成します。 新しくインストールした他の空のCentOS 7ボックスに接続します。

PosgreSQLと同様に、NginxリポジトリにはデフォルトでCentOS 7が付属していません。 最初にyumリポジトリRPMをダウンロードする必要があります。

sudo wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

RPMを保存したら、リポジトリをインストールします。

sudo yum install nginx-release-centos-7-0.el7.ngx.noarch.rpm -y

最後に、Nginx Webサーバーをインストールします。

sudo yum install nginx -y

ステップ6-Webサーバーファイアウォールの更新

この手順では、Nginxトラフィックを許可するようにファイアウォールを構成し、一部のNginx構成をカスタマイズします。

HTTP / HTTPSトラフィックがファイアウォールを通過できるようにする必要があります。 前と同様に、「+ firewalld +」サービスが実行されていることを確認します。

sudo firewall-cmd --state

デフォルトの状態は「+ running 」である必要がありますが、「 not running +」の場合は開始します。

sudo systemctl start firewalld

次に、ポート80(HTTP)のファイアウォールルールを追加します。

sudo firewall-cmd --permanent --zone=public --add-port=80/tcp

ポート443(HTTPS)に別のものを追加します。

sudo firewall-cmd --permanent --zone=public --add-port=443/tcp

次に、ファイアウォールをリロードします。

sudo firewall-cmd --reload

次に、Nginxを起動します。

sudo systemctl start nginx.service

そしてそれを有効にします。

sudo systemctl enable nginx.service

ブラウザでサーバーのIPアドレスを指定すると、デフォルトのWebページが表示されます。

image:https://assets.digitalocean.com/articles/LEPP_CentOS7/1.jpg [Nginxが提供するデフォルトのWebページ]

ステップ7-Nginxの構成

このステップに関連する2つのNginx構成ファイルがあります。 最初のファイルはメインの構成ファイルで、2番目のファイルはサイト固有のファイルです。

一般的な構成ファイルは、サーバー全体の特性を制御します。 Nginxは多くのWebサイトを提供でき、各サイトはサーバーブロックと呼ばれます(Apacheはそれらを仮想ホストまたは仮想ホストと呼びます)。 各サイトの構成は、サーバーブロック構成ファイルによって制御されます。

メインサーバーの設定ファイルを編集しましょう。

sudo vi /etc/nginx/nginx.conf

ファイルの2行目で、 `+ worker_processes +`パラメーターを1から2に変更します。 これは、利用可能なすべてのCPUコアを使用するようにNginxのワーカースレッドに指示します。 ファイルを保存して終了します。

ここでは、サーブブロックを作成しません。 代わりに、デフォルトのサーバーブロックでウェブアプリケーションを作成するので、デフォルトのサーバーブロック設定ファイルを編集しましょう。

sudo vi /etc/nginx/conf.d/default.conf

内容は次のようになります。 編集するパーツが強調表示されます。

server {
   listen       80;
   server_name  ;

   ...


       root   /usr/share/nginx/html;
       ;


   #error_page  404              /404.html;

   ...

   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
   #
   location ~ \.php$ {

       fastcgi_pass
       fastcgi_index        index.php;
       fastcgi_param        SCRIPT_FILENAME $fastcgi_script_name;
       include              fastcgi_params;
   }

...
}

次の編集を行います。

  • 「+ server_name 」を「 localhost 」から「+」に設定します。

  • 「+ index.php」を「+ index 」ディレクティブに追加して、「 index.php index.html index.htm」を読み取ります。

  • + root`および + index`ディレクティブを含む `+ location / {`および `} `行を削除します。 この変更がないと、Webページがブラウザに表示されず、Nginxエラーログに「」プライマリスクリプトを開くことができません:/etc/nginx/html/index.php(そのようなファイルまたはディレクトリはありません) `

  • * PHPスクリプトをFastCGIサーバーに渡す*コメントの下の `+ location〜\ .php $ +`ブロック(最後の中括弧を含む)のコメントを外します。

  • 同じ `+ location〜\ .php $ +`ブロックの下にあるルートディレクティブを削除します。

  • fastcgi_passディレクティブの値を `127.0.0.1:9000 +`から ` unix:/ var / run / php-fpm / php5-fpm.sock +`に変更します。 これは、PHP FastCGI Process Manager(次のステップでインストールします)がUnixソケットをリッスンするようにするためです。

  • te `+ fastcgi_param `ディレクティブの値を ` SCRIPT_FILENAME $ document_root $ fastcgi_script_name +`に変更します。 これは、PHPスクリプトファイルがドキュメントルートディレクトリの下に保存されることをWebサーバーに伝えます。

編集が完了すると、ファイルは次のようになります。

server {
   listen       80;
   server_name  ;

   ...

   root   /usr/share/nginx/html;
   index   index.html index.htm;

   ...

   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
   #
   location ~ \.php$ {
       fastcgi_pass
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME $fastcgi_script_name;
       include        fastcgi_params;
   }

   ...

ファイルを保存して終了し、Webサーバーを起動します。

sudo systemctl restart nginx.service

ステップ8-PHPのインストール

WebサーバーにPHPの3つのコンポーネントをインストールします。PHPエンジン自体、FastCGI Process Manager(FPM)、およびPostgreSQL用のPHPモジュールです。

まず、PHPをインストールします。

sudo yum install php -y

次に、FastCGIのPHP独自の実装であるFastCGI Process Manager(FPM)をインストールします。 FastCGIは、Webサーバー上のアドオンのようなものです。 独立して実行され、ユーザーの要求を1つのプロセスに統合して応答時間を短縮することにより、ユーザー要求を高速化します。

sudo yum install php-fpm -y

最後に、PHP Postgresモジュールをインストールします。

sudo yum install php-pgsql -y

ステップ9-PHPの構成

このステップでは、PHPを構成します。

PHP構成ファイルを開きます。

sudo vi /etc/php.ini

以下の変更を加えます。

  • `+ expose_php = On `を ` expose_php = Off `に変更します。 このパラメーターを「 Off +」に設定すると、PHPはウェブサーバーのヘッダーに署名を追加せず、サーバーがPHPを実行しているという事実を公開しません。

  • `; cgi.fix_pathinfo = 0 +`を `; cgi.fix_pathinfo = 1 +`に変更します。

ファイルを保存して終了します。 次に、FPM構成ファイルを編集します。

sudo vi /etc/php-fpm.d/www.conf

以下の変更を加えます。

  • + user = apache`を + user = nginx`に変更します。

  • 同様に、 + group = apache`を + group = nginx`に変更します。

  • `+ listen = 127.0.0.1:9000 `を ` listen = / var / run / php-fpm / php5-fpm.sock +`に変更します。 Nginxのデフォルトサーバーブロックの構成ファイルにこの同じ値を設定します。

viを保存して終了します。 次に、PHP-FPMを起動します。

sudo systemctl start php-fpm.service

その後、有効にします。

sudo systemctl enable php-fpm.service

ステップ10-Webアプリケーションの作成

両方のノードにすべてのサーバーコンポーネントが用意されています。 ここで、PHPアプリケーションを作成します。 + / usr / share / nginx / html`に + index.php`という名前のファイルを作成します。

sudo vi /usr/share/nginx/html/index.php

次の内容を貼り付けます。 強調表示された変数を、データベースサーバーのIPアドレスとPostgresパスワードにそれぞれ置き換えてください。

<html>

<head>
   <title>LEPP Stack Example</title>
</head>

<body>

<h4>LEPP (Linux, Nginx, PHP, PostgreSQL) Sample Page</h4>
<hr/>
<p>Hello and welcome. This web page is dynamically showing a product list from a PostgreSQL database</p>

<?php

   $host = "";
   $user = "postgres";
   $password = "";
   $dbname = "product";

   $con = pg_connect("host=$host dbname=$dbname user=$user password=$password")
           or die ("Could not connect to server\n");

   $query = "SELECT * FROM product_list";
   $resultset = pg_query($con, $query) or die("Cannot execute query: $query\n");
   $rowcount = pg_numrows($resultset);

   for($index = 0; $index < $rowcount; $index++) {
           $row = pg_fetch_array($resultset, $index);
           echo $row["id"], "-", $row["product_name"];
           echo "<br>";
   }
?>

</body>
</html>

これは、PHPコードが埋め込まれたシンプルなWebページです。 まず、データベース接続文字列のパラメーターの数を定義します。 次に、データベースサーバーに対して接続( `+ $ con +`で指定)が作成されます。 クエリが指定され、* product_list *テーブルに対して実行されます。 返された結果を反復処理し、各行の内容を新しい行に出力します。

ファイルを作成して保存したら、ブラウザウィンドウを開き、「++」を指定します。 内容は次のようになります。

image:http://i.imgur.com/HDwygcq.jpg [PostgreSQLデータを表示するPHP動的Webページ]

結論

2つのボックスをゼロから構築し、必要なすべてのソフトウェアをインストールして構成し、その中にWebアプリケーションを展開しました。 実稼働スタックには、外部ファイアウォールやロードバランサーを追加するなど、さらに複雑になりますが、これは開始するために使用できる強固な基本構成です。 楽しい!