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

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

Virtual Box インストール

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

FreeBSD 13 インストール

下記URLより FreeBSD 13.0 DVD ISO「FreeBSD-13.0-RELEASE-amd64-dvd1.iso」をダウンロード
https://download.freebsd.org/ftp/releases/ISO-IMAGES/13.0/

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

VirtualBox make Server OS

▼ メモリーサイズはデフォルト 1024MB で「次へ」
VirtualBox make Server Memory Size

▼ ハードディスクはデフォルト 仮想ハードディスクを作成する で「作成」
VirtualBox make Server Disk Size

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

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

▼ ファイルの場所とサイズはデフォルトのままで「作成」
VirtualBox make Server File Place

▼「設定」をクリック
VirtualBox make Server Storage

▼ ストレージ > コントローラー:IDE「空」を選択。右上の CD アイコン をクリック
VirtualBox make Server Storage Disk

▼「仮想光学ディスクファイルを選択」からダウンロードした FreeBSD-13.0-RELEASE-amd64-dvd1.iso を選択し「OK」
VirtualBox make Server Storage Disk Select ISO

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

▼ FreeBSD のインストール画面が表示
FreeBSD Install Start

▼「Install」
FreeBSD Install Wellcome

Japanese 106 を選択。「Select」
FreeBSD Install Keymap Selection

Continue with jp.kbd keymap を選択。「Select」
FreeBSD Install Keymap Selected

▼ 任意のホスト名 localhost を入力。「OK」
FreeBSD Install Set Hostname

lib32 ports を選択(スペースキーで選択/解除)。「OK」
FreeBSD Install Distribution Select

Auto (UFS) を選択。「OK」
FreeBSD Install Partitioning

▼ パーティションは「Entire Disk」(ディスク全体)を選択
FreeBSD Install Partition

GPT を選択。「OK」
FreeBSD Install Partition Scheme

▼ 設定した内容を確認。「Finish」
FreeBSD Install Partition Editor

▼「Commit」でインストール開始
FreeBSD Install Confirmation

FreeBSD Install Archive Extraction

▼ root パスワードを入力。 Enter キー(入力文字は表示されない)
FreeBSD Install root password

▼ 再度 root パスワードを入力。 Enter キー(入力文字は表示されない)
FreeBSD Install root password check

▼ network を確認。「OK」
FreeBSD Install Network Configration

▼ IPv4 設定「Yes」
FreeBSD Install Network Configration IPv4

▼ DHCP 設定「Yes」
FreeBSD Install Network Configration DHCP

▼ IPv6 設定「Yes」
FreeBSD Install Network Configration IPv6

▼ SLAAC 設定「Yes」(アドレス自動設定)
FreeBSD Install Network Configration SLAAC

▼ DNS 設定を確認。「OK」(OK/Cancel 切り替えは Tabキー)
FreeBSD Install Network Configration Check

▼ Time Zone Asia を選択。「OK」
FreeBSD Install Time Zone Selector

▼ 国・地域は Japan を選択。「OK」
FreeBSD Install Countries in Asia

'JST' を確認。「Yes」
FreeBSD Install Asia Confirmation

▼ 現在の日付を設定(Tab キー/矢印キー)。「Set Date」
FreeBSD Install Time & Date

▼ 時間を設定(Tab キー/Del キー/数字キー)。「Set Time」
FreeBSD Install Time & Date Set

▼ 起動時に動作するサービスを選択(スペースキーで選択/解除)。「OK」
FreeBSD Install System Configuration

▼ セキュリティを強化するサービス。デフォルトのままで「OK」
FreeBSD Install System Hardening

▼ root 以外のユーザーを追加。開発環境用なので追加せず「No」
FreeBSD Install Add User Accounts

▼ 設定の修正、追加ができます。完了したら Exit を選択。「OK」
FreeBSD Install Final Configuration

▼ 追加設定の選択は「No」
FreeBSD Install Manual Configuration

▼ インストール終了。「Reboot」で再起動
FreeBSD Install Complete
※再起動後 FreeBSD のインストール画面が再度表示された場合...
▼ デバイス > 光学ドライブ > 仮想ドライブからディスクを除去

▼ ファイル > 閉じる > 仮想マシンの電源オフ

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

▼ FreeBSD 起動。 root でログイン(パスワード入力文字は表示されない)。そしてシャットダウン
login: root
Password:
...
# shutdown -p now

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


▼ FreeBSD を起動。root でログインしネットワークを設定する
▼ bsdconfig コマンドでシステム設定メニューを開く
# bsdconfig
Networking Managemant を選択。「OK」


Network Interfaces を選択。「OK」


▼ ネットワークアダプター2(ホストオンリーアダプター)em1 を選択。「OK」


ipaddr を選択。「OK」


192.168.56.110(最後の 110 は任意。1~254の数値を設定)を入力。「OK」


netmask を選択。「OK」


255.255.255.0 を入力。「OK」


Save/Exit を選択。「OK」

