読者です 読者をやめる 読者になる 読者になる

UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

Nginxの設定ファイルの構成について

f:id:mochizuki_p:20170424223250p:plain

Nginxの設定ファイルは直感的で非常にわかりやすい構成になっています。

ここではUbuntu16.04の公式パッケージの初期設定ファイルを教材に、Nginxの設定ファイルの基本的な設定方法について解説します。

設定ファイルの構成

/etc/nginx 内のnginx.confがNginxのメインの設定ファイルです。

nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

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

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

user

nginxのworkerを起動するユーザー名を指定します。初期設定ではwww-dataとなっており、以下のようにワーカーはwww-dataによって起動されます。

root      5962  0.0  0.5 125116  2952 ?        Ss   Apr25   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  6035  0.0  0.7 125512  3740 ?        S    Apr25   0:00 nginx: worker process
  
  

worker_processes

利用するワーカーの数を指定します。数を多くすると、より多くのリクエストを受け付けることができますが、その分CPUやRAMのリソースを多く消費します。

autoを指定して、自動的に調整することも可能です。

pid

NginxのマスタープロセスのプロセスIDを指定します。

この場合は /run/nginx.pid の中身である 5962 が指定されます。

root      5962  0.0  0.5 125116  2952 ?        Ss   Apr25   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
  

events

接続に関する設定全般を行う

worker_connections

個々のワーカーの最大同時接続数を指定することができる。

ここを調整する前に、OSで設定された最大同時接続数を先に確認しておいてください。


ulimit -n # 1024

この最大接続数を上限の65536に上げておくことを推奨します。

初期設定ではworker_connectionsは1024に設定されていますが、通常のブラウザでは一回の接続につき、2つのコネクションを消費しますので、この場合のワーカー1つあたりの最大同時接続数は512となります。CPUの性能にもよりますが、これもOSの設定可能な最大同時接続数(例えば、65536)に設定することを推奨します。

http

httpに関する設定を行うディレクティブです。

sendfile

FreeBSD 5.2.1 で導入された非同期ファイルI/Oを利用する設定です。

tcp_nopush

sendfileが有効化されている場合に設定可能 FreeBSDのTCP_NOPUSHオプション、またはLinuxのTCP_CORKオプションを有効化します。

tcp_nodelay 


TCP_NODELAYを有効化します。

keepalive_timeout

サーバーのkeep-aliveのタイムアウト時間を設定します。

単位は秒単位です。

第二引数にはヘッダに追記するkeep-aliveの時間を設定できます。

例えば、

keepalive_timeout 60 60;  

とするとヘッダに

Keep-Alive: timeout=60  

と追記されます。

参照:

www.nginx.com

types_hash_max_size

Nginxがコンテンツ配信などの最適化に利用するハッシュテーブルのサイズを指定します。

types_hash_bucket_size

Nginxがコンテンツ配信などの最適化に利用するハッシュテーブルのバケットのサイズを指定します。

To quickly process static sets of data such as server names, map directive’s values, MIME types, names of request header strings, nginx uses hash tables. During the start and each re-configuration nginx selects the minimum possible sizes of hash tables such that the bucket size that stores keys with identical hash values does not exceed the configured parameter (hash bucket size). The size of a table is expressed in buckets. The adjustment is continued until the table size exceeds the hash max size parameter. Most hashes have the corresponding directives that allow changing these parameters, for example, for the server names hash they are server_names_hash_max_size and server_names_hash_bucket_size.

The hash bucket size parameter is aligned to the size that is a multiple of the processor’s cache line size. This speeds up key search in a hash on modern processors by reducing the number of memory accesses. If hash bucket size is equal to one processor’s cache line size then the number of memory accesses during the key search will be two in the worst case — first to compute the bucket address, and second during the key search inside the bucket. Therefore, if nginx emits the message requesting to increase either hash max size or hash bucket size then the first parameter should first be increased.

参照:

Setting up hashes

include

外部の設定ファイルをインクルードして展開します。 絶対パスで指定するのが一般的なようです。

例えば、include /etc/nginx/mime.types;の箇所には以下のように 展開されます。

types {
    text/html                             html htm shtml;
...
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
}

ちなみにtypesディレクティブは、拡張子とmimetypeの関連付けを行う設定ファイルです。 つまり、test.htmlをNginxはtext/htmlのmimetypeと判断します。

また、ワイルドカードを利用することも可能です。

        include /etc/nginx/conf.d/*.conf;

の場合は、 /etc/nginx/conf.d/ 以下の拡張子が、confの設定ファイルを読み込みます。

default_type

typesで指定されていない拡張子のmimetypeを指定します。 デフォルトではtext/plainです。

ssl_protocols

SSLのプロトコルを指定します。 これについては別記事に追記します。

ssl_prefer_server_ciphers

同上

access_log

アクセスログを記録するファイルのパスを指定します。

error_log

エラーログを記録するファイルのパスを指定します。

gzip

gzip圧縮を利用するかを指定します。

gzip_disable

リクエストヘッダのUser-Agentが明示された正規表現にマッチした場合にgzipを無効化します。