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.24.0
- MariaDB 10.6.16
- PHP 8.3.1
# pkg install nginx mariadb106-server php83 php83-mysqli php83-curl php83-dom php83-exif php83-fileinfo php83-pecl-igbinary php83-pecl-imagick php83-intl php83-mbstring php83-xml php83-zip php83-pecl-apcu php83-pecl-memcached php83-opcache php83-pecl-redis php83-bcmath php83-filter php83-iconv php83-shmop php83-simplexml php83-sodium php83-xmlreader php83-zlib php83-pecl-ssh2 php83-ftp php83-sockets
Code language: Shell Session (shell)
PHP拡張モジュールはWordPressのハンドブックに載っているものを入れてあります。PHP8.3はベータ扱いとありますが入れてみました。
一部モジュールはコアに取り込まれていて追加インストールは不要になっています。
サービスを有効化する
まずそれぞれのサービスの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
Code language: Shell Session (shell)
/etc/rc.confファイルを編集して常時有効化したいサービスのrcvar変数に”YES”をセットします。
なお、MariaDBではバイナリログの有効化を明示する必要があるため、最終的にrc.confに追記するのは以下になります。
mysql_enable="YES"
mysql_args="--log-bin"
nginx_enable="YES"
php_fpm_enable="YES"
Code language: JavaScript (javascript)
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 ; もとはコメントアウトされていたので有効化
Code language: JavaScript (javascript)
続いて/usr/local/etc/php.iniファイルを作成。php.ini-productionファイルをコピーしてその内容を編集します。
cgi.fix_pathinfo=0 ; もとはコメントアウトされていて1がセットされている
編集が終わったらサービスを開始します。
# service php-fpm start
Performing sanity check on php-fpm configuration:
[12-Feb-2024 16:03:46] NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful
Starting php_fpm.
Code language: Shell Session (shell)
MySQL/MariaDBの設定
MySQL/MariaDBを設定するためにサービスを起動します。なお、FreeBSDのpkgでインストールしたMariaDBのサービス名や各種プログラム名はMySQLのものと同一です。
# service mysql-server start
Installing MariaDB/MySQL system tables in '/var/db/mysql' ...
OK
〜(中略)〜
Starting mysql.
Code language: Shell Session (shell)
MySQL初回起動時に必要なディレクトリやデータベースファイルが作成されます。rootユーザーがパスワードレスだったりするので、mysql_secure_installationコマンドで設定変更等おこなってゆきます。
# mysql_secure_installation
〜(中略)〜
Enter current password for root (enter for none):
OK, successfully used password, moving on...
〜(中略)〜
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!
Reloading privilege tables..
... Success!
〜(中略)〜
Remove anonymous users? [Y/n] y
... Success!
〜(中略)〜
Disallow root login remotely? [Y/n] y
... Success!
〜(中略)〜
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
〜(中略)〜
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Code language: Shell Session (shell)
MySQLのrootアカウントのパスワードをセットしてその他おすすめ設定を受け入れたら、今度は文字コードの設定。FreeBSD 14.0のMariaDB 10.6の場合、設定ファイルは/usr/local/etc/mysql/conf.dにあります。
パスワードは忘れないように/root/.my.cnfに書き留めておきましょう。
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
Stopping mysql.
Waiting for PIDS: 30942.
Starting mysql.
Code language: Shell Session (shell)
新規インストールの場合は関係ありませんが、MySQLサーバーやMariaDBサーバーのバージョンアップの際はmysql_upgradeやmariadb-upgradeでSocketが見つからないというようなエラーが出ることがあります。対処法は以下。
まずはソケットの場所を確認。
$ mysql_config --socket
/var/run/mysql/mysql.sock
Code language: Shell Session (shell)
場所がわかったら設定ファイル/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 = /var/run/mysql/mysql.sock
~後略~
Code language: PHP (php)
一時的な対処で良ければmysql_upgradeにオプション指定でも大丈夫。
# mysql_upgrade --skip-version-check --socket=/var/run/mysql/mysql.sock
Code language: Shell Session (shell)
Nginxの設定
Nginxも設定のためにサービスをスタートします。
# service nginx start
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
Starting nginx.
Code language: Shell Session (shell)
設定ファイル/usr/local/etc/nginx/nginx.confを編集します。とりあえず動かすならこんな感じ。
user www; # コメントアウトを外してユーザー名を変更
worker_processes 1;
# This default error log path is compiled-in to make sure configuration parsing
# errors are logged somewhere, especially during unattended boot when stderr
# isn't normally logged anywhere. This path will be touched on every nginx
# start regardless of error log location configured here. See
# https://trac.nginx.org/nginx/ticket/147 for more info.
#
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 0;
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;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
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/nginx/$fastcgi_script_name;
include fastcgi_params;
}
}
}
Code language: Nginx (nginx)
ログローテーションについては別記事にて。なお以前のバージョンでは最初にログファイルを作成する必要がありましたが、現在ではパッケージインストールすると自動的に/var/log/nginx内にログファイルが生成されます。
ドキュメントルートの/usr/local/www/nginxは/usr/local/www/nginx-distのシンボリックリンクになっているので、リンク解除したのちにindex.htmlファイルをコピーします。
# unlink /usr/local/www/nginx
# mkdir /usr/local/www/nginx
# cp /usr/local/www/nginx-dist/index.html /usr/local/www/nginx/
Code language: Shell Session (shell)
さらに/usr/local/www/nginx/info.phpファイルを作成します。中身はこれだけ。
<?php phpinfo(); ?>
Code language: PHP (php)
設定ファイルに間違いがないかどうかを確かめて、問題がなければ設定を再読み込みします。
# 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
Code language: Shell Session (shell)
テスト結果の確認
すべての準備が終わったので、最後にテストをします。ブラウザでhttp://example.com(Nginxでserver_nameとして指定したアドレス)にアクセスします。
コピーしたindex.htmlファイルにアクセスできて、以下のような表示が出たらOK。これはNginxが立ち上がっていて、単純なHTMLページが表示できている状態です。
次にhttp://example.com/info.phpにアクセスします。このようなPHPページが生成されていれば、FreeBSDサーバー上にFEMP環境が出来上がっています。
設定のテストが済んだらinfo.phpは削除しておきましょう。サーバーの設定が丸見えなので。これでWordPressをインストールする準備が整いました。