序章

Nginx、MySQL、およびPHPは、Web上で動的コンテンツを提供するための強力なソリューションとして簡単に組み合わせることができます。 これらの3つのソフトウェアは、FreeBSDマシンにインストールおよび構成して、FEMPスタックと呼ばれるものを作成できます。

このガイドでは、FreeBSD10.1サーバーにFEMPスタックをインストールする方法を示します。 より迅速に起動して実行するために、パッケージを使用してソフトウェアをインストールします。 これらのパッケージは、ほとんどのサーバーで適切に機能する適切なデフォルトを提供します。

コンポーネントをインストールします

まず、FreeBSDパッケージシステムを使用して、必要なすべてのソフトウェアをインストールします。 「install」コマンドは、使用可能なパッケージのローカルコピーを更新してから、要求したパッケージをインストールします。

sudo pkg install nginx mysql56-server php56 php56-mysql

これにより、コンテンツを提供するためのNginx Webサーバー、情報の保存に使用されるMySQLデータベースサーバー、および動的コンテンツを処理するためのPHP処理言語がダウンロードおよびインストールされます。

インストールが完了したら、デフォルトのtcshシェルを実行している場合は、必ずrehashコマンドを実行してください。 これにより、シェルはインストールした新しいアプリケーションを認識します。

rehash

終了したら、次に進んでコンポーネントの有効化と構成を開始できます。

すべてのサービスを有効にする

前のセクションでは、サーバーで実行する必要がある3つの個別のサービスをダウンロードしました。

FreeBSDがこれらを従来のサービスとして開始するためには、それらを有効にしたいことをFreeBSDに伝える必要があります。 これにより、それらを1回限りのアプリケーションではなくサービスとして処理できるようになり、起動時に自動的に起動するようにFreeBSDも構成されます。

まず、各サービスに設定する正しいrcパラメーターを知る必要があります。 /usr/local/etc/rc.dディレクトリにあるサービススクリプトは、rcvar変数を使用して各サーバーを有効にするために使用する必要があるパラメーターを定義します。 次のように入力すると、各サービスのrcvarが何に設定されているかを確認できます。

grep 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

ご覧のとおり、これにより、各サービスに設定する必要のあるパラメーターを簡単に出力できます。 スクリプト自体の名前(コロン文字までのパスの最後のコンポーネント)も、FreeBSDがサービスに使用する実際の名前を示しているので注目に値します。

これらのサービスを有効にするには、/etc/rc.confファイルをsudo権限で編集します。

sudo vi /etc/rc.conf

内部に、開始したいサービスごとに行を追加します。 各サービスで検出したrcvarパラメーターを使用し、それを「YES」に設定して、各サービスを有効にすることができます。

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

終了したら、ファイルを保存して閉じます。

PHPを構成する

次に、Webサーバーから送信されたPHPリクエストの処理を担当するPHP-FPMサービスを構成します。

まず、/usr/local/etcディレクトリに移動します。このディレクトリには、オプションのプログラムの構成ファイルが保存されています。

cd /usr/local/etc

このディレクトリには、変更したいPHP構成ファイルがいくつかあります。 PHP-FPM構成ファイル自体から始めます。 sudo権限でこれを開きます。

sudo vi php-fpm.conf

内部では、いくつかの異なるオプションを調整したいと思います。 まず、通信にネットワークポートの代わりにUnixソケットを使用するようにPHP-FPMを構成します。 これは、単一のサーバー内で通信するサービスにとってより安全です。

次のような行を見つけます。

listen = 127.0.0.1:9000

/var/runディレクトリ内のソケットを使用するようにこれを変更します。

listen = /var/run/php-fpm.sock

次に、作成されるソケットの所有者、グループ、およびアクセス許可セットを構成します。 次のようなこの構成を処理するオプションのコメントアウトされたグループがあります。

;listen.owner = www
;listen.group = www
;listen.mode = 0660

最初にコメントマーカーを削除して、これらを有効にします。

listen.owner = www
listen.group = www
listen.mode = 0660

終了したら、ファイルを保存して閉じます。

