ウェブサーバーと言えば圧倒的に Apache が主流ですが、ここ数年話題に上がり続けているのが Nginx(エンジンエックス)です。Apache と同様オープンソースで PHP 等も動き、後発ゆえの処理性能の良さが特徴です。
今回は、早速 Nginx を FreeBSD に設定していきます。他の UNIX 系の OS もインストールさえできれば、後は設定ファイルをどうするかだけですので、大差はありません。
今回のミッション
- Nginx を PHP 設定を含めてインストールする。
WordPress をテストできる環境を作ることを前提にしています。
設定環境
FreeBSD INSPIRON 12.1-RELEASE FreeBSD 12.1-RELEASE r354233 GENERIC amd6
php72-7.2.31
nginx-1.18.0_2,2
まずは Nginx をインストール
ソースからインストールするのが安心ですが、私自信が今ひとつ依存関係を把握できていないこともあり、今回は pkg からインストールします。
bash
# pkg install www/nginx
インストールそのものに問題が起きることはまれだと思いますので、特に難しいことはありません。
Nginx を起動するための設定ファイルを吟味する
FreeBSD の場合、設定ファイルは /usr/local/etc/nginx 以下にあります。Linux 系の場合はディストリビューション次第ですすが、/etc/nginx に置かれることが多いようです。
いずれにせよ、./etc/nginx 以下を整理して使いやすくします。
bash
# cd /usr/local/etc/nginx
# mkdir Servers
nginx フォルダ以下に、Servers というフォルダを作り、Servers フォルダ以下の設定ファイルを自動的に読み込むように設定を進めていきます。
Nginx の設定ファイル、nginx.conf を作成
Apache 同様、Nginx も普通に起動させてしまうと、実行しているマシンがもつ IP すべてで httpd が走ってしまいます。
今回は、Apache と共存させるために、Nginx を結びつけるインターフェイスを固定します。
また、Apache で動かしている WordPress をそのまま流用するつもりなので、新たに Nginx 用のフォルダを作らないようにします。利用するネットワークは 192.168.100.216/29 にしていて、原則このネットワークには他から入ることは困難なので、Nginx そのものはセキュリティを緩めてあります。
私的に、速攻設定したファイルが以下の通りです。
試験環境ですのでセキュリティ関係は最低限に抑えてあります。
Apache との違いで注意すべきは、行末は「;」で終わる点です。
付け忘れるとエラーになりますので注意です。速攻設定のテスト環境用のため、本格運用の際は、もう少し吟味する必要があります。
/usr/local/etc/nginx/nginx.conf をエディタで開いて設定します。
nginx.conf の全体
user www;
worker_processes 2; # CPU のコア以上を設定するのは無意味
#error_log /var/log/nginx/error.log;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx-access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
## テスト環境なので、念を押してアクセス制限
allow 192.168.100.216/29; # このネットワークのIPのみをアクセス許可
deny all; # その他は拒否
server {
listen 192.168.100.217:80; # このネットワークアドレスで接続を受ける
server_name 192.168.100.217;
#charset koi8-r;
#access_log logs/host.access.log main;
## Servers フォルダ以下の設定ファイルを読み込む
include Servers/*.conf
# php の設定
location ~ \.php$ {
root /srv/www/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
基本的に Apache で動かしていたサイト(WordPress)を流用するため、ユーザーは www(FreeBSD の場合、Linux では nobody など)権限で動かします。要はフォルダや cgi に至るまで無難に権限のあるユーザーで動かしておかないと、ディレクトリにアクセスできなくなったりします。
Nginx にドキュメントディレクトリをセットアップする
nginx.conf にはサーバー全体に共通することを記述して、バーチャルホスト等やホストの設定は、Servers ディレクトリ以下に設定ファイルを作成して、全体に反映させます。
Servers ディレクトリはデフォルトでは存在しないものなので、自分で作ります(作業は root で行っています)。
bash
# mkdir /usr/local/etc/nginx/Servers
まず、wordpress.conf (名前は何でも大丈夫)ファイルを Server/ 以下に作成します。
wordpress.conf の全体
location / {
root /srv/www/wordpress; # ドキュメントのルート
index index.php index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
アクセスログは http で設定しているので、あえて server では設定していませんが、バーチャルドメインを使う場合は、ドメインごとにログ設定をするのが普通です。ここでは、コメントアウトしています。
Server フォルダ以下に、バーチャルドメインの設定を、例えば virtual.conf といったファイル名で作成しておくと、ドメイン別の管理が行いやすくなります。
Nginx で PHP を動かすために php-fpm.conf を設定
Nginx は Apache と php の扱い方が異なるので、特に理由が無ければ php は Nginx と同じユーザー権限で動かすようにする方がトラブルが少ないです。
php は /usr/local/etc/php-fpm.conf で設定しますが、デフォルトでは、php-fpm.d フォルダ以下の設定を読み込みますので、/usr/local/etc/php-fpm.d/www.conf を直接書き換えて設定します。
php-fpm.d/www.conf の全体
[www]## 半角で記述します
user = www
group = www
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
ポイントは、user と group です。ここを Nginx と同じユーザーで起動しておくようにします。
Nginx を自動起動設定と Apache との競合確認
今回は同じマシン内で Apache を 192.168.15.18 で動かしつつ、Nginx を 192.168.100.217 で動かすという設定をしていますので、もし設定ミスなどで同一 IP とポートで競合してしまうと良くないことになります。
そのため、netstat コマンドで 80 番ポートをチェックします。
bash
# netstat -4an | grep 80
tcp4 0 0 192.168.15.18.80 192.168.15.11.35361 FIN_WAIT_2
tcp4 0 0 192.168.100.217.80 192.168.100.218.35357 FIN_WAIT_2
tcp4 0 0 192.168.100.217.80 192.168.100.218.35356 FIN_WAIT_2
tcp4 0 0 192.168.15.18.80 *.* LISTEN
tcp4 0 0 192.168.100.217.80 *.* LISTEN
(以下略)
もし、
bash # netstat -4an | grep 80 tcp4 0 *.80 *.* LISTEN (以下略)
というような行があれば、明らかに設定ミスですので要確認です。
Apache との共存させる
当然ですが、Apache と Nginx を一つのサーバーで共存させることが可能です。つまり、Apache を動かしながら、Nginx も動かすというような設定です。もちろん、同一 IP アドレスの同一ポート番号では競合して動くはずがありませんので、競合させないための具体的設定が必要になります。
Apache と比較したいので別サーバーを用意して Nginx を設定するのは、いささか骨が折れます。できればデータベースも PHP 関係もそのまま流用してテストしたいものです。
やり方は単純な方法が二つばかりあります。
- 同一 IP アドレスで起動し、それぞれの起動ポート番号を変える
- 別々の IP アドレスで起動し、必要ならポート番号を変える
同一 IP アドレスで起動する場合に限って、ポート番号は必ず変える必要があります。それ以外は好みです。
Apache と Nginx の設定ファイルを確認
Apache と Nginx を同一 IP・別ポートで共存させる場合
以下の設定は IP アドレス 192.168.15.18 で Apache と Nginx を起動させる例です。
Apache は 80 番ポート、Nginx は 8080 番で待ち受けます。具体的に数字で指定しないとトラブりますので「*」(アスタリスク)などは使わないのが無難です。
nginx.conf 抜粋
~(途中略)~
### Server 部分
listen 192.168.15.18:8080;
server_name 192.168.15.18;
(以下略)
Apache をすでに運用している場合は、/use/local/etc/apache24/httpd.conf(FreeBSD 等の場合)の設定をチェックしておきます。
httpd.conf 抜粋
Listen 192.168.15.18:80
ServerName 192.168.15.18
Apache と Nginx を別々 IP で共存させる場合(localhost 利用)
多少ネットワークができれば、こちらの方法が簡単です。ネットワークがよくわからなくても、ローカルホスト(127.0.0.1)ともう一つのネットワークインターフェイス(NIC)に割り当てた IP アドレスで分ければ誰でも試せます。NIC を複数インストールして、別々の IP を使うのが安心ですが、現在のご時世ではバーチャル IP、仮想 NIC などを利用して、物理的には必要以上に NIC を増やさないのが普通です。
以下の設定は Apache は IP アドレス 192.168.15.18、Nginx は 127.0.0.1 を起動させる例です。
Apache も Nginx も 80 番ポートで待ち受けます。
nginx.conf 抜粋
~(途中略)~
### Server 部分
listen 127.0.0.1:80;
server_name 127.0.0.1;
(以下略)
Apache をすでに運用している場合は、/use/local/etc/apache24/httpd.conf(FreeBSD 等の場合)の設定をチェックしておきます。
httpd.conf 抜粋
Listen 192.168.15.18:80
ServerName 192.168.15.18
Apache と Nginx を別々 IP で共存させる場合
NIC に複数の IP を割り当てたり、複数の NIC を利用する場合は、この方法が一番アクセスが楽になります。最近の PC にはイーサネットと Wi-Fi がインストールされているものが多いので、これを利用します。
以下の設定は Apache は IP アドレス 192.168.15.18(Wi-Fi)、Nginx は 192.168.100.217(Ethernet)を起動させる例です。Apache も Nginx も 80 番ポートで待ち受けます。
設定そのものは簡単ですが、ネットワークの設定がしっかりできていないと機能しませんので注意です。私的には、数日作業をさぼって頭がバカになった後、アクセスができなくなったことに焦り、Wi-Fi とイーサネットに物理的に別になっているにもかかわらず、ひたすらルータの設定を見直していたというポカがあります。
nginx.conf 抜粋
~(途中略)~
### Server 部分
listen 192.168.100.217:80;
server_name 192.168.100.217;
(以下略)
Apache をすでに運用している場合は、/use/local/etc/apache24/httpd.conf(FreeBSD 等の場合)の設定をチェックしておきます。
httpd.conf 抜粋
Listen 192.168.15.18:80
ServerName 192.168.15.18
どちらの方法も簡単ですが、ブラウザに URL を入れる手間を考えると、ポート番号を変える方法はタイプが増えるので、ここでは IP アドレスを別々にして起動します。
Nginx を自動起動させる
ここでは、FreeBSD を利用しているのでその流儀に従ってマシンブート時に起動するようにします。
定番通り、/etc/rc.conf に以下の変数を追記します。
/etc/rc.conf 抜粋
php_fpm_enable="YES"
nginx_enable="YES"
私的な Nginx の感想
Apache はもともとは欧州と米国の混血、Nginx はロシア産まれというのが、よく知られたトリビアです。どちらもオープンソースで使えるため、何かの時はソースに手を加えて、自分で対応できる可能性を踏まえてくれるのがありがたいところです。一般ユーザーにとっては、フリーかつオープンソースという点こそが、一番メリットが大きいのではないかと思います。
Apache は動作が重い反面、.htaccess を作成してユーザーがフォルダごとにアクセス権をつけることができたりと、柔軟に設定できます。WordPress などもその機能を存分に利用しているため、そのプラグイン次第では期待した動きができない可能性大です。一方、そのことを踏まえて安定的にサーバーを運用するには主要な選択肢になります。
私的に Apache に慣れていることもあって、Nginx が特にどうのと言うまでにはメリットを感じていません。しかし、高負荷をかけても Apache に比べてレスポンスが良いのは間違いなさそうです。安定もしていますので、今後 Apache に劇的なパフォーマンス改善がなされない場合、Nginx のレスポンスの良さが、体感でもずば抜け出すと、次第に移行を考えるかもしれません(まだ決断は全くしていません)。
Cygwin に MySQL(MariaDB) をセットアップして実行する手順です。 MySQL を Cygwin でセ ... 続きを見る Cygwin は Windows 上で Linux ディストリビューションと同様の機能が使えるようにする、オープンソース ... 続きを見る
Cygwin で MySQL を速攻セットアップする
Windows に Cygwin をセットアップする入門編