CentOS7で2ノードLEPPスタックを設定する方法

提供:Dev Guides
移動先:案内検索

序章

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

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

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

目標

このチュートリアルでは、2層アーキテクチャで簡単なWebアプリケーションを作成します。 両方のノードの基本オペレーティングシステムはCentOS7になります。 このサイトは、PostgreSQLデータベースと通信するPHPコードを実行するNginxWebサーバーを利用しています。

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

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

前提条件

このチュートリアルに従うには、次のものが必要です。

  • データベースサーバーとWebサーバーにそれぞれ1つずつ、少なくとも2GBのRAMと2つのCPUコアを備えた2つのCentOS7ドロップレット。

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

  • 両方のドロップレットのsudo非rootユーザー。 これを設定するには、このチュートリアルに従ってください。

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

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

PostgreSQLをインストールする空の新しくインストールされたCentOS7ボックスに接続します。 そのリポジトリにはデフォルトでCentOS7が付属していないため、最初に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

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

sudo yum install postgresql94-server postgresql94-contrib -y

ステップ2—PostgreSQLの設定

このステップでは、PostgreSQLのインストール後の構成をカスタマイズします。

CentOS 7では、PostgreSQL9.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 = 'localhost'listen_addresses = '*'に変更します
  • #port = 5432port = 5432に変更します

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

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

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

pg_hba.confを開いて編集します。

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

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

host     all             all             your_web_server_ip/32          md5

この行は、パスワード認証に標準のmd5チェックサムを使用してIPアドレスyour_web_server_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-day_of_week.log(たとえば、postgresql-Wed.log)です。 現在の日に対応するログファイルを見つけて、最新のログファイルの最後の数行を確認します。

sudo tail -f -n 20 /var/lib/pgsql/9.4/data/pg_log/postgresql-day_of_week.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つずつ実行します。 各コマンドは、product_listテーブルに1つのレコードを追加します。

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のインストール

次に、他のドロップレットにNginxWebサーバーをインストールして構成します。 もう1つの空の新しくインストールされたCentOS7ボックスに接続します。

PosgreSQLと同様に、NginxリポジトリにはデフォルトでCentOS7が付属していません。 最初に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

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

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)用にもう1つ追加します。

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ページが表示されます。

ステップ7—Nginxの構成

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

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

メインサーバーの構成ファイルを編集してみましょう。

sudo vi /etc/nginx/nginx.conf

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

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

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

中身はこんな感じ。 編集する部分が強調表示されます。

server {
    listen       80;
    server_name  localhost;

    ...

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    ...

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

 ...
}

次の編集を行います。

  • server_namelocalhostからyour_web_server_ipに設定します。
  • index.phpindexディレクティブに追加して、index.php index.html index.htmと表示されるようにします。
  • rootおよびindexディレクティブを含むlocation / {および}行を削除します。 この変更を行わないと、Webページがブラウザに表示されず、"Unable to open primary script: /etc/nginx/html/index.php (No such file or directory)"などのメッセージを記録するNginxエラーログが表示される場合があります。
  • の下のlocation ~ \.php$ブロック(最後の中括弧を含む)のコメントを解除し、PHPスクリプトをFastCGIサーバーコメントに渡します。
  • 同じlocation ~ \.php$ブロックの下にあるルートディレクティブを削除します。
  • fastcgi_passディレクティブ値を127.0.0.1:9000からunix:/var/run/php-fpm/php5-fpm.sockに変更します。 これは、PHP FastCGI Process Manager(次のステップでインストールします)がUnixソケットをリッスンするようにするためです。
  • fastcgi_paramディレクティブ値をSCRIPT_FILENAME $document_root$fastcgi_script_nameに変更します。 これは、PHPスクリプトファイルがドキュメントのルートディレクトリに保存されることをWebサーバーに通知します。

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

server {
    listen       80;
    server_name  your_web_server_ip;

    ...

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

    ...

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    ...

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

sudo systemctl restart nginx.service

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

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

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

sudo yum install php -y

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

sudo yum install php-fpm -y

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

sudo yum install php-pgsql -y

ステップ9—PHPの構成

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

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

sudo vi /etc/php.ini

次の変更を行います。

  • expose_php = Onexpose_php = Offに変更します。 このパラメーターをOffに設定すると、PHPはその署名をWebサーバーのヘッダーに追加せず、サーバーがPHPを実行しているという事実を公開しません。
  • ;cgi.fix_pathinfo=0;cgi.fix_pathinfo=1に変更します。

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

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

次の変更を行います。

  • user = apacheuser = nginxに変更します。
  • 同様に、group = apachegroup = nginxに変更します。
  • listen = 127.0.0.1:9000listen = /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/htmlindex.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 = "your_db_server_ip";
    $user = "postgres";
    $password = "your_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テーブルに対して実行されます。 返された結果を繰り返し処理し、各行の内容を新しい行に出力します。

ファイルを書き込んで保存したら、ブラウザウィンドウを開き、your_web_server_ipをポイントします。 内容は次のようになります。

結論

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