Amazon Linux2でLNPP環境を構築する


Amazon Linux2上に、LAMP環境ならぬLNPP環境を構築する手順です。
コマンドには、適宜sudoをつけて実行してください。

LAMPとの比較

今回構築するLNPP環境を、お馴染みLAMP環境と比較すると以下の通り。

LNPP LAMP
OS Linux Linux
WEBサーバ Nginx Apache
DB PostgreSQL MySQL
プログラミング言語 PHP PHP

WEBサーバをApacheではなく、Nginx、DBをMySQLではなく、PostgreSQLにしています。
※呼び方間違ってたら教えてください。

環境、バージョン情報

  • OS: Amazon Linux2
  • WEBサーバ: Nginx1.18.0
  • DB: PostgeSQL 11.5
  • プログラミング言語: PHP 7.4.11
  • クライアントPC: Windows10(PuTTYにてAmazon Linux2に接続)

手順

1. タイムゾーンの変更

まず、日本時間で使用するため、Amazon Linux2自体のタイムゾーンの設定を変更します。
以下のコマンドを実行し、/etc/sysconfig/clockを編集しましょう。

vi /etc/sysconfig/clock

以下の通り、記入し、保存します。

ZONE="Asia/Tokyo"
UTC=true

2. ソフトウェアのインストール

まず、Amazon Linux2環境にSSH接続して、環境の構築に必要な各種ソフトウェアをインストールします。
今回は、Amazon Linux2のExtras Libraryのお力を借りることにしました。

(1) 以下のコマンドを実行し、Extras Libraryで利用可能なトピックの一覧を確認します。

amazon-linux-extras

初期状態では以下のようになっているはず。

