FreeBSDでWebサーバーを立ち上げるため、Digital OceanのHow To Install an Nginx, MySQL, and PHP (FEMP) Stack on FreeBSD 10.1を見ながらFEMP環境を整えてみました。オリジナル記事にある細かい解説は端折っているので、気になる人は原典をあたってね。
この記事でFEMPという言葉を知りました。日本語の記事では見かけない表現ですけれど。
LAMPとFEMP
一般的なWebサービス構築環境LAMPのLはLinuxのL。これに対してFEMPのFはFreeBSDのFです。
Webサービスを動かすには最低限サーバーOSとWebサーバープログラムが必要ですが、これにデータベースとスクリプト言語をセットにしてLAMPとかFEMPとか言います。それぞれのプログラムの頭文字を並べたものです。
- LAMP = Linux + Apache + MySQL or MariaDB + PHP
- FEMP = FreeBSD + Nginx + MySQL or MariaDB + PHP
FEMPのWebサーバーNginxはengine X(éndʒin éks)と発音するので頭文字はEになります。
なおデータベースはMySQLから派生したMaria DBとしているものもあり、このサイトもMariaDB版FEMP環境下でWordPressを動かしています。
まずはインストール
最近はVPSでもVultrみたいにOSインストールイメージを即起動できてしまうので、素のFreeBSDインストール作業は端折れますね。
どうしてもカスタムカーネルにしたいとか、RELEASE版以外のバージョンを使いたいときはFreeBSDハンドブックを参考にインストールします。
FreeBSDの設定は別記事にまとめてあります。
FreeBSDのパッケージシステムを使って、その他関連モジュールをインストールしましょう。
- Nginx 1.22
- MariaDB 10.6
- PHP 8.1
# pkg install nginx mariadb106-server php81 php81-mysqli php81-curl php81-dom php81-exif php81-fileinfo php81-pecl-imagick php81-mbstring php81-xml php81-zip php81-bcmath php81-filter php81-iconv php81-intl php81-simplexml php81-sodium php81-xmlreader php81-zlib php81-pecl-ssh2 php81-ftp php81-sockets
PHP拡張モジュールはWordPressのハンドブックに載っているものを入れてあります。PHP8系はベータ扱いとありますが、7.4はもうすぐサポートが切れるので最新の8.1にしました。
なのでjson, hash, opensslはコアに取り込まれていて追加インストールは不要になっています。またmysqlndやpcreは勝手に入ってきます。
サービスを有効化する
まずそれぞれのサービスのrcvar値を調べます。各サービスのスクリプトファイルは/usr/local/etc/rc.dにあります。
# grep /usr/local/etc/rc.d/* -e rcvar
/usr/local/etc/rc.d/avahi-daemon:rcvar=avahi_daemon_enable
/usr/local/etc/rc.d/avahi-dnsconfd:rcvar=avahi_dnsconfd_enable
/usr/local/etc/rc.d/cupsd:rcvar="cupsd_enable"
/usr/local/etc/rc.d/dbus:rcvar=dbus_enable
/usr/local/etc/rc.d/garb:rcvar=garb_enable
/usr/local/etc/rc.d/mysql-server:rcvar=mysql_enable
/usr/local/etc/rc.d/nginx:rcvar=nginx_enable
/usr/local/etc/rc.d/php-fpm:rcvar=php_fpm_enable
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable
/etc/rc.confファイルを編集して常時有効化したいサービスのrcvar変数に”YES”をセットします。
なお、MariaDBではバイナリログの有効化を明示する必要があるため、最終的にrc.confに追記するのは以下になります。
mysql_enable="YES"
mysql_args="--log-bin"
nginx_enable="YES"
php_fpm_enable="YES"
mysql_argsの設定を忘れると、mysqldumpでバックアップする際に”You are not using binary logging.”というエラーが出てしまいます。
PHPの設定
次にPHP-FPMサービスを設定します。設定ファイルは/usr/local/etc/php-fpm.d/www.confです。
listen = /var/run/php-fpm.sock ; もとは listen = 127.0.0.1:9000
listen.owner = www ; もとはコメントアウトされていたので有効化
listen.group = www ; もとはコメントアウトされていたので有効化
listen.mode = 0660 ; もとはコメントアウトされていたので有効化
続いて/usr/local/etc/php.iniファイルを作成。php.ini-productionファイルをコピーしてその内容を編集します。
cgi.fix_pathinfo=0 ; もとはコメントアウトされていて1がセットされている
編集が終わったらサービスを開始します。
# service php-fpm start
MySQL/MariaDBの設定
MySQL/MariaDBを設定するためにサービスを起動します。なお、FreeBSDのpkgでインストールしたMariaDBのサービス名や各種プログラム名はMySQLのものと同一です。
# service mysql-server start
MySQL初回起動時に必要なディレクトリやデータベースファイルが作成されます。rootユーザーがパスワードレスだったりするので、mysql_secure_installationコマンドで設定変更等おこなってゆきます。
# mysql_secure_installation
…
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
…
MySQLのrootアカウントのパスワードをセットしてその他おすすめ設定をエンターキーで受け入れたら、今度は文字コードの設定。FreeBSD 13.1のMariaDB 10.6の場合、設定ファイルは/usr/local/etc/mysql/conf.dにあります。
server.cnfは[mysqld]セクションに以下のとおり追記。
[mysqld]
character-set-server = utf8mb4
Code language: JavaScript (javascript)
client.cnfは[client-mariadb]セクションに。
[client-mariadb]
default-character-set = utf8mb4
Code language: JavaScript (javascript)
設定が終わったらサービスを再起動します。
# service mysql-server restart
新規インストールの場合は関係ありませんが、MySQLサーバーやMariaDBサーバーのバージョンアップの際はmysql_upgradeやmariadb-upgradeでSocketが見つからないというようなエラーが出ることがあります。対処法は以下。
まずはソケットの場所を確認。
$ mysql_config --socket
/tmp/mysql.sock
場所がわかったら設定ファイル/usr/local/etc/mysql/my.cnfに書き込みます。ちなみにこれはFreeBSDの場合。Linuxなどはmy.cnfの場所が違います。
$ cat /usr/local/etc/mysql/my.cnf
#
# This group is read both by the client and the server
# use it for options that affect everything, see
# https://mariadb.com/kb/en/configuring-mariadb-with-option-files/#option-groups
#
[client-server]
socket = /tmp/mysql.sock
~後略~
一時的な対処で良ければmysql_upgradeにオプション指定でも大丈夫。
# mysql_upgrade --skip-version-check --socket=/tmp/mysql.sock
Nginxの設定
Nginxも設定のためにサービスをスタートします。
# service nginx start
設定ファイル/usr/local/etc/nginx/nginx.confを編集します。とりあえず動かすならこんな感じ。
user www; # コメントアウトを外してユーザー名を変更
worker_processes 1;
error_log /var/log/nginx/error.log info; # コメントアウトを外してログレベル(info)を追記
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
# log_formatのコメントアウトを外して$server_nameと$request_bodyを追加
log_format main '$server_name $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
access_log /var/log/nginx/access.log main; # コメントアウトを外してログのパスを修正
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on; # コメントアウトを外してgzip_typesを追記
gzip_types text/plain application/xml;
server {
listen 80;
server_name example.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/local/www/nginx;
index index.html index.htm;
}
location ~ \.php$ { # コメントアウトを外してfastcgi_passとfastcgi_paramのパスを修正
# root html;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/$fastcgi_script_name;
include fastcgi_params;
}
}
}
ログローテーションについては別記事にて。なお以前のバージョンでは最初にログファイルを作成する必要がありましたが、現在ではパッケージインストールすると自動的に/var/log/nginx内にログファイルが生成されます。
ドキュメントルートの/usr/local/www/nginxは/usr/local/www/nginx-distのシンボリックリンクになっているので、リンク解除したのちにindex.htmlファイルをコピーします。
# rm /usr/local/www/nginx
# mkdir /usr/local/www/nginx
# cp /usr/local/www/nginx-dist/index.html /usr/local/www/nginx/
さらに/usr/local/www/nginx/info.phpファイルを作成します。中身はこれだけ。
<?php phpinfo(); ?>
設定ファイルに間違いがないかどうかを確かめます。
# nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
問題がなければ設定を再読み込みします。
# nginx -s reload
テスト結果の確認
すべての準備が終わったので、最後にテストをします。ブラウザでhttp://example.com(Nginxでserver_nameとして指定したアドレス)にアクセスします。
コピーしたindex.htmlファイルにアクセスできて、以下のような表示が出たらOK。これはNginxが立ち上がっていて、単純なHTMLページが表示できている状態です。

次にhttp://example.com/info.phpにアクセスします。このようなPHPページが生成されていれば、FreeBSDサーバー上にFEMP環境が出来上がっています。

設定のテストが済んだらinfo.phpは削除しておきましょう。サーバーの設定が丸見えなので。これでWordPressをインストールする準備が整いました。