FEMPでWebサーバーを立てる

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

client.cnfは[client-mariadb]セクションに。

[client-mariadb]
default-character-set = utf8mb4

設定が終わったらサービスを再起動します。

# 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をインストールする準備が整いました。