CentOS7で2ノードLEPPスタックを設定する方法
序章
今日のトラフィックの多い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 = 5432
にport = 5432
最初のパラメーターは、データベースサーバーがリッスンするIPアドレスを指定します。 セキュリティ対策として、すぐに使用できるPostgresインストールではローカルホスト接続のみが許可されます。 これを「*」に変更すると、Postgresは任意のソースからのトラフィックをリッスンします。 2番目のパラメーターは、コメントマーカー(#)を削除することで有効になっています。 Postgresのデフォルトポートを指定します。
ファイルを保存して終了します。
次に、編集します pg_hba.conf
、これはPostgreSQLのホストベースアクセス(HBA)構成ファイルです。 データベースサーバーに接続できるホストと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
この行は、IPアドレスからのみ来るデータベース接続を受け入れるようにPostgreSQLに指示します your_web_server_ip
パスワード認証に標準のmd5チェックサムを使用します。 接続は、任意のユーザーとして任意のデータベースに対して行うことができます。
ファイルを保存して終了します。
次に、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
デーモン; 変更を有効にするためにサービスを再起動する必要はありません。 The 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データベースに記録します。 プロンプトがに変わります postgres=#
、OSプロンプトではなく、psqlプロンプト。 発行 \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
テーブル。
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_name
からlocalhost
にyour_web_server_ip
. -
追加
index.php
にindex
ディレクティブなので、index.php index.html index.htm
. -
を削除します
location / {
と}
を含む行root
とindex
ディレクティブ。 この変更を行わないと、Webページがブラウザに表示されず、Nginxエラーログに次のようなメッセージが記録される場合があります。"Unable to open primary script: /etc/nginx/html/index.php (No such file or directory)"
-
コメントを外す
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 = On
にexpose_php = Off
. このパラメータをに設定するOff
PHPがその署名をWebサーバーのヘッダーに追加せず、サーバーが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アプリケーションを作成します。 名前の付いたファイルを作成します index.php
の /usr/share/nginx/html
.
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アプリケーションをデプロイしました。 実稼働スタックには、外部ファイアウォールやロードバランサーの追加など、さらに複雑なものがありますが、これは、開始に使用できる堅固な基本構成です。 楽しみ!