次に、PHPの一般的な動作を構成するphp.iniファイルを作成する必要があります。 PHPが読み取るphp.iniファイルにコピーすることを選択できる2つのサンプルファイルが含まれています。

php.ini-productionファイルは必要なものに近いので、それを使用します。 PHPがチェックするファイルに製品版をコピーします。

sudo cp php.ini-production php.ini

sudo権限で編集するファイルを開きます。

sudo vi php.ini

内部で、cgi.fix_pathinfoの動作を構成するセクションを見つける必要があります。 コメントアウトされ、デフォルトで「1」に設定されます。 これをコメント解除して「0」に設定する必要があります。 これにより、プロセスに渡されたファイルが見つからない場合に、PHPがパスの一部を実行しようとするのを防ぐことができます。 この動作を阻止しない場合、悪意のあるユーザーがこれを使用して任意のコードを実行する可能性があります。

cig.fix_pathinfo行のコメントを外し、「0」に設定します。

cgi.fix_pathinfo=0

終了したら、ファイルを保存して閉じます。

PHP-FPMが完全に構成されたので、次のように入力してサービスを開始できます。

sudo service php-fpm start

これで、MySQLインスタンスの構成に進むことができます。

MySQLを構成する

MySQLの構成を開始するには、MySQLサービスを開始する必要があります。

sudo service mysql-server start

このコマンドを初めて実行すると、ファイルシステムに必要なディレクトリ構造が作成され、必要なデータベースファイルがインストールされます。 次に、MySQLサーバープロセスを開始します。

サービス開始後、インストールを保護する必要があります。 これは、mysql_secure_installationと呼ばれるスクリプトを介して実行できます。 sudo権限でこれを実行して、安全でないデフォルトをロックダウンします。

sudo mysql_secure_installation
. . .

Enter current password for root (enter for none):

スクリプトは、MySQLルートアカウントの現在のパスワードを要求することから始まります。 このユーザーのパスワードはまだ設定されていないため、「ENTER」を押してこのプロンプトをバイパスできます。

Set root password? [Y/n]

次に、MySQLルートアカウントのパスワードを設定するかどうかを尋ねられます。 「ENTER」を押して、この提案を受け入れます。 管理者パスワードを選択して確認します。

次に、スクリプトは、デフォルトのMySQLインストールの安全でない状態を元に戻すのに役立つ追加の提案を続行します。 これらすべてのプロンプトで「ENTER」を押すだけで、提案されたすべてのアクションを完了できます。

MySQLサービスを再起動して、インスタンスがセキュリティの変更をすぐに実装するようにすることができます。

sudo service mysql-server restart

これで、MySQLインスタンスが希望どおりに稼働しているので、先に進むことができます。

Nginxを構成する

次のタスクは、Nginxをセットアップすることです。 開始するには、Webサーバーを起動する必要があります。

sudo service nginx start

これで、/usr/local/etcディレクトリのnginxディレクトリに移動してNginxの構成を開始できます。

cd /usr/local/etc/nginx

ここでは、sudo権限でメインのNginx構成ファイルを開く必要があります。

sudo vi nginx.conf

内部では、Nginxインスタンスが他のコンポーネントと連携できるように変更を加えることができます。

開始するには、ファイルの先頭にあるuserディレクティブのコメントを解除して変更します。 wwwユーザーとして動作するWebサーバーが必要です。これは、PHP-FPMインスタンスが探しているものだからです。

user www;

また、worker_processesをシステムに搭載されているCPUまたはコアの数に設定する必要があります。 (サーバーに搭載されているCPUの数を確認するには、コマンドラインからsysctl hw.ncpuと入力します):

worker_processes 2;

次に、error_logディレクティブを使用して、エラーの冗長性と場所を設定します。 infoログレベルで/var/log/nginx/error.logの場所にログを記録します。

error_log /var/log/nginx/error.log info;

httpブロックでは、アクセスログも設定します。 これは/var/log/nginx/access.logにあります:

access_log /var/log/nginx/access.log;

serverブロックで、サーバーのドメイン名またはIPアドレスを使用するようにserver_nameディレクティブを変更する必要があります。 メインドメインの後にホスト名を追加することで、サーバーがwwwホスト名に応答するようにすることもできます。

server {
    listen          80;
    server_name     example.com www.example.com;

    . . .

メインのserverブロックでrootおよびindexディレクティブを構成します。 ドキュメントルートは/usr/local/www/nginxになり、インデックスディレクティブはindex.htmlまたはindex.htmファイルにフォールバックする前にindex.phpファイルの提供を試みる必要があります。

これらのディレクティブはserverコンテキスト内で定義したため、location /ブロック内では必要ありません。 このブロックでは、代わりにtry_filesディレクティブを構成して、ユーザーリクエストをファイルとして処理し、次にディレクトリとして処理してから、404エラーでフォールバックします。

server {

    . . .

    root /usr/local/www/nginx;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    . . .

最後に、PHPファイルを処理するロケーションブロックを構成する必要があります。 このブロックは、.phpで終わるすべてのリクエストに一致します。 ファイル自体のみを処理し、ファイルが見つからない場合は404エラーをスローします。

以前にphp-fpm.confファイルで構成したソケットを使用します。 fastcgi_paramsファイルからパラメーターを読み込むことにより、他のFastCGIプロキシオプションも構成します。 PHPが実行するファイルを認識できるように、SCRIPT_FILENAMEパラメーターを明示的に設定する必要があります。

server {

    . . .

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }

コメントを削除すると、ファイルは次のようになります。

user  www;
worker_processes  2;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  example.com www.example.com;
        root /usr/local/www/nginx;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                include fastcgi_params;
        }
    }
}

終了したら、ファイルを保存して閉じます。

次に、ファイルで参照したログディレクトリとファイルを作成する必要があります。 まず、/var/log/nginxディレクトリを作成します。

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ディレクトリへのシンボリックリンクであり、将来的にパッケージ操作によって更新される可能性があります。

リンクを破棄して、リンクされていないディレクトリを再度作成する必要があります。

sudo rm /usr/local/www/nginx
sudo mkdir /usr/local/www/nginx

Webサーバーをテストする必要があるため、index.htmlファイルを新しいWebルートにコピーできます。

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

ここにいる間に、一時的なinfo.phpファイルも作成する必要があります。このファイルを使用して、リクエストをPHP-FPMに渡すNginxの機能をテストできます。 sudo権限でドキュメントルート内にファイルを作成します。

sudo vi /usr/local/www/nginx/info.php

ファイルに次の内容を入力します。 これにより、PHP構成に関する情報を含むHTMLページが生成されます。

<?php phpinfo(); ?>

終了したら、ファイルを保存して閉じます。

これで、新しい構成を利用するためにNginxを再起動する準備が整いました。 まず、次のように入力して、構成ファイルの構文エラーをテストします。

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構成ファイルを再度開き、問題の修正を試みてください。

構成が正しくチェックアウトされたら、Nginxを再起動できます。

sudo service nginx restart

結果のテスト

これでWebスタックが完成しました。 私たちがしなければならないのは、それをテストすることだけです。

Webブラウザーで、ベースドメイン名またはサーバーのIPアドレスに移動することから始めます。

http://example.com

コピーしたindex.htmlファイルの内容が表示されます。 次のようになります。

FreeBSD Nginx default index

これは、Nginxが稼働していて、単純なHTMLページを提供できることを示しています。

次に、作成したinfo.phpファイルを確認します。 ブラウザで、ドメイン名またはサーバーのIPアドレスにアクセスし、続いて/info.phpにアクセスします。

http://example.com/info.php

次のようなPHP情報ページが生成されます。

FreeBSD php info page

このページが表示されている場合は、FreeBSDサーバーでFEMPスタックが正常に構成されています。

構成をテストした後、info.phpファイルをドキュメントルートから削除することをお勧めします。これにより、インストールに関する機密情報が提供される可能性があります。

sudo rm /usr/local/www/nginx/info.php

このファイルは後でいつでも簡単に再作成できます。

結論

これで、動的PHPコンテンツを処理し、MySQLを使用してデータを保存できるNginxを搭載した完全に機能するWebサーバーができました。 この構成は、他のさまざまな構成やWebアプリケーションのベースとして使用できます。