CentOS8でApache+PHP7+PostgreSQL12の環境構築

#前提
VMware等で仮想マシンを作成して、環境構築する
CentOS 8.3　にて以下をインストールいPHPでDBに接続確認する
PostgreSQL12.5
Apache 2.4.37,
PHP7.2

#初期設定
##FW
ホストPCから接続できるようにFWを無効にする
なので外部公開する際は、適切に設定すること。
・停止する
```systemctl stop firewalld
```

・自動起動の確認
```systemctl is-enabled firewalld
```　

enabled・・有効
disabled・・無効

・自動起動を無効にする
```
systemctl disable firewalld
```
　

#postgresql12インストール
rootユーザで実施する

・インストールされているか確認する
```dnf list installed | grep postgresql
```
・あれば削除する
```dnf remove postgresql
```
・postgresql12を指定してインストール
```dnf -y module install postgresql:12/server postgresql:12/client
```
・インストールしたバージョン確認
```psql --version
```
・posturesユーザにスイッチする
```su - postgres
```
##DB初期化を行う
　※インストール後に必要な作業。
PostgreSQLは、データベースクラスタと呼ばれるディレクトリで設定ファイルやデータベースを管理する。
```initdb --encoding=UTF8 --no-locale
```
　実行後、/var/lib/pgsql/dataディレクトリ、その配下に各種データベースファイルが作成される

##pg_hba.confの設定を行う
　
このファイルはクライアント認証に関する設定ファイル

・ファイルを開く
```vi /var/lib/pgsql/data/pg_hba.conf
```
・ホストＰＣからパスワード認証可能にする
　下記例では、192.168.配下からの接続をパスワード認証で許可する
```# IPv4 local connections:
host    all             all             192.168.0.0/16          md5
```
##postgresql.confの設定

他のＰＣから接続できるように設定する
```listen_addresses = '*'
```

##データベース起動とサンプルデータ作成

・rootに戻る
```exit
```
・DBを起動する
```systemctl start postgresql.service
```
・自動起動の設定
```systemctl enable postgresql.service
```
テーブル作成と確認

・postgresユーザにスイッチ
```Su - postgers
```
・既定のDBに接続 引数指定なし
```psql
```
・サンプルユーザを作成する
```CREATE ROLE testuser WITH LOGIN PASSWORD 'password';
```
・サンプルDBを作成する
```CREATE DATABASE testdb OWNER testuser;
```
・DBから抜ける
```exit
```
・作成したサンプルユーザでサンプルDBに接続する
```psql -h 127.0.0.1 -p 5432 -U testuser -d testdb
```
・サンプルテーブルを作成する
```CREATE TABLE T_user (  ID nchar(6),  Namae nchar(5) );
```
・サンプルデータをインサートする
```INSERT INTO T_user(id,namae) VALUES (1,'test');
```

・セレクトで結果を確認する
```SELECT * FROM T_user;
```
以上

#Apacheのインストール

Apache httpdのバージョンがCentOS 7の「2.4.6」から
CentOS 8では「http/2」が利用できる「2.4.37」に変更になった

・インストールされているか確認する
```dnf install httpd
```

・あれば削除する
```dnf remove httpd*
```

・インストールする
```dnf install httpd
```

・インストールされたバージョン確認
```# httpd -v
↓実行例
Server version: Apache/2.4.37 (centos)
Server built:   Nov  4 2020 03:20:37
```
・自動起動を有効にする
```# systemctl enable httpd.service
```
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.


##apacheからDB接続を許可に設定する
　※これを忘れるとDB接続時にエラーになる
```setsebool -P httpd_can_network_connect_db 1
```

・許可設定を確認する
```# getsebool -a | grep httpd_can_network_connect_db
```
↓実行例
httpd_can_network_connect_db --> on


・起動する
```systemctl start httpd
```

・起動確認　ブラウザで下記アドレスを開く
http://127.0.0.1/

#PHPのインストール
CentOS 7まで利用されていた5.4系ではなく7.2系になった。
インストールに関連する違いとしてはApache httpdがデフォルトで「eventMPM」に対応。
そのため、PHPのインストールと設定手順がCentOS 7と異なる
・Apache のMPMについて
「マルチプロセッシングモジュール」の略。Apacheの並列処理に関する挙動方式
主に以下の3つのモジュールがある
・preforkMPM：安定した通信が可能。アクセスが多いとCPUとメモリを多く使う
・workerMPM：マルチスレッドとマルチプロセスのハイブリッド型。preforkに比べてメモリとCPU使用量が少ない
・eventMPM：Apache2.4系から導入されたマルチスレッドとマルチプロセスのモジュール。CPUとメモリの使用量が少ない

・インストールされているか確認する
```dnf list installed | grep php
```

・あれば削除する
```dnf remove php php-*
```
・インストールするパッケージ
ここでは以下のパッケージをインストール
・基本パッケージ
php.x86_64 : Package that installs PHP 7.2
php-xml.x86_64 : A module for PHP applications which use XML
php-xmlrpc.x86_64 : A module for PHP applications which use the XML-RPC protocol
php-json.x86_64 : JavaScript Object Notation extension for PHP
・マルチバイトド画像処理関連
php-mbstring.x86_64 : A module for PHP applications which need multi-byte string handling
php-gd.x86_64 : A module for PHP applications for using the gd graphics library
・Postgre
php-pdo 
php-pgsql
・インストールする
```dnf install -y php php-xml php-xmlrpc php-json php-mbstring php-gd php-pdo php-pgsql
```

・バージョン確認
```php -v
```
↓実行例
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

・Apache再起動する
```systemctl restart httpd
```

##PHP動作確認
　var/www/html　配下に以下ファイルを作成する。
```vi var/www/html/version.php
```
・記載内容
```<?php phpinfo(); ?>
```
・ブラウザで以下URLを開く
http://127.0.0.1/version.php

・PHPとPostgreSQLの接続確認

##PHPからPostgreSQLへの接続確認
var/www/html　配下に以下ファイルを作成する。

```vi var/www/html/test.php
```

・サンプル内容

```<html>
<head><title>DB_conect_sample</title></head>
<body>
DB_conect_sample<BR>
<br>
<?php
 $DBHOST = "127.0.0.1";
 $DBPORT = "5432";
 $DBNAME = "testdb";
 $DBUSER = "testuser";
 $DBPASS = "password";
 try{
  //DB接続
  $dbh = new
  PDO("pgsql:host=$DBHOST;port=$DBPORT;dbname=$DBNAME;user=$DBUSER;password=$DBPASS");
  //SQL	
  $sql = 'select id,namae from t_user';

  foreach ($dbh->query($sql) as $row) {
    //指定Columnを一覧表示
    print($row['id'].' ');
    print($row['namae'].'<br>');
   }
}catch(PDOException $e){
  print("接続失敗".'<br>');
  print($e.'<br>');
  die();
 }
 //データベースへの接続を閉じる
 $dbh = null;
?>
</body>
</html>
```

ブラウザで開く
http://127.0.0.1/test.php

以上

★変更履歴
2021/4/14 Markdown記法で再編集した