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:
<?php 
phpinfo();
```

(3) Nginxを起動します。

```
systemctl start nginx.service
```

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

```
http://パブリック IPv4 DNS/index.php
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/12ed237d-4ae0-2430-0122-dc7023ea2252.png)


※パブリック 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を実行してパスワード設定しましょう。

```sql:
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:
<?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](https://qiita.com/ga_ku/items/01191cc2fecf4a4313d2)より拝借しました（一部改変）。

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

```
http://パブリック IPv4 DNS/postgres.php
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/faa14810-6c54-c3f4-7eb7-31d1951a73b1.png)


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


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

## 変更履歴

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

## 参考
### LAMPとの比較
* [LAMP（ランプ）・Linux豆知識 055| Linuc](https://linuc.org/study/knowledge/385/)

### 手順
#### 1. タイムゾーンの変更
* [AmazonLinuxでのタイムゾーン設定 | Qiita](https://qiita.com/sudix/items/7f22165b9d934cf0a630)

#### 2. ソフトウェアのインストール
* [Amazon Linux 2 を実行している EC2 インスタンスに Extras Library からソフトウェアパッケージをインストールする方法を教えてください。 | aws](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-install-extras-library-software/)
* [Extras library (Amazon Linux 2) | aws](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html#extras-library)
* [Amazon linux2にpostgresqlをインストールする手順 | 瀬戸内の雲のように](https://www.setouchino.cloud/blogs/95)

#### 3. Nginx
* [Nginx設定のまとめ | Qiita](https://qiita.com/syou007/items/3e2d410bbe65a364b603)

#### 4. PostgreSQL
* [postgresのパスワードが分からない場合 | diadia](https://torajirousan.hatenadiary.jp/entry/2019/06/23/234700)
* [PostgreSQL 認証に失敗しないための Ident、MD5、Trust 比較 | etuts+](https://server.etutsplus.com/how-to-configure-postgresql-to-use-ident-md5-trust-authentication/)
* [PostgreSQLのデフォルトのタイムゾーン | かずきのBlog@hatena](https://blog.okazuki.jp/entry/20130515/1368599076)
* [19.8. エラー報告とログ取得 | PostgreSQL 11.5文書](https://www.postgresql.jp/document/11/html/runtime-config-logging.html)
* [[centos7]nginxでphp.iniの設定を反映させる | Yuki猫のおうち](https://yukineko4you.hatenablog.com/entry/2016/04/03/223130)