kraftsrv.net

Raspberry Pi 上の FreeBSD 環境に Apache/PHP/MySQL のインストール

Raspberry Pi 3 Model B+ 上の FreeBSD 13.0-RELEASE 環境に Apache/PHP/MySQL をインストールする手順です。
Apache/PHP/MySQL の基本的な設定変更までを行います。

MySQL のインストール

バイナリパッケージのインストール

パッケージをインストールします。
本稿では MySQL のバージョンは 5.7 を選択することとします。

root@raspberrypi:~ # pkg install mysql57-server
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Updating database digests format: 100%
The following 17 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        ca_root_nss: 3.63
        curl: 7.78.0
        cyrus-sasl: 2.1.27_1
        groff: 1.22.4_3
        indexinfo: 0.3.1
        libedit: 3.1.20210216,1
        libevent: 2.1.12
        libiconv: 1.16
        liblz4: 1.9.3,1
        libnghttp2: 1.43.0
        libpaper: 1.1.24.4
        mysql57-client: 5.7.35
        mysql57-server: 5.7.35
        perl5: 5.32.1_1
        protobuf: 3.14.0,1
        psutils: 1.17_5
        uchardet: 0.0.7

Number of packages to be installed: 17

The process will require 321 MiB more space.
38 MiB to be downloaded.

Proceed with this action? [y/N]: y

起動スクリプトは /usr/local/etc/rc.d ディレクトリ以下に配置されます。

root@raspberrypi:~ # ls -l /usr/local/etc/rc.d/mysql-server
-rwxr-xr-x  1 root  wheel  2187 Aug 30 08:44 /usr/local/etc/rc.d/mysql-server

設定ファイルは /usr/local/etc/mysql ディレクトリ以下に配置されます。

root@raspberrypi:~ # ls -l /usr/local/etc/mysql/my.cnf
-rw-r--r--  1 root  wheel  2206 Aug 30 08:44 /usr/local/etc/mysql/my.cnf

設定ファイルの編集

本稿では以下の方針例の通り設定ファイルの編集 (各設定値の変更) を行うこととします。

バッファプールのサイズ 1G から 64M に変更
同時接続数 15 に変更
文字コードの設定 UTF8 に変更
その他リソース関連設定 原則としてデフォルト値に変更
バイナリログ出力 無効化
スロークエリログ出力 無効化
レプリケーション関連設定 無効化
SSL 接続 無効化

以下は編集後の /usr/local/etc/mysql/my.cnf の内容例となります。

[client]
port                            = 3306
socket                          = /tmp/mysql.sock

[mysql]
prompt                          = \u@\h [\d]>\_
no_auto_rehash
default-character-set           = utf8

[mysqld]
user                            = mysql
port                            = 3306
socket                          = /tmp/mysql.sock
bind-address                    = 127.0.0.1
basedir                         = /usr/local
datadir                         = /var/db/mysql
tmpdir                          = /var/db/mysql_tmpdir
#slave-load-tmpdir              = /var/db/mysql_tmpdir
secure-file-priv                = /var/db/mysql_secure
#log-bin                        = mysql-bin
#log-output                     = TABLE
#master-info-repository         = TABLE
#relay-log-info-repository      = TABLE
#relay-log-recovery             = 1
#slow-query-log                 = 1
#server-id                      = 1
#sync_binlog                    = 1
#sync_relay_log                 = 1
#binlog_cache_size              = 16M
#expire_logs_days               = 30
default_password_lifetime       = 0
#enforce-gtid-consistency       = 1
#gtid-mode                      = ON
safe-user-create                = 1
lower_case_table_names          = 1
explicit-defaults-for-timestamp = 1
myisam-recover-options          = BACKUP,FORCE
open_files_limit                = 5000
table_open_cache                = 2000
table_definition_cache          = 1400
net_retry_count                 = 16384
key_buffer_size                 = 8M
max_allowed_packet              = 4M
query_cache_type                = 0
query_cache_size                = 0
#long_query_time                = 0.5
innodb_buffer_pool_size         = 64M
innodb_data_home_dir            = /var/db/mysql
innodb_log_group_home_dir       = /var/db/mysql
innodb_data_file_path           = ibdata1:12M:autoextend
innodb_temp_data_file_path      = ibtmp1:12M:autoextend
innodb_flush_method             = O_DIRECT
innodb_log_file_size            = 16M
innodb_log_buffer_size          = 8M
innodb_write_io_threads         = 4
innodb_read_io_threads          = 4
innodb_autoinc_lock_mode        = 2
skip-symbolic-links
max_connections                 = 15
ssl                             = 0
character-set-server            = utf8

