このサイトはapacheではなくnginxで稼働しています。といっても、主には勉強のためです。本記事は、私のように最近nginxを触り始めた人に向けて、「最初の状態のnginx.confにある各項目の意味がなんとなくわかるようになること」を目的とした記事です。何はともあれ、まずはここからだと思うのです。
設定ファイルの最初の状態
nginxの設定ファイルは、/etc/nginx/nginx.confです。Version 1.6.3においては、最初は以下の状態になっています。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
基礎知識:ディレクティブ、コンテキスト
早速見ていきます…といきたいところですが、まず基礎知識を確認します。
まずざっと見渡してみると、http{ }とかserver{ }、location / {}などが目につきます。これらはディレクティブと呼ばれる、基本的な構成要素です。ブロック{ }だけではなく、includeなどもディレクティブです。つまり、ブロック{ }で囲む構文と、include hoge;のように、セミコロンを使った構文があり、ディレクティブによって構文が決まっています。
ブロック{ }内の記述は、そのブロック内でのみ有効です。その範囲をコンテキストといいます。たとえば、httpディレクティブのブロック内は、httpコンテキストと定義されます。ディレクティブによって、どのコンテキストで使えるかが決まっているので、非常に重要なポイントです。たとえば、serverディレクティブはhttpコンテキスト内でしか使えません。また、明示されていませんが、どのブロックにも囲まれていないところはmainコンテキストとして扱われます。
以上を基礎知識として、一つ一つ見ていきます。
解説
では、見ていきましょう。
mainコンテキスト内
まずはmainコンテキスト内の記述から。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
まず、user ninx;は、nginxの実行ユーザーをnginxとする、という意味です。通常このままで良いと思いますが、Debian系列においてはwww-dataにするのが慣習だそうで、実際WikiのソフトウェアDokuWikiのサポートページでは、Ubuntu + nginxでのインストール案内でユーザー名をwww-dataとしています(参考:「ja:install:nginx [DokuWiki]」)。
worker_processesディレクティブは、その名の通りワーカーのプロセス数です。nginxは、複数のワーカープロセスを、一つのマスタープロセスで制御する仕組みで、ワーカープロセスは基本的にCPUのコア数と同じにしておけばよいのですが、autoとすることで、自動的にCPUのコア数分割り当ててくれます。
error_logディレクティブは、errorファイルの場所です。syslogと同様のパラメータによるエラーレベルも指定できて、指定しない場合はerror以上のエラーが吐き出されます。
pidディレクティブは、先述のマスタープロセスのPIDを出力する、PIDファイルのパスを指定します。
eventsコンテキスト内
nginxの特徴にイベント駆動型であることがよく挙げられますが、それに関するコンテキストです。このコンテキストは省略できません。
events {
worker_connections 1024;
}
worker_connectionsディレクティブは、一つのワーカーが処理できるコネクション数を指定します。チューニングのポイントになりそうですが、まぁ最初はこのままでよいかと。
httpコンテキスト内
次に、httpコンテキスト内を。
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
# Additional configuration omitted for brevity
}
log_formatディレクティブは、ログファイルの書式を指定し、その書式に名前をつけます。ここでは、mainという名前の書式を作っています。
access_logディレクティブは、アクセスログのパスと、その書式を指定します。書式の指定には、log_formatで定義したものを使用します。
sendfileディレクティブは、内部的にsendfile()システムコールを用いるかどうかを指定します。tcp_nopushディレクティブは、sendfileディレクティブ有効時に、TCP_NOPUSHオプションを有効にするかどうかを指定します(LinuxではTCP_CORKオプションだそうです)。有効にすると、最も大きなパケットサイズで送信します。tcp_nodelayディクレティブは、tcp_nopushと同じく、TCP_NODELAYオプションを有効にするかどうかを指定します。小さなパケットを待たずに送信するものとのことです。
これらは高速化のためのオプションで、非常に内部的なものですから、ちょっと(いやだいぶ)難しいのですが、基本はonにしておいてよいものと思います。ただ、何か問題が起きたら、offにしてみるのも一つかもしれません(参考「LaravelとNginxの快速仕立て、キャッシュを添えないで…」)。
keepalive_timeoutディレクティブは、クライアントと常時接続する時間を指定します。ずっとアクセスしてくれているユーザーに対して、いちいち繋ぎ直したりしないためのものですね。しかし繋ぎ続けることは負荷になりますし、パフォーマンスとリソースのトレードオフです。
types_hash_max_sizeディレクティブの前に、includeディレクティブを見ます。
includeディレクティブは、設定ファイルを取り込むもので、ここで取り込んでいるのは/etc/nginx/mime.typesです。MIMEタイプとは、Webの世界における拡張子みたいなもので、たとえばhtml拡張子は、MIMEタイプにおいてはtext/htmlです。「拡張子とMIMEタイプ」の解説がわかりやすいです。その関連付けをするのがtypesディレクティブで、mime.typesを見ると、ずらずらと関連付けリストが並んでいます。
で、そのうえでtypes_hash_max_sizeディレクティブですが、「Module ngx_http_core_module」および「Setting up hashes」に解説があるのですけれど、ちゃんと理解できていません…。まぁとりあえず設定ファイルのままで。
default_typeは、MIMEタイプがわからなかった時に用いられるものです。ここでは、application/octet-streamというMIMEタイプになります(参考:「nginx連載3回目: nginxの設定、その1 - インフラエンジニアway - Powered by HEARTBEATS」)。
また、最後にincludeでconf.dディレクトリ以下のものを読み込むようになっています。一つの設定ファイルにあれこれ書くと管理しづらいので、たとえば管理するサーバーごとなどに、設定ファイルをわけたほうが、使いやすいです。
serverコンテキスト内
serverコンテキストは複数作れて、また先に記述したほうが優先される、というわけではないことに注意しなければいけません。特に複数のサーバーを管理し、デフォルトサーバーが何かを決めるうえでは注意。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
listenディレクティブは、使用するIPアドレス、ポートを指定するものです。また、default_serverオプションをつけると、それがデフォルトサーバーとして扱われます。listen 80;は、ポート番号80を利用することを示します。また、listen [::]:80;ですが、これはIPアドレス:ポート番号の書式で、かつ[::]は…これは、IPv6のものですね。まぁ、IPv6アドレスの全部くらいの扱いと思えばよいと思います。このように、listenディレクティブは一つのserverコンテキスト内で複数使えます。
server_nameディレクティブは、ホスト名を指定します。server_name _;は、catch_allを意味します(参考:「Server names」)。
rootディレクティブは、ドキュメントルートを指定します。つまり、そのWebサーバーにおけるツリー構造の最上部となるディレクトリですね。
includeディレクティブは解説済みなので飛ばし。
locationディレクティブは、任意のURI毎に異なる設定をするためのものです。ここではURIが / に一致するもの…まぁつまり全部ですね。中身は空なので、影響しません。locationディレクティブには修飾子があって、 locationに=とか~とかがついていたりします。マッチの仕方を完全一致にしたり正規表現にしたりといったことを示します。詳しくは「nginx location 修飾子」とかで調べる。また、名前をつけてやれば、location @hogeのような使い方も可能。
要は、phpファイルにアクセスがあったときだけ挙動を変えたり、特定のページのURIが変わったので、そのページの時だけリダイレクトで飛ばしたりといった風に使うものです。
error_pageディレクティブは、見ればだいたいわかると思いますが、エラーが存在しない時に表示されるページを指定するものです。具体的には、404ページの在り処。その次のlocationディレクティブは、エラーページの時の設定を指定するものですが、設定が空なので影響ありません。
以上です。
参考書
今回の記事作成にあたって、大いに参考にしたのは下記の「nginx実践入門」です。私のような初心者にも役立つ良い本だと思います。一冊は本を持っておいたほうが、なにかと良いでしょう。オススメです。
Amazonを紹介しましたが…なんと、この本は、技術評論社のサイトでpdfとepubが購入できます!(「nginx実践入門 | Gihyo Digital Publishing」)。しかもDRMフリーです(購入者の情報が書籍内に記述されるソーシャルDRMですが、まぁ普段使いには困りませんので)。技術評論社の書籍は、けっこう電子書籍化されていることが多いので、欲しい本の出版社が技術評論社であったら、ポチる前に検索をかけてみると良いと思います。
コメント