FreeBSD 10.1にNginx、MySQL、およびPHP(FEMP)スタックをインストールする方法
序章
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
ファイルの内容が表示されます。 次のようになります。
これは、Nginxが稼働していて、単純なHTMLページを提供できることを示しています。
次に、作成したinfo.php
ファイルを確認します。 ブラウザで、ドメイン名またはサーバーのIPアドレスにアクセスし、続いて/info.php
にアクセスします。
http://example.com/info.php
次のようなPHP情報ページが生成されます。
このページが表示されている場合は、FreeBSDサーバーでFEMPスタックが正常に構成されています。
構成をテストした後、info.php
ファイルをドキュメントルートから削除することをお勧めします。これにより、インストールに関する機密情報が提供される可能性があります。
sudo rm /usr/local/www/nginx/info.php
このファイルは後でいつでも簡単に再作成できます。
結論
これで、動的PHPコンテンツを処理し、MySQLを使用してデータを保存できるNginxを搭載した完全に機能するWebサーバーができました。 この構成は、他のさまざまな構成やWebアプリケーションのベースとして使用できます。