LAMP環境構築(AlmaLinux8.4, PHP8.0, Apache2.4, MySQL8)

仮想環境 Virtual Box にLAMP環境を構築します。PHPプログラマー向けの設定です。

Virtual Box インストール

▼ 下記URLより VirtualBox platform packages をダウンロードしてインストール
https://www.virtualbox.org/wiki/Downloads 「Windows hosts」を選択

AlmaLinux 8.4 インストール

▼ 下記 URL から AlmaLinux ISO ファイルダウンロードページにアクセス
https://mirrors.almalinux.org/isos.html

▼ AlmaLinux ISO リンク x86_64 Versions 8.4 を選択
AlmaLinux Download ISO architectures select

▼ 近くのミラーサイト ftp.iij.ad.jp を選択
AlmaLinux Download ISO mirror site select

▼ AlmaLinux ISO ファイル AlmaLinux-8.4-x86_64-minimal.iso をダウンロード
AlmaLinux Download ISO minimal select

▼ Oracle VM VirtualBox マネージャーの「新規」クリック
仮想マシンの新規作成

▼ 仮想マシン情報を入力して「次へ」
仮想マシンの名前とオペレーティングシステム入力
・名前          : AlmaLinux84LAMP
・タイプ       : Linux
・バージョン : Red Hat(64-bit)

▼ 仮想マシンのメモリーサイズを 1024 に設定して「次へ」
仮想マシンのメモリーサイズ設定

▼ 仮想マシンのハードディスク 仮想ハードディスクを作成する を選択して「作成」
仮想マシンのハードディスクを選択

▼ 仮想ハードディスクのファイルタイプ VDI(VirtualBox Disk Image) を選択して「次へ」
仮想ハードディスクのファイルタイプを選択

▼ 仮想ハードディスクのストレージ 可変サイズ を選択して「次へ」
仮想ハードディスクのストレージを選択

▼ 仮想ハードディスクのファイル場所とサイズ(デフォルトのまま)を設定して「作成」
仮想ハードディスクのファイル場所とサイズを設定

▼ 作成した仮想マシンを選択
仮想マシンの選択

▼ 設定 > ストレージ > コントローラー:IDE「空」を選択し右上の CD アイコン をクリック「ディスクファイルを選択」
仮想マシンのストレージを設定

▼ ダウンロードした AlmaLinux ISO ファイル AlmaLinux-8.4-x86_64-minimal.iso を設定して「OK」
仮想マシンのストレージに AlmaLinux の ISO ファイルを設定

▼ 設定 > ネットワーク > アダプター2 の ネットワークアダプターを有効化 にチェック、割り当て ホストオンリーアダプター を選択して「OK」
仮想マシンのネットワークアダプター追加

▼ Virtual Box マネージャから仮想マシンを「起動」

▼「Install AlmaLinux 8.4」を選択
AlmaLinux 8.4 インストール

▼ インストール時の使用言語 日本語 を選択して「続行」
AlmaLinux インストール時の言語選択

▼ システム「インストール先」を選択
AlmaLinux インストール先選択

▼ 何も変えず「完了」
AlmaLinux インストール先設定

▼ ユーザーの設定「rootパスワード」を選択
AlmaLinux root パスワード選択

▼ root パスワードを入力して「完了」(脆弱なパスワードの場合「完了」の2回クリックが必要)
AlmaLinux root パスワード設定

▼「インストールの開始」クリック
AlmaLinux インストール開始

▼ AlmaLinux のインストール中...
AlmaLinux インストール

▼ AlmaLinux のインストールが完了したら「システムの再起動」
AlmaLinux インストール完了
▼ 再起動後に AlmaLinux8.4 のインストール画面が表示された場合...
・仮想マシンの電源オフ
・設定 > ストレージ > 右上のCDアイコンクリック > 仮想ドライブからディスクを除去 > OK
・Virtual Box マネージャから仮想マシンを「起動」