・・(以上省略)
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1=latest            available      [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11=latest      available     [ =11  =stable ]
 42  php7.4=latest            available     [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
(以下省略)・・

(2) Nginx, PostgreSQL, PHPをインストールします。
以下3つのコマンドを順に実行しましょう。

amazon-linux-extras install nginx1
amazon-linux-extras install postgresql11
amazon-linux-extras install php7.4

※うちPostgreSQLは、psqlのコマンドがインストールされるだけのようなので、普通にインストールもします(以下のコマンドを実行すればOK!)

yum install postgresql-server postgresql-devel postgresql-contrib

(3) 再度、amazon-linux-extrasコマンドを実行し、Nginx, PostgreSQL, PHPが有効になっていることを確認します。

amazon-linux-extras

以下のように、available → enabledに変わっていればOK!

・・(以上省略)
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1=latest            enabled      [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11=latest      enabled      [ =11  =stable ]
 42  php7.4=latest            enabled      [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
(以下省略)・・

3. Nginx

(1) まず、以下のコマンドを実行し、Nginxの設定を確認しましょう。

vi /etc/nginx/nginx.conf

HTTP接続の場合のドキュメントルートは、
/usr/share/nginx/html
ですので、配下にWEBページで表示させたいファイルを作成します(もちろん設定変更してもOK)

ちなみに、該当箇所は以下(rootと記載のある部分)。

・・(以上省略)
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
(以下省略)・・

(2) 以下の通り実行して、PHPの設定内容を表示する、index.phpを作成しましょう。

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

ファイルが開いたら、insertモードで以下の内容をコピペ→保存します。

<?php 
phpinfo();

(3) Nginxを起動します。

systemctl start nginx.service

(4) ブラウザで以下のURLを叩いて、PHP設定内容が表示されることを確認します。

http://パブリック IPv4 DNS/index.php

※パブリック IPv4 DNSはAWSのコンソール(EC2)より、確認できます。

4. PostgreSQL

続いてPostgreSQLの設定を行います。

(1) まず、以下のコマンドを実行して初期化をしましょう。

postgresql-setup initdb

(2) 設定ファイルの格納先を確認します。

find / -name pg_hba.conf

自分の場合は、以下の通りでした。

/var/lib/pgsql/data/pg_hba.conf

(3) 設定ファイルを開き、以下の通り内容を変更して、一時的にパスワードがなくてもログインできるようにします(後続の手順で設定)。

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

■変更前

・・(以上省略)
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
(以下省略)・・

↓ (「ident」(2ヶ所)を「trust」に変更)

■変更後

・・(以上省略)
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
(以下省略)・・

(4) PostgreSQLを起動し、ログイン → パスワード設定します。

systemctl start postgresql.service
psql -h localhost -p 5432 -U postgres

「postgres=#」と表示されたらログインできているので、以下のDDLを実行してパスワード設定しましょう。

alter role postgres with password 'postgres';

※上記では、ユーザー: postgresのパスワードをpostgresに設定しています。

(5) 設定ファイルを以下の通り変更して、パスワードなしではログインできないようにします。

・・(以上省略)
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
(以下省略)・・

※(3)の「■変更後」の「trust」(2ヶ所)を「md5」に変更しています。

(6) 日本時間で使用するため、PostgreSQLのタイムゾーンの変更を行います。
以下のコマンドを実行して、設定ファイルpostgresql.confを検索しましょう。

find / -name postgresql.conf -type f

自分の場合は、以下にありました。

/var/lib/pgsql/data/postgresql.conf

(7) postgresql.confを開いて、タイムゾーンをAsia/Tokyoに設定しましょう。
ログファイルのタイムゾーンを設定するlog_timezoneも合わせて変更しておくとよいでしょう。

・・(以上省略)
log_timezone = 'Asia/Tokyo'
・・(途中省略)・・
timezone = 'Asia/Tokyo'
(以下省略)・・

(8) postgresql.confの設定を保存したら、PostgreSQLを再起動して、変更を反映させます。

systemctl restart postgresql.service

(9) 念のため、PostgreSQLにログインして、変更が反映されているか確認しておきましょう。

-- ログイン
psql -h localhost -p 5432 -U postgres
-- ログイン後、以下のコマンドを実行
select current_timestamp;

日本時間が表示されればOKです!

(10) 続いて、PDO接続するための、pdo_pgsqlが存在するか確認します(今回はPHP→PostgreSQLの接続にPDOを使用するため)

php -m | grep pdo

pdo_pgsqlが表示されなければ、以下コマンドを実行してインストールします。

yum install --enablerepo=remi,remi-php74 php-pgsql

(11) fpm-phpを再起動して、変更を反映させます。

systemctl restart php-fpm

※WEBサーバがApacheの場合はApacheの再起動なのですが、Nginxの場合はfpm-phpが再起動の対象となります。

(12) ブラウザから接続確認するためのpostgres.phpを作成しましょう。

vi /usr/share/nginx/html/postgres.php

insertモードにて、以下の通り記述→保存。

<?php

$DBHOST = "127.0.0.1";
$DBPORT = "5432";
$DBNAME = "postgres";
$DBUSER = "postgres";
$DBPASS = "postgres";

try{
  //DB接続
  $dbh = new PDO("pgsql:host=$DBHOST;port=$DBPORT;dbname=$DBNAME;user=$DBUSER;password=$DBPASS");
  print("接続成功".'<br>');
}catch(PDOException $e){
  print("接続失敗".'<br>');
  print($e.'<br>');
  die();
}
//データベースへの接続を閉じる
$dbh = null;
?>

※ソースコードは、@ga_ku さんの PHPでPostgreSQLに接続する方法 | Qiitaより拝借しました(一部改変)。

(13) ブラウザで以下のURLを叩いて、「接続成功」と表示されればOK!

http://パブリック IPv4 DNS/postgres.php

これにて、環境構築 → ブラウザからの動作確認が一通りできました!

終わりに

Apache, MySQLもいいけれど、あまり馴染みのないNginx, PostgreSQLにも触れてみたくって。
特にPostgreSQLとPHPの連携のところ(PDO)で躓いたけど、できてよかったです。

変更履歴

日付 変更内容
2021/02/14 タイムゾーンの変更手順を追加

参考

LAMPとの比較

手順

1. タイムゾーンの変更

2. ソフトウェアのインストール

3. Nginx

4. PostgreSQL