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.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-socketsCode 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_enableCode 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 = utf8mb4Code language: JavaScript (javascript)

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

[client-mariadb]
default-character-set = utf8mb4Code 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.sockCode 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.sockCode 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 reloadCode 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をインストールする準備が整いました。

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments