Oracle VM VirtualBoxのCentOS Sream_9にLAMP環境を構築する

## ポートフォワーディングの設定
ブラウザから閲覧できるかを確認するためポートフォワーディングを設定する。
「設定」→「ネットワーク」→「ポートフォワーディング(P)」をクリック

「ホストポート」、「ゲストポート」をHTTP用に共に80を設定する

## 一般ユーザーからrootユーザーに切り替え
CentOSにログイン。環境構築のため一般ユーザーからrootユーザーに切り替え作業を行う。
```
# rootユーザーに切り替え
$ su -

:パスワードを入力
```

## ファイアウォールの無効化
- ファイアウォールの状態確認
```
$ systemctl status firewalld

# Active: active (running) と表示されていたら起動中
```

- ファイアウォールを無効化
```
# 無効化
$ systemctl stop firewalld

# 状態を再確認。Active: inactive (dead) と表示されていたら止まっている。
$ systemctl status firewalld
```

- ファイアウォールの自動起動設定を確認・無効化
```
# 設定を確認。enabled と表示されていたら、次回起動時に自動起動するので無効化する。
$ systemctl is-enabled firewalld

# 設定を無効化。再度設定確認コマンドを実行し、disabled と表示されていたら、自動起動設定を無効化できています。
$ systemctl disable firewalld
```

## Apacheのインストール
- インストール
```
dnf install -y httpd
```

- Apacheの起動
```
# 起動
$ systemctl start httpd

# 状態の確認。Active: active (running) と表示されていたら起動中。
$ systemctl status httpd
```

- Apacheの自動起動設定を有効化
```
# 有効化
$ systemctl enable httpd

# 設定を確認。enabled と表示されていたら、次回起動時に自動起動します。
$ systemctl is-enabled httpd
```

- Apacheにアクセス
http://localhost/ にブラウザでアクセス
Apacheのデフォルト画面が表示されます

## PHPのインストール

- EPELリポジトリをインストール
RHELまたはCentOSの次期バージョン向けのEPELパッケージを提供するリポジトリをインストールします。
```
# 事前にリポジトリの一覧を表示し確認
$ dnf repolist

# リポジトリの詳細情報を一覧表示する
$ dnf repolist -v

# 有効および無効なリポジトリの両方を一覧表示する
$ dnf repolist all
```

```
# EPELリポジトリをインストール
# epel-nextは、将来のバージョンのパッケージをテストまたは利用したい場合に使用されることがあり、
特にCentOS Streamなどのローリングリリース向けに役立ちます。

$ dnf -y install epel-release epel-next-release
```

- Remiリポジトリをインストール
```
$ dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

# Remiリポジトリがインストールされてるか確認
$ dnf repolist | grep remi
```

- PHP8.4をインストール
```
# インストール可能なPHPバージョンを確認する
$ dnf module list php

# 特定バージョンのRemiリポジトリを有効化する
$ dnf module reset php
$ dnf module enable php:remi-8.4

# PHPをインストール
$ dnf install php

# PHPが正しくインストールされたかどうか下記コマンドで確認
$ php -v

# この後追加モジュールをインストール（必要に応じて）
dnf install -y php-json php-mbstring php-zip php-gd php-pdo php-mysqlnd php-mysqli
```

## SELinuxの無効化
ブラウザ上でPHPの動作を確認するためSELinuxを無効化する

- SELinux設定の確認
```
$ getenforce
# Enforcing と表示されていたら、SELinuxが有効
```

- 無効化の設定
```
$ vim /etc/selinux/config

# 下記のように設定を変更
SELINUX=enforcing
↓
SELINUX=disabled
```

- CentOS Sream_9を再起動
```
$ systemctl reboot

# 再度下記コマンドで設定を確認し、Disabledと表示されたら成功
$ getenforce
```

## MariaDBのインストール

- MariaDB公式リポジトリをインストール
```
$ dnf install -y curl
$ curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
```

- MariaDBのインストール
```
$ dnf install -y MariaDB-server MariaDB-client

# バージョンを確認。エラーなく表示されれば成功
$ mariadb --version

# 起動と自動起動設定を有効化
$ systemctl start mariadb
$ systemctl enable mariadb
```