▼ root でログイン
localhost login: root
Password: (パスワードは非表示の為、見えない)

▼ ネットワークの確認
# ip a
1: lo: <LOOPBACK,UP,....
    link/loopback 00:...
    inet 127.0.0.1/8 scope...
...
2: enp0s3: <BROADCAST,...
    link/ether 08:...
...
3: enp0s8: <BROADCAST,...
    link/ether 08:...
...

▼ ネットワークアダプター1(enp0s3)の設定
# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 変更
ONBOOT=yes ▼ vi エディタの操作方法
・編集モード:「i」キー
・コマンドモード:「Esc」キー
・保存して終了:コマンドモードで「:wq」入力後に「Enter」キー
・保存せず終了:コマンドモードで「:q!」入力後に「Enter」キー

▼ ネットワークアダプター2(enp0s8)の設定
# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8 変更
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.56.108
PREFIX=24

▼ ネットワーク再起動
# systemctl restart NetworkManager
▼ ネットワークの確認(enp0s8 の inet に 192.168.56.108 が設定されていること)
# ip a
1: lo: <LOOPBACK,UP,....
    link/loopback 00:...
    inet 127.0.0.1/8 scope...
...
2: enp0s3: <BROADCAST,...
    link/ether 08:...
    inet 10.0.2.15/24 brd 10.0.2.255 scope...
...
3: enp0s8: <BROADCAST,...
    link/ether 08:...
    inet 192.168.56.108/24 brd 192.168.56.255 scope...
...

▼ パッケージのアップデート
# dnf -y update ▼ dnf コマンドが失敗する...
・ネットワークにプロキシサーバーを利用している場合、プロキシ設定を追加し AlmaLinux 再起動
# vi /etc/profile 最終行に追加
PROXY='プロキシIPアドレス:ポート番号'
export http_proxy=$PROXY
export HTTP_PROXY=$PROXY
export https_proxy=$PROXY
export HTTPS_PROXY=$PROXY

▼ SELINUX 無効化
# vi /etc/selinux/config 変更
SELINUX=disabled
▼ AlmaLinux 再起動
# reboot

Apache 2.4 インストール

▼ OpenSSL バージョン確認
# openssl version
OpenSSL 1.1.1g FIPS 21 Apr 2020

▼ Apache インストール # dnf -y install httpd httpd-devel mod_ssl
▼ Apache のバージョンを確認
# httpd -v
Server version: Apache/2.4.37 (AlmaLinux)
Server built: Apr 20 2021 10:48:33

▼ Apache 設定
# vi /etc/httpd/conf/httpd.conf ディレクトリ内のファイル一覧を非表示(Indexs 削除) #Options Indexes FollowSymLinks
Options FollowSymLinks
開発用変更
#EnableMMAP off
#EnableSendfile on
EnableSendfile off

▼ セキュリティ設定(新規ファイル作成)
# vi /etc/httpd/conf.d/security.conf
全て記載
# バージョン情報削除
ServerTokens Prod
ServerSignature Off

# inode 情報削除
FileETag None

# レスポンスヘッダから X-Powered-By を削除
Header unset X-Powered-By

# httpoxy 対策
RequestHeader unset Proxy

# クリックジャッキング対策
Header append X-Frame-Options SAMEORIGIN

# XSS 対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff

# XST 対策
TraceEnable Off

▼ Apache 起動
# systemctl start httpd
▼ Apache 自動起動設定
# systemctl enable httpd
▼ Firewall の設定確認
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  ...

▼ Firewall http(80番ポート)を開放
# firewall-cmd --permanent --add-service=http --zone=public
success

▼ Firewall https(443番ポート)を開放
# firewall-cmd --permanent --add-service=https --zone=public
success

▼ Firewall 再起動
# systemctl restart firewalld
▼ Firewall の設定確認(service に http と https が追加)
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports:
  protocols:
  ...