・DHCP : Disabled(自動IPアドレスの割当てを無効)
・ipaddr : 192.168.56.110
・netmask : 255.255.255.0

▼ 設定したネットワーク em1 を起動「Yes」


▼ gateway 10.0.2.2 が既にルーティングテーブルに存在しているエラーが表示されるが「OK」


▼ Networking Managemant を終了。Exit を選択。「OK」


▼「Exit bsdconfig」でシステム設定を終了


▼ ifconfig コマンドでネットワーク em1 の IP が設定されている事を確認( em1 の inet が 192.168.56.110 になっている事)
# ifconfig
em0: flags=...
    ...
    ...
em1: flags=...
    ....
    inet 192.168.56.110 netmask ...
    ....
lo0: flags=...
    ...
    ...

▼ Windows(ホスト側)のコマンドプロンプトより FreeBSD サーバーへの通信を確認
Microsoft Windows [Version 10.0.19042.1288]
(c) Microsoft Corporation. All rights reserved.

C:\Users\suna> ping 192.168.56.110

192.168.56.110 に ping を送信しています 32 バイトのデータ:
192.168.56.110 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.56.110 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.56.110 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.56.110 からの応答: バイト数 =32 時間 =1ms TTL=64

192.168.56.110 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 1ms、平均 = 0ms

▼ root で SSH ログインを許可
# vi /etc/ssh/sshd_config 変更
#PermitRootLogin no
PermitRootLogin yes

#PasswordAuthentication no
PasswordAuthentication yes

▼ SSH サーバーを再起動
# /etc/rc.d/sshd restart
▼ パッケージアップデート
# pkg update -f

Apache 2.4 インストール

▼ インストールする Apache パッケージを検索
# pkg search apache2
apache24-2.4.51
...

▼ Apache 2.4 インストール # pkg install -y apache24-2.4.51
▼ Apache のバージョンを確認
# httpd -v
Server version: Apache/2.4.51 (FreeBSD)
Server built: unknown

