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

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

Virtual Box インストール

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

CentOS8 インストール

下記URLより CentOS Linux DVD ISO「CentOS-8.xxxxx-x86_64-dvd1.iso」をダウンロード
https://www.centos.org/download/

Oracle VM VirtualBox マネージャーの「新規」ボタンクリックし、任意の名前を入力し、タイプ:Linux、バージョン:Red Hat(64-bit)を選択し「次へ」




メモリーサイズはデフォルト(1024MB)で「次へ」


ハードディスクはデフォルト「仮想ハードディスクを作成する」で「作成」


ハードディスクのファイルタイプはデフォルト「VDI(VirtualBox Disck Image)」で「次へ」


物理ハードディスクにあるストレージはデフォルト「可変サイズ」を選択し「次へ」


ファイルの場所とサイズはデフォルトのままで「作成」


設定 > ストレージ > コントローラー:IDE「空」を選択し右上のCDをクリック「仮想光学ディスクファイルを選択」しダウンロードした「CentOS-8.xxxxx-x86_64-dvd1.iso」を選択し「OK」







Virtual Box マネージャから「起動」

「Install CentOS Linux 8」を選択


「日本語」を選択し「続行」


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


何も変えず「完了」をクリック


「インストールの開始」を選択

「ソフトウェアの選択」から「CentOS8 Minimal Install」が選択できます
「rootパスワード」を選択


パスワードを入力して「完了」


インストールが完了したら「再起動」

再起動後に CentOS Linux8 のインストール画面が再度表示された場合は下記対応を実施
・仮想マシンの電源オフ
・設定 > ストレージ > 右上のCDアイコンクリック > 仮想ドライブからディスクを除去 > OK
・起動

初期セットアップ「LICENSING」をクリックしライセンス契約に同意します






ようこそ画面で「次へ」


プライバシー「オフ」


オンラインアカウント「スキップ」


ユーザー情報を入力し「次へ」


パスワードを入力し「次へ」


準備完了「CentOS Linux を使い始める(s)」


アカウントの選択、パスワードを入力し「サインイン」




初めて使う方へ「×」
アクティビティ > 端末 をクリック


グラフィックモードで起動される為、テキストモードで起動されるように変更する
root ユーザーに変更
CentOS8インストール時に「ソフトウェアの選択」から「Minimal Install」を選択した場合は不要

$ su -
パスワード :

テキストモードに設定変更
# systemctl set-default multi-user.target

再起動
# reboot



テキストモードの起動確認が取れたら root でログインし 一度シャットダウン
# shutdown -h now


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


Virtual Box マネージャから「起動」

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

ネットワーク設定ファイルをコピー(アダプター2用)
# cp /etc/sysconfig/network-scripts/ifcfg-enp0s3 /etc/sysconfig/network-scripts/ifcfg-enp0s8 長いディレクトリ名やファイル名を入力する際、初めの数文字を入力し「Tab」キーで補完。途中まで同じ名前の場合「Tab」キー2回で候補が表示されます
ネットワーク(アダプター2)の設定
# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8 (変更)
BOOTPROTO=none
NAME=enp0s8
DEVICE=enp0s8
(削除)
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ネットワーク再起動
# systemctl restart NetworkManager
任意の IP アドレスを設定
# nmcli c mod enp0s8 ipv4.method manual ipv4.addresses "192.168.56.108/24"
ネットワーク再起動
# systemctl restart NetworkManager
IP アドレスの確認
# ip a 3: enp0s8 :
inet 192.168.56.108/24 brd 192.168.56.255 scope global dynamic enp0s8

パッケージアップデート
# yum -y update yum コマンドが失敗する...
・ネットワークにプロキシサーバーを利用している場合「/etc/profile」ファイルの最下部にプロキシ設定を追加し CentOS 再起動
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
CentOS 再起動
# reboot
オープンソース版の Poderosa4 をダウンロードし今後はこのターミナルエディタから仮想環境を操作する
https://sourceforge.net/projects/poderosa/files/releases/
最新バージョン(Poderosa-4.x.x-bin.zip)をダウンロード、解凍して Poderosa.exe 実行
Windows10 で解凍したファイルが正常動作しない...
・解凍前のファイルで 右クリック > プロパティ > 下部の「セキュリティ:このファイルは他のコンピューターから取得した・・・」を「許可する」にチェックしてから解凍


右側の青い PC アイコンクリック

サーバー設定を入力し「OK」
・SSH : SSH2
・ホスト(H) : 192.168.56.108
・ポート(T) : 22
・アカウント(A) : root
・認証方法(U) : パスワード
・パスフレーズ(P) : rootパスワード


ssh hostkey fingerprint .............
SSH サーバの公開鍵は ssh_known_hosts に登録されていません。登録して続行しますか? > 「はい(Y)」

Apache 2.4 インストール

OpenSSL バージョン確認
# openssl version
OpenSSL 1.1.1c FIPS 28 May 2019

Apache インストール # yum -y install httpd httpd-devel mod_ssl
Apache のバージョンを確認
# httpd -v
Server version: Apache/2.4.37 (centos)
Server built: Jun 8 2020 20:14:33

Apache 設定
# vi /etc/httpd/conf/httpd.conf (開発用変更)
EnableMMAP off
EnableSendfile off
(ディレクトリ内のファイル一覧を見られないようにする) Options Indexes FollowSymLinks
↓ (Indexes 削除)
Options FollowSymLinks

セキュリティ設定(新規ファイル作成)
# 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 http(80)のポート番号を開放
# firewall-cmd --permanent --add-port=80/tcp
Firewall ssl(443)のポート番号を開放
# firewall-cmd --permanent --add-port=443/tcp
Firewall 再起動
# systemctl restart firewalld
ブラウザから Web サーバーにアクセス。「Test Page」が表示されることを確認
http://192.168.56.108

ブラウザでアクセスできない...
・ネットワークにプロキシサーバーを利用している場合:インターネットオプション > 接続 > LANの設定 > 詳細設定 > プロキシの除外設定 に「192.168.56.108」を追加

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

PHP 8.0 インストール

epel リポジトリ追加
# yum -y install epel-release
remi リポジトリ追加
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
PHP8.0(beta) インストール
# yum -y install --enablerepo=remi 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 epel や remi リポジトリを追加してから yum がエラーになる...
・「/etc/yum.repos.d/remi.repo」と「/etc/yum.repos.d/epel.repo」の「enabled=1」を「enabled=0」に変更し再度実行

PHP のバージョンを確認
# php80 -v
PHP 8.0.0beta3 (cli) (built: Sep 1 2020 17:13:26) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, 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 設定(SSL に自動リダイレクト、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

  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」


ブラウザからWebサーバーに https でアクセス。「PHP の設定」が表示されることを確認
https://php.sunabird.local/info.php
※詳細設定 >「php.sunabird.local にアクセスする(安全ではありません)」をクリック

SSLでアクセスできない...
・ネットワークにプロキシサーバーを利用している場合:インターネットオプション > 接続 > LANの設定 > 詳細設定 > プロキシの除外設定 に「php.sunabird.local」を追加

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

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


VBox GuestAdditions インストール
# mkdir /mnt/cdrom # mount -r /dev/cdrom /mnt/cdrom # cd /mnt/cdrom/ # sh VBoxLinuxAdditions.run
apache ユーザを vboxsfグループに追加
# gpasswd -a apache vboxsf
VirtualBox マネージャより共有フォルダーを設定する
・「設定」「共有フォルダー」右上「ディレクトリ+」アイコン
・フォルダーのパス:C:\www(Windows側で共有したいディレクトリ)
・フォルダー名:www(フォルダ名)
・「自動マウント(A):チェック」「永続化する(M):チェック」
・「OK」


Windows 共有ディレクトリ内に DocumentRoot 指定したディレクトリを作成する
C:\www\html
C:\www\php.sunabird.local

サーバ起動時に自動に共有化されるように設定
# vi /etc/rc.local (一番下に追加)
mount -t vboxsf www /var/www -o uid=apache,gid=apache
ディレクトリの権限設定
# chown -R apache:apache /var/www # chmod -R 777 /var/www # chmod u+x /etc/rc.d/rc.local
CentOS 再起動
# reboot
Windows 共有ディレクトリの DocumentRoot に確認用ファイル作成
C:\www\php.sunabird.local\test.php
(全て追加)
<?php
echo 'test';

ブラウザから確認ファイルにアクセス
https://php.sunabird.local/test.php
「test」と表示されたらOK
※これでWindows側の共有ディレクトリ内にファイルを作成すると仮想環境のWebサーバに反映されるようになる

MySQL 8 インストール

下記 URL で MySQL の最新バージョンを確認
https://dev.mysql.com/downloads/repo/yum/
2020.9.10 時点 「mysql80-community-release-el8-1.noarch.rpm」
MySQL 最新バージョンをインストール
# yum -y install http://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm # yum -y install mysql-server mysql-devel yum コマンドが失敗する...
・ネットワークにプロキシサーバーを利用している場合「/etc/profile」ファイルの最下部にプロキシ設定を追加し CentOS 再起動
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.17 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 への接続確認用のファイル作成
C:\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


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

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