▼ ブラウザから Web サーバーにアクセス。「AlmaLinux Test Page」表示
http://192.168.56.108
Apache 初期画面「AlmaLinux Test Page」
▼ ブラウザでアクセスできない...
・ネットワークにプロキシサーバーを利用している場合:インターネットオプション > 接続 > LANの設定 > 詳細設定 > プロキシの除外設定 に「192.168.56.108」を追加

▼ 初期画面(Test Page)を非表示にする
# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.back

▼ Apache 再起動
# systemctl restart httpd

PHP 8.0 インストール

▼ epel リポジトリ追加
# dnf -y install epel-release
▼ remi リポジトリ追加
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
▼ dnf パッケージのアップデート実施
# dnf -y update
▼ PHP 8.0 インストール
# dnf -y install php80 php80-php-common php80-php-fpm php80-php-pdo php80-php-mbstring php80-php-gd php80-php-json php80-php-mysqlnd php80-php-xml php80-php-pecl-zip php80-php-pear ▼ epel、remi リポジトリを追加してから dnf がエラーになる...
・「/etc/yum.repos.d/remi.repo」と「/etc/yum.repos.d/epel.repo」の「enabled=1」を「enabled=0」に変更し再度実行

▼ PHP のバージョンを確認
# php80 -v
PHP 8.0.11 (cli) (built: Sep 21 2021 17:07:44) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.11, Copyright (c) Zend Technologies

▼ PHP 設定(開発用にエラーを画面表示するなど)
# vi /etc/opt/remi/php80/php.ini 変更
expose_php = Off
error_reporting = E_ALL
display_errors = On
date.timezone = Asia/Tokyo

▼ PHP FPM の設定
# vi /etc/httpd/conf.modules.d/00-mpm.conf
最終行に追加
# event MPM setting
<IfModule mpm_event_module>
  StartServers  2
  MinSpareThreads  25
  MaxSpareThreads  50
  ThreadsPerChild  50
  MaxRequestWorkers  50
  MaxConnectionsPerChild  0
  <FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
  </FilesMatch>
</IfModule>

▼ PHP FPM 起動
# systemctl start php80-php-fpm
▼ PHP FPM 自動起動設定
# systemctl enable php80-php-fpm

SSL インストール

▼ openssl 秘密鍵作成
# openssl genrsa -out php.sunabird.local.key 2048
▼ openssl CSR 作成(緑文字は入力項目)
# openssl req -new -key php.sunabird.local.key -out php.sunabird.local.csr
You are about to be asked to enter information that will be incorporated
....
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Kanagawa
Locality Name (eg, city) [Default City]:Yokohama
Organization Name (eg, company) [Default Company Ltd]:sunabird
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:php.sunabird.local
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

▼ openssl 自己署名サーバー証明書作成
# openssl x509 -req -in php.sunabird.local.csr -signkey php.sunabird.local.key -sha256 -days 3650 -out php.sunabird.local.crt
▼ 鍵と証明書を移動
# mv php.sunabird.local.key /etc/pki/tls/private/
# mv php.sunabird.local.crt /etc/pki/tls/certs/

▼ サイト用のディレクトリ作成(DocumentRootにする)
# mkdir /var/www/php.sunabird.local DocumentRoot(ドキュメントルート):ファイルを置くとブラウザからアクセスできるようになる場所
▼ VirtualHost 設定(https に自動リダイレクト、PHP FPM 連携)
# vi /etc/httpd/conf.d/php.sunabird.local.conf 全て記載
<VirtualHost *:80>
  ServerName php.sunabird.local

  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^php\.sunabird\.local
  RewriteRule ^/(.*)$ https://php.sunabird.local/$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
  DocumentRoot /var/www/php.sunabird.local/
  ServerName php.sunabird.local:443

  ErrorLog "/var/log/httpd/php.sunabird.local.error.log"   TransferLog "/var/log/httpd/php.sunabird.local.access.log"
  SSLEngine on
  SSLProtocol TLSv1.2 +TLSv1.3
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
  SSLCertificateKeyFile /etc/pki/tls/private/php.sunabird.local.key
  SSLCertificateFile /etc/pki/tls/certs/php.sunabird.local.crt

  <Directory "/var/www/php.sunabird.local/">
    AllowOverride All
  </Directory>
