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とか言います。それぞれのプログラムの頭文字を並べたものです。

環境 OS Webサーバー データベース スクリプト言語
LAMP Linux Apache MySQL PHP
FEMP FreeBSD Nginx MySQL or Maria DB PHP

FEMPのWebサーバーNginxはengine X(éndʒin éks)と発音するので頭文字はEになります。

またFEMPのデータベースはMySQLから派生したMaria DBとしているものが多いようですが、MySQLでもいいみたい。

というわけでこのサイトはMySQL版FEMP環境下でWordPressを動かしています。

まずはインストール

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

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

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

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

  • Nginx 1.12
  • MySQL 5.7
  • PHP 7.1
$ sudo pkg install nginx mysql57-server php71 php71-mysqli php71-xml  php71-gd php71-curl php71-zlib php71-zip php71-hash php71-tokenizer php71-extensions

PHP関連がたくさんあります。

サービスを有効化する

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

$ 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/dbus:rcvar=dbus_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

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

mysql_enable="YES"
nginx_enable="YES"
php_fpm_enable="YES"

PHPの設定

次にPHP-FPMサービスを設定します。設定ファイルは/usr/local/etc/php-fpm.confです。(要root権限)

listen = /var/run/php-fpm.sock     ; もとは listen = 127.0.0.1:9000
 
listen.owner = www                 ; もとはコメントアウトされていたので有効化
listen.group = www                 ; もとはコメントアウトされていたので有効化
listen.mode = 0660                 ; もとはコメントアウトされていたので有効化

続いてphp.iniファイルを作成。php.ini-productionファイルをコピーしてその内容を編集します。(要root権限)

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

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

$ sudo service php-fpm start

MySQLの設定

MySQLを設定するためにMySQLサービスを起動します。

$ sudo service mysql-server start

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

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

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

$ sudo service mysql-server restart

Nginxの設定

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

$ sudo service nginx start

設定ファイル/usr/local/etc/nginx/nginx.confを編集します。(要root権限)

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;
        }
    }
 
}

設定できたらログファイルのディレクトリとログファイルを作ります。ログローテーションについては別記事にて。

$ sudo mkdir -p /var/log/nginx
$ sudo touch /var/log/nginx/access.log
$ sudo touch /var/log/nginx/error.log

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

$ sudo rm /usr/local/www/nginx
$ sudo mkdir /usr/local/www/nginx
$ sudo cp /usr/local/www/nginx-dist/index.html /usr/local/www/nginx/

さらに/usr/local/www/nginx/info.phpファイルを作成します。中身はこれだけ。

<?php phpinfo(); ?>

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

$ sudo 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を再起動します。

$ sudo service nginx restart

テスト結果の確認

すべての準備が終わったので、最後にテストをします。ブラウザでhttp://example.com(Nginxでserver_nameとして指定したアドレス)にアクセスします。

コピーしたindex.htmlファイルにアクセスできて、以下のような表示が出たらOKです。これはNginxが立ち上がっていて、単純なHTMLページが表示できている状態です。

Welcome to nginx画面

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

info.php画面

設定のテストが済んだらinfo.phpは削除しておきましょう。サーバーの設定が丸見えなので。
 
ここまで進めておくと、あとはWordPressをインストールするだけでブログを始めることができますよ!