序章

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

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

Note: As of July 1, 2022, DigitalOcean no longer supports the creation of new FreeBSD Droplets through the Control Panel or API. However, you can still spin up FreeBSD Droplets using a custom image. Learn how to import a custom image to DigitalOcean by following our product documentation.

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

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

sudo pkg install nginx mysql56-server php56 php56-mysql

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

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

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.ini PHPの一般的な動作を構成するファイル。 にコピーすることを選択できる2つのサンプルファイルが含まれていました php.ini PHPが読み取るファイル。

The 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

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

cd /usr/local/etc/nginx

ここでは、メインのNginx構成ファイルを次のように開く必要があります。 sudo 特権:

sudo vi nginx.conf

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

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

user www;

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

worker_processes 2;

次に、を使用してエラーの冗長性と場所を設定します error_log 指令。 次の場所にログインします /var/log/nginx/error.loginfo ログレベル:

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

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

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

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

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

    . . .

を構成します rootindex メインのディレクティブ server ブロック。 ドキュメントルートは /usr/local/www/nginx そして私たちのインデックスディレクティブは役立つことを試みる必要があります index.php フォールバックする前のファイル index.html また index.htm ファイル。

これらのディレクティブを 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プロキシオプションも設定します。一部は、からパラメータを読み込みます。 fastcgi_params ファイル。 明示的に設定する必要があります SCRIPT_FILENAME PHPが実行するファイルを認識できるようにするためのパラメータ:

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アプリケーションのベースとして使用できます。