</VirtualHost>

▼ Apache と PHP FPM 再起動
# systemctl restart httpd
# systemctl restart php80-php-fpm

▼ 確認用ファイルを作成
# vi /var/www/php.sunabird.local/info.php 全て記載
<?php
phpinfo();

▼ Windows の hosts ファイル(C:\Windows\System32\drivers\etc\hosts)に追加
追加
192.168.56.108 php.sunabird.local ▼ 上書き禁止の場合、ファイルを右クリック > プロパティ > セキュリティ > 編集 > Users を選択し「フルコントロール」にチェックし「OK」 > Windowsセキュリティの警告「はい」> 「OK」
windows10 ファイル権限変更

▼ ブラウザからWebサーバーに https でアクセス。PHP 設定情報が表示されることを確認
https://php.sunabird.local/info.php

▼「詳細設定」クリック
ブラウザエラー「この接続ではプライバシーが保護されません」
▼「php.sunabird.local にアクセスする(安全ではありません)」クリック
ブラウザエラー「php.sunabird.local にアクセスする(安全ではありません)」
▼ PHP 設定情報表示「PHP Version 8.0....」表示を確認
ブラウザ PHP 設定情報表示「PHP Version 8.0.11...」
▼ SSLでアクセスできない...
・ネットワークにプロキシサーバーを利用している場合:インターネットオプション > 接続 > LANの設定 > 詳細設定 > プロキシの除外設定 に「php.sunabird.local」を追加

MySQL 8 インストール

▼ MySQL 8 をインストール
# dnf install -y mysql-devel mysql-server ▼ dnf コマンドが失敗する...
・ネットワークにプロキシサーバーを利用している場合、プロキシ設定を追加し AlmaLinux 再起動
# vi /etc/profile 最終行に追加
PROXY='プロキシIPアドレス:ポート番号'
export http_proxy=$PROXY
export HTTP_PROXY=$PROXY
export https_proxy=$PROXY
export HTTPS_PROXY=$PROXY

▼ バージョン確認
# mysqld --version
/usr/libexec/mysqld Ver 8.0.21 for Linux on x86_64 (Source distribution)

▼ MySQL 起動と自動起動設定
# systemctl start mysqld
# systemctl enable mysqld

▼ MySQL にログイン
# mysql -u root -p
Enter password:(何も入力せず「Enter」)

▼ パスワードの変更
mysql> SET PASSWORD= 'Sunabird000000-';
▼ テスト用データベースとテーブルを作成しサンプルデータを登録する
mysql> CREATE DATABASE test;
mysql> use test;
mysql> CREATE TABLE t_test(id SERIAL PRIMARY KEY, name VARCHAR(20));
mysql> INSERT INTO t_test (name) VALUES ('kato makoto');
mysql> INSERT INTO t_test (name) VALUES ('tajima tae');

▼ 登録したサンプルデータを確認する
mysql> SELECT * FROM t_test;
+------+---------------+
 |  id | name
+------+---------------+
 |  1  | kato makoto
 |  2  | tajima tae
+------+---------------+
2 rows in set (0.00 sec)

▼ MySQL ログアウト
mysql> exit;
▼ PHP から MySQL への接続確認用のファイル作成
# vi /var/www/php.sunabird.local/mysql_test.php
全て記載
<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'Sunabird000000-');
    foreach($dbh->query('SELECT * FROM t_test') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "エラー!: " . $e->getMessage() . "<br/>";
    die();
}