▼ Apache 設定
# vi /usr/local/etc/apache24/httpd.conf rewrite を有効(# 削除)
#LoadModule rewrite_module libexec/apache24/mod_rewrite.so
LoadModule rewrite_module libexec/apache24/mod_rewrite.so
ssl を有効(# 削除)
#LoadModule ssl_module libexec/apache24/mod_ssl.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
ディレクトリ内のファイル一覧を見られないようにする(Indexes 削除)
#Options Indexes FollowSymLinks
Options FollowSymLinks
ファイル名が指定されない場合の読込みファイルを設定(index.php 追加)
#DirectoryIndex index.html
DirectoryIndex index.php index.html
開発用変更
EnableMMAP off
EnableSendfile off

▼ セキュリティ設定(新規ファイル作成)
# vi /usr/local/etc/apache24/Includes/security.conf
全て記載
# version data delete
ServerTokens Prod
ServerSignature Off

# inode data delete
FileETag None

# response header X-Powered-By delete
Header unset X-Powered-By

# httproxy counterplan
RequestHeader unset Proxy

# click jacking counterplan
Header append X-Frame-Options SAMEORIGIN

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

# XST counterplan
TraceEnable Off

▼ Apache 起動設定
# vi /etc/rc.conf 最下部に追加
# Apache24 add
apache24_enable="YES"

▼ Apache 起動 # apachectl start
▼ Apache 起動確認
# apachectl status
apache24 is running as pid ....

▼ ブラウザから Web サーバーにアクセス。「It works!」が表示されることを確認(http://192.168.56.110

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

PHP 8.0 インストール

▼ PHP で利用可能なパッケージバージョンを調べる
# ls /usr/ports/lang/ | grep php
php-mode.el
php73
php73-extensions
php74
php74-extensions
php80
php80-extensions
▼ PHP で必要なパッケージをインストール
# pkg install -y php80 php80-curl php80-gd php80-imap php80-ldap php80-mbstring php80-session php80-openssl php80-pdo php80-pdo_mysql php80-pdo_pgsql php80-xml php80-zip mod_php80
▼ PHP のバージョンを確認
# php -v
PHP 8.0.12 (cli) (built: Oct 24 2021 01:19:09) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.12, Copyright (c) Zend Technologies

▼ PHP 設定(php.ini)変更(開発用)
# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
# vi /usr/local/etc/php.ini
変更
expose_php = Off
error_reporting = E_ALL
display_errors = On
date.timezone = Asia/Tokyo

▼ Apache 設定ファイル(httpd.conf)に PHP 読込み情報を追加
# vi /usr/local/etc/apache24/httpd.conf 追加
# PHP AddType
AddType application/x-httpd-php .php

▼ Apache 再起動
# apachectl restart
▼ PHP確認ファイルを作成
# vi /usr/local/www/apache24/data/info.php 全て記載
<?php
phpinfo();

▼ ブラウザから Web サーバーにアクセス。「PHP Version ...」が表示されることを確認(http://192.168.56.110/info.php


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) [Some-State]:Kanagawa
Locality Name (eg, city) []:Yokohama
Organization Name (eg, company) [Internet Widgits Pty Ltd]:sunabird
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: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 /usr/local/etc/ssl/
# mv php.sunabird.local.crt /usr/local/etc/ssl/

▼ httpd.conf に Virtual hosts ファイル読込み設定
# vi /usr/local/etc/apache24/httpd.conf # 削除
# Virtual hosts
#Include etc/apache24/extra/httpd-vhosts.conf
Include etc/apache24/extra/httpd-vhosts.conf

▼ サイト用のディレクトリ作成(DocumentRootにする)
# mkdir /usr/local/www/apache24/php.sunabird.local DocumentRoot(ドキュメントルート):ファイルを置くとブラウザからアクセスできるようになる場所。
▼ vhosts ファイルのバックアップ
# mv /usr/local/etc/apache24/extra/httpd-vhosts.conf /usr/local/etc/apache24/extra/httpd-vhosts.conf.back
▼ Virtual host 設定(SSL に自動リダイレクト)
# vi /usr/local/etc/apache24/extra/httpd-vhosts.conf 全て記載
Listen 443

<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>
  ServerName php.sunabird.local:443

  ErrorLog "/var/log/httpd-error.php.sunabird.local.log"
  TransferLog "/var/log/httpd-access.php.sunabird.local.log"

  SSLEngine on
  SSLProtocol -all +TLSv1.2
  SSLCertificateKeyFile /usr/local/etc/ssl/php.sunabird.local.key
  SSLCertificateFile /usr/local/etc/ssl/php.sunabird.local.crt

  DocumentRoot "/usr/local/www/apache24/php.sunabird.local"
  <Directory "/usr/local/www/apache24/php.sunabird.local">
    AllowOverride All
    Options FollowSymLinks
    Require all granted
  </Directory>
</VirtualHost>

▼ Apache の再起動
# apachectl restart
▼ 確認用ファイルを作成
# vi /usr/local/www/apache24/php.sunabird.local/test.php 全て記載
<?php
echo "TEST OK";

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

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

MySQL 8 インストール

▼ MySQL8 のパッケージ確認
# pkg search mysql8
mysql80-client-8.0.26 Multithreaded SQL database (client)
mysql80-server-8.0.26 Multithreaded SQL database (server)

▼ MySQL8.0 をインストール
# pkg install -y mysql80-server
▼ MySQL バージョン確認
# mysql --version
mysql Ver 8.0.26 for FreeBSD13.0 on amd64 (Source distribution)

▼ MySQL 起動設定
# vi /etc/rc.conf 追加
# MySQL add
mysql_enable="YES"

▼ MySQL 起動
# /usr/local/etc/rc.d/mysql-server start
▼ MySQL にログイン
# mysql -u root -p
Enter password:(何も入力せず「Enter」)

▼ パスワードの変更
mysql> SET PASSWORD='Sunabird000000-';
▼ root の認証方式を「caching_sha2_password」から「mysql_native_password」に変更(パスワードは同じ)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '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 /usr/local/www/apache24/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 "ERROR!: " . $e->getMessage() . "<br/>";
    die();
}

▼ ブラウザからアクセスし DB に格納したサンプルデータが表示されることを確認(https://php.sunabird.local/mysql_test.php


メール(sendmail + Google SMTP)設定

▼ Google アカウント設定
セキュリティ > 安全性の低いアプリのアクセス オン


▼ sendmail 設定
# vi /etc/rc.conf 追加
# sendmail add
sendmail_enable="YES"

▼ Google SMTP 認証ファイル作成
# mkdir /etc/mail/authinfo
# vi /etc/mail/authinfo/gmail.info
全て記載
AuthInfo: "U:root" "I:YOUR GMAIL EMAIL ADDRESS" "P:YOUR PASSWORD" ・YOUR GMAIL EMAIL ADDRESS : あなたの gmail アドレス
・YOUR PASSWORD : あなたの gmail パスワード

▼ gmail のデータベースハッシュマップを作成
# makemap hash /etc/mail/authinfo/gmail.info < /etc/mail/authinfo/gmail.info
▼ sendmail 設定ファイル変更
# cp /etc/mail/freebsd.mc /etc/mail/localhost.mc
# vi /etc/mail/localhost.mc
緑文字列を追加
dnl define(`SMART_HOST', `your.isp.mail.server')

define(`SMART_HOST',`smtp.gmail.com')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
define(`confAUTH_OPTIONS', `A')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
FEATURE(`authinfo',`hash -o /etc/mail/authinfo/gmail.info.db')dnl

dnl Uncomment the first line to change the location of the default

▼ 設定の反映
# openssl dhparam -out /etc/mail/certs/dh.param 4096
# make -C /etc/mail
# /etc/rc.d/sendmail restart

▼ PHP から メール送信
# vi /usr/local/www/apache24/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

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