Raspberry Pi 3 Model B+ 上の NetBSD 9.2 環境に Apache/PHP/MySQL をインストールする手順です。
Apache/PHP/MySQL の基本的な設定変更までを行います。
パッケージをインストールします。
本稿では MySQL のバージョンは 5.7 を選択することとします。
raspberrypi# pkgin install mysql-server-5.7.34nb1
calculating dependencies...done.
9 packages to install:
mysql-server-5.7.34nb1 perl-5.34.0nb2 mysql-client-5.7.34nb1 lz4-1.9.3 libevent-2.1.12 editline-3.1.20210419nb1
boost-libs-1.76.0 zstd-1.5.0 icu-69.1
0 to refresh, 0 to upgrade, 9 to install
166M to download, 693M to install
proceed ? [Y/n]
/etc/my.cnf を新規作成します。
本稿では以下の方針例の通り各設定値の変更を行うこととします。
バッファプールのサイズ | 64M に変更 |
---|---|
同時接続数 | 15 に変更 |
使用可能なファイルディスクリプタ数 | 2073 に変更 |
オープン可能なテーブル数 | 1024 に変更 |
接続可能な IP アドレス | 127.0.0.1 のみに変更 |
文字コードの設定 | UTF8 に変更 |
SSL 接続 | 無効化 |
TIMESTAMP データ型の非標準的な動作 | 無効化 |
以下は /etc/my.cnf の内容例となります。
[mysql]
default-character-set = utf8
[mysqld]
bind-address = 127.0.0.1
character-set-server = utf8
explicit_defaults_for_timestamp = 1
innodb_buffer_pool_size = 64M
max_connections = 15
open_files_limit = 2073
ssl = 0
table_open_cache = 1024
起動スクリプトの雛型をコピーして /etc/rc.d/mysqld を新規作成します。
raspberrypi# cp -p /usr/pkg/share/examples/rc.d/mysqld /etc/rc.d/mysqld
MySQL を起動します。
初期パスワードの内容がメッセージの最後に表示されます。
raspberrypi# service mysqld onestart
Initializing MySQL database system tables.
2021-10-13T08:26:21.443340Z 0 [ERROR] Failed to create event (errno= 2).
2021-10-13T08:26:21.448248Z 0 [ERROR] Failed to start timer notify thread.
2021-10-13T08:26:21.448305Z 0 [ERROR] Failed to initialize timer component (errno 2).
2021-10-13T08:26:29.236915Z 0 [Warning] InnoDB: New log files created, LSN=45790
2021-10-13T08:26:30.717239Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2021-10-13T08:26:30.989957Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 44a40a89-2bff-11ec-865a-a9e683e0d68f.
2021-10-13T08:26:31.010269Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2021-10-13T08:26:31.973347Z 1 [Note] A temporary password is generated for root@localhost: W2Kljrd/:t)l
Starting mysqld.
MySQL に root ユーザで接続します。
raspberrypi# /usr/pkg/bin/mysql -u root -p'W2Kljrd/:t)l'
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.34
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.
mysql>
root ユーザのパスワードを変更します。
以下はパスワードを『Password1234』の文字列に変更する場合の例となります。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password1234';
Query OK, 0 rows affected (0.00 sec)
MySQL との接続を切断します。
mysql> quit
Bye
MySQL の自動起動が行われるようにする場合は、/etc/rc.conf に『mysqld=YES』の設定を追加します。
mysqld=YES
なお自動起動の設定後は、service コマンドでの起動は onestart ではなく start を指定 (『service mysqld start』を実行) となります。
MySQL のログファイルは切り替え後にフラッシュ操作が必要となるため、本稿では手動でログローテーションを行うこととします。
※newsyslog の設定だけではログローテーションは完結しない形となります。
ログファイルの切り替えを行います。
本稿では日付 (_YYYYMMDD) のサフィックスを付与することとします。
raspberrypi# mv /var/mysql/raspberrypi.err /var/mysql/raspberrypi.err_`/bin/date '+%Y%m%d'`
フラッシュ操作を行います。
mysqladmin flush-logs コマンド実行後、パスワード入力のプロンプトが表示されます。
パスワードを入力します。
raspberrypi# /usr/pkg/bin/mysqladmin -u root -p flush-logs
Enter password:
新規ログファイルの作成とオープンが行われます。
raspberrypi# ls -l /var/mysql/raspberrypi.err*
-rw-r----- 1 mysql mysql 0 Oct 13 17:37 /var/mysql/raspberrypi.err
-rw-r----- 1 mysql mysql 2787 Oct 13 17:27 /var/mysql/raspberrypi.err_20211013
パッケージをインストールします。
raspberrypi# pkgin install apache
calculating dependencies...done.
12 packages to install:
apache-2.4.48 readline-8.1 pcre-8.44 nghttp2-1.43.0nb2 libxml2-2.9.12 brotli-1.0.9 apr-util-1.6.1nb10 apr-1.7.0nb1
xmlcatmgr-2.2nb1 python38-3.8.10nb1 libuuid-2.32.1 libffi-3.3nb5
0 to refresh, 0 to upgrade, 12 to install
40M to download, 144M to install
proceed ? [Y/n]
MPM のデフォルトは event となります。
raspberrypi# /usr/pkg/sbin/httpd -V
Server version: Apache/2.4.48 (Unix)
Server built: Jun 24 2021 09:53:21
Server's Module Magic Number: 20120211:105
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: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses disabled)
-D APR_USE_SYSVSEM_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/pkg"
-D SUEXEC_BIN="/usr/pkg/bin/suexec"
-D DEFAULT_PIDLOG="/var/run/httpd.pid"
-D DEFAULT_SCOREBOARD="/var/run/logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="/var/log/httpd/error.log"
-D AP_TYPES_CONFIG_FILE="etc/httpd/mime.types"
-D SERVER_CONFIG_FILE="etc/httpd/httpd.conf"
設定ファイルは /usr/pkg/etc/httpd ディレクトリ以下に配置されます。
raspberrypi# ls -l /usr/pkg/etc/httpd/httpd.conf
-rw-r--r-- 1 root wheel 19738 Oct 13 17:41 /usr/pkg/etc/httpd/httpd.conf
/usr/pkg/etc/httpd/httpd.conf の『ServerName』の設定を変更します。
以下は ServerNameを『raspberrypi』とする場合の例となります。
#ServerName www.example.com:80
ServerName raspberrypi
MPM を event から prefork に変更します。
/usr/pkg/etc/httpd/httpd.conf の mpm_event_module をロードする設定をコメントアウト (または削除) して、mpm_prefork_module モジュールをロードする設定を追加 (コメントアウトを解除) します。
#LoadModule mpm_event_module lib/httpd/mod_mpm_event.so
LoadModule mpm_prefork_module lib/httpd/mod_mpm_prefork.so
/usr/pkg/etc/httpd/httpd.conf に『AcceptFilter http none』の設定を追加します。
AcceptFilter http none
起動スクリプトの雛型をコピーして /etc/rc.d/apache を新規作成します。
raspberrypi# cp -p /usr/pkg/share/examples/rc.d/apache /etc/rc.d/apache
Apache を起動します。
raspberrypi# service apache onestart
Starting apache.
DocumentRoot (/usr/pkg/share/httpd/htdocs ディレクトリ) に配置された index.html にアクセスします。
以下例の通り HTML ソースが表示されることを確認します。
raspberrypi# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /index.html HTTP/1.0
HTTP/1.1 200 OK
Date: Wed, 13 Oct 2021 08:55:37 GMT
Server: Apache/2.4.48 (Unix)
Last-Modified: Thu, 24 Jun 2021 09:56:16 GMT
ETag: "2d-5c58008b33000"
Accept-Ranges: bytes
Content-Length: 45
Connection: close
Content-Type: text/html
<html><body><h1>It works!</h1></body></html>
Connection closed by foreign host.
Apache の自動起動が行われるようにする場合は、/etc/rc.conf に『apache=YES』の設定を追加します。
apache=YES
なお自動起動の設定後は、service コマンドでの起動は onestart ではなく start を指定 (『service apache start』を実行) となります。
/etc/newsyslog.conf にログローテーションの設定を追加します。
以下は /var/log/httpd/access_log と /var/log/httpd/error_log に対して、毎日 00:00 に gzip 圧縮を行い 7 世代保存を行う場合の例となります。
/var/log/httpd/access_log 644 7 * @T00 Z /var/run/httpd.pid 30
/var/log/httpd/error_log 644 7 * @T00 Z /var/run/httpd.pid 30
パッケージをインストールします。
本稿では PHP のバージョンは 7.4 を選択することとします。
また mbstring と mysqli の拡張モジュールも併せてインストールすることとします。
raspberrypi# pkgin install ap24-php74 php74-mbstring php74-mysqli
calculating dependencies...done.
6 packages to install:
ap24-php74-7.4.21nb6 php74-mbstring-7.4.21 php74-mysqli-7.4.21 php-7.4.21 pcre2-10.37 oniguruma-6.9.7.1
0 to refresh, 0 to upgrade, 6 to install
14M to download, 59M to install
proceed ? [Y/n]
設定ファイルは /usr/pkg/etc ディレクトリ以下に配置されます。
raspberrypi# ls -l /usr/pkg/etc/php.ini
-rw-r--r-- 1 root wheel 72669 Oct 13 22:04 /usr/pkg/etc/php.ini
/usr/pkg/etc/php.ini に『date.timezone = Asia/Tokyo』の設定を追加します。
;date.timezone =
date.timezone = Asia/Tokyo
/usr/pkg/etc/php.ini に『mbstring.language = Japanese』の設定を追加 (コメントアウトを解除) します。
;mbstring.language = Japanese
mbstring.language = Japanese
/usr/pkg/etc/httpd/httpd.conf に PHP モジュールをロードする設定と PHP ファイルに関するハンドラの設定を追加します。
LoadModule php7_module lib/httpd/mod_php7.so
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
設定の反映 (Apache の再起動) を行います。
※自動起動の設定後は、service コマンドでの再起動は onerestart ではなく restart を指定 (『service apache restart』を実行) となります。
raspberrypi# service apache onerestart
Stopping apache.
Starting apache.
/usr/pkg/share/httpd/htdocs/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 のバージョンが表示されることを確認します。
raspberrypi# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test.php HTTP/1.0
HTTP/1.1 200 OK
Date: Wed, 13 Oct 2021 13:09:15 GMT
Server: Apache/2.4.48 (Unix) PHP/7.4.21
X-Powered-By: PHP/7.4.21
Content-Length: 23
Connection: close
Content-Type: text/html; charset=UTF-8
Server version: 5.7.34
Connection closed by foreign host.