▼ ブラウザからアクセスし DB に格納したサンプルデータの表示を確認
https://php.sunabird.local/mysql_test.php
ブラウザ MySQL接続、データ表示確認

▼ メールサーバ Postfix インストール
# dnf -y install postfix
▼ AlmaLinux のタイムゾーンを確認
# timedatectl status ▼ JSTではない場合、設定変更
# timedatectl set-timezone Asia/Tokyo

▼ NTP サーバー設定
# vi /etc/chrony.conf 変更
#pool 2.cloudlinux.pool.ntp.org iburst
pool ntp.nict.jp

▼ chrony 再起動
# systemctl restart chronyd
*時刻の同期には時間がかかります

メールサーバー Postfix 設定

▼ Postfix インストール
# dnf -y install postfix
▼ Postfix 起動と自動起動設定
# systemctl start postfix
# systemctl enable postfix

▼ PHP から メール送信
# vi /var/www/php.sunabird.local/mail_test.php 全て記載
<?php
mb_language('ja');
mb_internal_encoding('iso-2022-jp');

$to      = "送信先メールアドレス";
$header  = "From: info@sunabird.local \n";
$subject = "Test Title";
$message = "Test Message.";

$header  = mb_convert_encoding($header,  'iso-2022-jp', 'UTF-8');
$subject = mb_convert_encoding($subject, 'iso-2022-jp', 'UTF-8');
$message = mb_convert_encoding($message, 'iso-2022-jp', 'UTF-8');

if (mb_send_mail($to, $subject, $message, $header)) {
    echo 'OK!';
} else {
    echo 'NG!';
}
mb_internal_encoding('UTF-8');

▼ ブラウザからアクセスして 送信先メールアドレス にメールが送信されることを確認(https://php.sunabird.local/mail_test.php

Windows(ホストOS)と LAMP環境(ゲストOS)の連携

▼ VBox GuestAdditions に必要なパッケージをインストール
# dnf -y install kernel-devel kernel-headers dkms gcc gcc-c++ bzip2 perl make
▼ AlmaLinux 再起動
# reboot
▼ VirtualBox コンソール側の デバイス > 「GuestAdditions CD イメージの挿入...」
VirtualBox コンソール GuestAdditions CD イメージの挿入...

▼ VBox GuestAdditions インストール
# mkdir /mnt/cdrom
# mount -r /dev/cdrom /mnt/cdrom
# sh /mnt/cdrom/VBoxLinuxAdditions.run

▼ apache ユーザを vboxsfグループに追加
# gpasswd -a apache vboxsf
▼ VirtualBox マネージャより共有フォルダーを設定する

▼ 設定 > 共有フォルダー > 右上「ディレクトリ+」アイコン
VirtualBox マネージャ「共有フォルダーの追加」
・フォルダーのパス:(Windows側で共有したいディレクトリ)
・フォルダー名:(フォルダ名)
・「自動マウント(A):チェック」「永続化する(M):チェック」
・「OK」

▼ サーバ起動時に自動に共有化されるように設定
# vi /etc/rc.local 最終行に追加
mount -t vboxsf (共有フォルダーのフォルダー名) /var/www/php.sunabird.local -o uid=apache,gid=apache
▼ ディレクトリの権限設定
# chown -R apache:apache /var/www/php.sunabird.local
# chmod -R 777 /var/www/php.sunabird.local
# chmod u+x /etc/rc.d/rc.local

▼ AlmaLinux 再起動
# reboot
▼ Windows 共有ディレクトリの DocumentRoot に確認用ファイル作成
C:\www\php.sunabird.local\test.php
全て記載
<?php
echo 'test';

▼ ブラウザから確認ファイルにアクセス。「test」と表示されたらOK
https://php.sunabird.local/test.php

以上で Virtual Box に LAMP 環境が構築されました。
これから PHP で楽しい Web システムをどんどん開発してください