ホーム > FreeBSD Server

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になります。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から派生したMariaDBとしているものが多いようで、このサイトもMariaDB版FEMP環境下でWordPressを動かしています。

まずはインストール

最近はVPSでもVultrみたいにOSインストールイメージを即起動できてしまうので、素のFreeBSDインストール作業は省けますね。

どうしてもカスタムカーネルにしたいとか、RELEASE版以外のバージョンを使いたいときはFreeBSDハンドブックを参考にインストールします。

FreeBSDの設定は別記事にまとめました。

FreeBSDのパッケージシステムを使って、その他関連モジュールをインストールしましょう。

  • Nginx 1.16
  • MariaDB 10.4
  • PHP 7.4
1
pkg install nginx mariadb104-server php74 php74-mysqli php74-pdo_mysql php74-xml  php74-gd php74-curl php74-zlib php74-zip php74-tokenizer php74-extensions php74-mbstring php74-bcmath php74-gmp

PHP関連がたくさんあるのはNextcloudを動かすためです。なおPHP 7.3までは別モジュールになっていたphp-hashですが、7.4でコアモジュールに取り込まれたためインストール不要になりました。

また、bcmathとgmpモジュールはNextcloud19にバージョンアップしたときに要求されたので追加しました。

サービスを有効化する

まずそれぞれのサービスのrcvar値を調べます。各サービスのスクリプトファイルは/usr/local/etc/rc.dにあります。

1
2
3
4
5
6
7
8
9
10
11
# grep -e "rcvar" /usr/local/etc/rc.d/*
/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/tcsd:rcvar=tcsd_enable
/usr/local/etc/rc.d/tpmd:rcvar="${name}_enable"

grepでそれぞれのサービスのrcvar変数名がリストアップされました。/etc/rc.confファイルを編集して常時有効化したいサービスのrcvar変数に”YES”をセットします。

なお、MariaDBではバイナリログの有効化を明示する必要があるため、最終的にrc.confに追記するのは以下のようになります。

1
2
3
4
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です。

1
2
3
4
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ファイルをコピーしてその内容を編集します。

1
cgi.fix_pathinfo=0                 ; もとはコメントアウトされていて1がセットされている

編集が終わったらサービスを開始します。

1
service php-fpm start

MySQL/MariaDBの設定

MySQL/MariaDBを設定するためにサービスを起動します。なお、FreeBSDのpkgでインストールしたMariaDBのサービス名や各種プログラム名はMySQLのものと全く同一です。

1
service mysql-server start

MySQL初回起動時に必要なディレクトリとデータベースファイルが作成されます。サービスが立ち上がるとmysql_secure_installationコマンドでインストールを進めます。

1
2
3
4
# mysql_secure_installation

Enter current password for root (enter for none):
Set root password? [Y/n]

MySQLのrootアカウントのパスワードをセットしてその他おすすめ設定をエンターキーで受け入れたら、サービスを再起動します。

1
service mysql-server restart

また、MySQLサーバーやMariaDBサーバーをバージョンアップすると、mysql_upgrademariadb-upgradeを実行するようメッセージが出ますが、もしもここでsocketが見つからないというようなエラーが出た場合は、socketの指定をしましょう。MariaDBのバージョンアップをしたらこのエラーが出るようになってしまったので、次のように対処しました。

まずはソケットの場所を確認。

1
2
$ mysql_config --socket
/tmp/mysql.sock

場所がわかったら設定ファイル/usr/local/etc/mysql/my.cnfに書き込みます。ちなみにこれはFreeBSDの場合。Linuxなどはmy.cnfの場所が違います。

1
2
3
4
5
6
7
8
9
$ 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にオプション指定でも大丈夫。

1
mysql_upgrade --skip-version-check --socket=/tmp/mysql.sock

Nginxの設定

Nginxも設定のためにサービスをスタートします。

1
service nginx start

設定ファイル/usr/local/etc/nginx/nginx.confを編集します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
user  www;                                      # もとはコメントアウトされているので、有効化してユーザー名を変更
worker_processes 2; # CPUのコア数に合わせて値を変更
error_log /var/log/nginx/error.log info; # エラーログのフルパスとログレベル(info)を指定
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
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; # httpブロック内にアクセスログのフルパスを指定
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name .junk-works.science; # 適切なドメインを指定
root /usr/local/www/junkworks; # 適切なドキュメントルートを設定
index index.php index.html index.htm;
location = /wp-login.php {
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /usr/local/www/junk/$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /usr/local/www/junk/$fastcgi_script_name;
include fastcgi_params;
}
}
}

ログローテーションについては別記事にて。なお以前のバージョンでは最初にログファイルを作成する必要がありましたが、現在ではパッケージインストールすると自動的に/var/log/nginx内にログファイルが生成されます。

ドキュメントルートの/usr/local/www/nginxは/usr/local/www/nginx-distのシンボリックリンクになっているので、リンク解除したのちにindex.htmlファイルをコピーします。

1
2
3
# 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ファイルを作成します。中身はこれだけ。

1
<?php phpinfo(); ?>

設定ファイルに間違いがないかどうかを確かめます。

1
2
3
# 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

問題がなければ設定を再読み込みします。

1
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をインストールするだけでブログを始めることができますよ!