- 初期設定するために、セキュリティスクリプトを実行して、rootパスワードの設定や匿名ユーザーの削除などを行います
```
mariadb-secure-installation
```
rootパスワードの設定や匿名ユーザーの削除などを行います。下記サイトを参考にさせていただきました。

MariaDBが正常に動作しているか確認
ステータスが「active」と表示されれば、インストールは正常に完了
```
$ systemctl status mariadb
```

## MariaDBにログイン
現状rootユーザーしかいないので新しくユーザーを追加します

- まずrootユーザーでMariaDBにログイン
```
$ mariadb -u root -p
```

- 新しいユーザーを追加
```
# ユーザー名とパスワードは任意で
# ホストは基本的にlocalhostを指定すればOK
$ CREATE USER '新しいユーザー名'@'ホスト' IDENTIFIED BY 'パスワード';
```

- ユーザーに権限を付与
```
$ GRANT ALL PRIVILEGES ON データベース名.* TO '新しいユーザー名'@'ホスト';

# すべてのデータベースに対して全権限を付与する場合は下記のように設定
$ GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
```

- 権限のリロード。権限を有効にするため、以下のコマンドを実行
```
$ FLUSH PRIVILEGES;
```

- テスト用DBの作成とサンプルデータの挿入
```
# テスト用データベースの作成
$ CREATE DATABASE testdb;

# テーブルの作成とサンプルデータの挿入
USE testdb;
CREATE TABLE test_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
);
INSERT INTO test_table (name) VALUES ('sample data');
```

## ブラウザ上でDB接続を確認
index.phpをサーバー（デフォルトでは /var/www/html ）にアップロードし、下記URLにアクセスしてサンプルデータが表示されれば成功
http\://localhost
```
<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
$username = '【新しく追加したユーザー名】';
$password = '【追加したユーザーのパスワード】';

try {
    // PDOオブジェクトを生成
    $pdo = new PDO($dsn, $username, $password);
    
    // エラーモードを例外に設定
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "接続成功<br>";

    // テーブルの中身を取得して表示
    $sql = "SELECT id, name FROM test_table";
    $stmt = $pdo->query($sql);

    if ($stmt->rowCount() > 0) {
        // 結果を出力
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo "id: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
        }
    } else {
        echo "0 件のレコード";
    }
} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage();
}
?>
```

## phpMyAdminのインストール
ついでにMySQLデータベースの接続クライアントツールであるphpMyAdminをインストール。これがあるといろいろ楽なので

- 必要なパッケージをインストール
```
$ dnf install -y php-json php-mbstring php-zip php-gd
```

- phpMyAdminのインストール
```
$ dnf --enablerepo=remi install -y phpMyAdmin
```

- phpMyAdminのアクセスを許可するため、Apacheの設定を編集
```
$ vi /etc/httpd/conf.d/phpMyAdmin.conf

# 下記のように編集
Require local
↓
Require all granted

# Apacheの再起動
$ systemctl restart httpd
```
http\://localhost/phpMyAdmin にアクセスしてログインできれば成功

## vsftpdのインストール
ついでにFTP接続できるようにします。CentOS Stream 9でFTPサーバーを有効にするには、vsftpdを使用します。
```
$ dnf install -y vsftpd

# FTPサーバーの起動と自動起動の設定
$ systemctl start vsftpd
$ systemctl enable vsftpd
```

初期設定を変更する際は /etc/vsftpd/vsftpd.conf を編集
FTP接続に自分はFileZillaを使用しています（自分的にはこれが一番使いやすい）
接続方法は各々で調べてやってみてください。そんなに難しくないはず。

# 参考文献
> [CentOS Stream 9 : MariaDB 10.5 : インストール : Server World](https://www.server-world.info/query?os=CentOS_Stream_9&p=mariadb&f=1)
[CentOS7にLAMP環境を構築する手順書](https://jet-blog.com/how-to-build-lamp-on-virtualbox-centos7/#toc12)
[macOSでMariaDB](https://qiita.com/ynack/items/4709b77d42847823cdb3)

色々と参考にさせていただきました。ありがとうございます。