[mysqldump]
max_allowed_packet              = 4M
quote_names
quick

起動

MySQL を起動します。

root@raspberrypi:~ # service mysql-server onestart
Starting mysql.

初期パスワードファイルが /root/.mysql_secret として作成されます。
以下は初期パスワードファイルの内容例となります。

# Password set for user 'root@localhost' at 2021-10-07 13:42:53
?j0wo2oFhLWl

MySQL に root ユーザで接続します。

root@raspberrypi:~ # /usr/local/bin/mysql -u root -p`grep -v "^#" /root/.mysql_secret`
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@localhost [(none)]>

root ユーザのパスワードを変更します。
以下はパスワードを『Password1234』の文字列に変更する場合の例となります。

root@localhost [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password1234';
Query OK, 0 rows affected (0.01 sec)

MySQL との接続を切断します。

root@localhost [(none)]> quit
Bye

自動起動設定

MySQL の自動起動が行われるようにする場合は、/etc/rc.conf に『mysql_enable="YES"』の設定を追加します。

mysql_enable="YES"

なお自動起動の設定後は、service コマンドでの起動は onestart ではなく start を指定 (『service mysql-server start』を実行) となります。

ログローテーション

MySQL のログファイルは切り替え後にフラッシュ操作が必要となるため、本稿では手動でログローテーションを行うこととします。
※newsyslog の設定だけではログローテーションは完結しない形となります。

ログファイルの切り替えを行います。
本稿では日付 (_YYYYMMDD) のサフィックスを付与することとします。

root@raspberrypi:~ # mv /var/db/mysql/raspberrypi.err /var/db/mysql/raspberrypi.err_`/bin/date '+%Y%m%d'`

フラッシュ操作を行います。
mysqladmin flush-logs コマンド実行後、パスワード入力のプロンプトが表示されます。
パスワードを入力します。

root@raspberrypi:~ # /usr/local/bin/mysqladmin -u root -p flush-logs
Enter password:

新規ログファイルの作成とオープンが行われます。

root@raspberrypi:~ # ls -l /var/db/mysql/raspberrypi.err*
-rw-r-----  1 mysql  mysql     0 Oct  7 14:40 /var/db/mysql/raspberrypi.err
-rw-r-----  1 mysql  mysql  2974 Oct  7 14:05 /var/db/mysql/raspberrypi.err_20211007

Apache のインストール

バイナリパッケージのインストール

パッケージをインストールします。

root@raspberrypi:~ # pkg install apache24
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 10 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        apache24: 2.4.49
        apr: 1.7.0.1.6.1_1
        db5: 5.3.28_7
        expat: 2.4.1
        gdbm: 1.20
        gettext-runtime: 0.21
        jansson: 2.13.1
        libxml2: 2.9.12
        pcre: 8.45
        readline: 8.1.1

Number of packages to be installed: 10

The process will require 92 MiB more space.
20 MiB to be downloaded.

Proceed with this action? [y/N]: y

MPM のデフォルトは prefork となります。

root@raspberrypi:~ # /usr/local/sbin/httpd -V
Server version: Apache/2.4.49 (FreeBSD)
Server built:   unknown
Server's Module Magic Number: 20120211:116
Server loaded:  APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses disabled)
 -D APR_USE_FLOCK_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr/local"
 -D SUEXEC_BIN="/usr/local/bin/suexec"
 -D DEFAULT_PIDLOG="/var/run/httpd.pid"
 -D DEFAULT_SCOREBOARD="/var/run/apache_runtime_status"
 -D DEFAULT_ERRORLOG="/var/log/httpd-error.log"
 -D AP_TYPES_CONFIG_FILE="etc/apache24/mime.types"
 -D SERVER_CONFIG_FILE="etc/apache24/httpd.conf"

起動スクリプトは /usr/local/etc/rc.d ディレクトリ以下に配置されます。

root@raspberrypi:~ # ls -l /usr/local/etc/rc.d/apache24
-rwxr-xr-x  1 root  wheel  6132 Sep 23 04:19 /usr/local/etc/rc.d/apache24

設定ファイルは /usr/local/etc/apache24 ディレクトリ以下に配置されます。

root@raspberrypi:~ # ls -l /usr/local/etc/apache24/httpd.conf
-rw-r--r--  1 root  wheel  21089 Sep 23 04:19 /usr/local/etc/apache24/httpd.conf

設定ファイルの編集

/usr/local/etc/apache24/httpd.conf の『ServerName』の設定を変更します。
以下は ServerNameを『raspberrypi』とする場合の例となります。

#ServerName www.example.com:80
ServerName raspberrypi

起動

Apache を起動します。

root@raspberrypi:~ # service apache24 onestart
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.

DocumentRoot (/usr/local/www/apache24/data ディレクトリ) に配置された index.html にアクセスします。
以下例の通り HTML ソースが表示されることを確認します。

root@raspberrypi:~ # /usr/local/bin/curl http://localhost/index.html
<html><body><h1>It works!</h1></body></html>

自動起動設定

Apache の自動起動が行われるようにする場合は、/etc/rc.conf に『apache24_enable="YES"』の設定を追加します。

apache24_enable="YES"

なお自動起動の設定後は、service コマンドでの起動は onestart ではなく start を指定 (『service apache24 start』を実行) となります。

ログローテーション

/etc/newsyslog.conf.d/apache24.conf を新規作成してログローテーションの設定を行います。
以下は /var/log/httpd-access.log と /var/log/httpd-error.log に対して、毎日 00:00 に bzip2 圧縮を行い 7 世代保存を行う場合の例となります。

/var/log/httpd-access.log               644  7  *  @T00  J  /var/run/httpd.pid 30
/var/log/httpd-error.log                644  7  *  @T00  J  /var/run/httpd.pid 30

PHP

バイナリパッケージのインストール

パッケージをインストールします。
本稿では PHP のバージョンは 7.4 を選択することとします。
また mbstring と mysqli の拡張モジュールも併せてインストールすることとします。

root@raspberrypi:~ # pkg install mod_php74 php74-mbstring php74-mysqli
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 7 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        libargon2: 20190702
        mod_php74: 7.4.24
        oniguruma: 6.9.7.1
        pcre2: 10.37
        php74: 7.4.24
        php74-mbstring: 7.4.24
        php74-mysqli: 7.4.24

Number of packages to be installed: 7

The process will require 43 MiB more space.
7 MiB to be downloaded.

Proceed with this action? [y/N]: y

httpd.conf への PHP モジュールのロードに関する設定が自動的に追加されます。

LoadModule php7_module        libexec/apache24/libphp7.so

設定ファイルの作成

設定ファイルの雛型をコピーして /usr/local/etc/php.ini を新規作成します。
本稿では php.ini-production を使用することとします。

root@raspberrypi:~ # cp -p /usr/local/etc/php.ini-production /usr/local/etc/php.ini

/usr/local/etc/php.ini に『date.timezone = Asia/Tokyo』の設定を追加します。

;date.timezone =
date.timezone = Asia/Tokyo

/usr/local/etc/php.ini に『mbstring.language = Japanese』の設定を追加 (コメントアウトを解除) します。

;mbstring.language = Japanese
mbstring.language = Japanese

Apache の設定追加

/usr/local/etc/apache24/Includes/php74.conf を新規作成して PHP ファイルに関するハンドラの設定を行います。
以下は内容例となります。

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

設定の反映 (Apache の再起動) を行います。
※自動起動の設定後は、service コマンドでの再起動は onerestart ではなく restart を指定 (『service apache24 restart』を実行) となります。

root@raspberrypi:~ # service apache24 onerestart
Performing sanity check on apache24 configuration:
Syntax OK
Stopping apache24.
Waiting for PIDS: 2722.
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.

MySQL との連携確認

/usr/local/www/apache24/data/test.php を新規作成します。
以下は内容例となります。

<?php
$link = mysqli_connect( "localhost", "root", "Password1234" );

if( mysqli_connect_errno() ){
    printf( "Connect failed: %s\n", mysqli_connect_error() );
    exit();
}

printf( "Server version: %s\n", mysqli_get_server_info($link) );

mysqli_close( $link );
?>

test.php にアクセスします。
以下例の通り MySQL のバージョンが表示されることを確認します。

root@raspberrypi:~ # curl http://localhost/test.php
Server version: 5.7.35