コンテンツにスキップ

nginx.conf@Nginx

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. セットアップ

インストール

▼ aptリポジトリから

nginxをapt-getコマンドでインストールすると、旧バージョンが指定されるため、aptコマンドを使用する。

$ apt install nginx

▼ yumリポジトリから

$ yum install -y nginx


02. 設定ファイルの種類

/etc/nginx/conf.d/*.confファイル

.../conf.d/*.confファイルとは

デフォルトの設定が定義されているいくつかのファイル。

基本的には読み込むようにする。

ただし、nginx.confファイルの設定が上書きされてしまわないかを注意する。

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


/usr/share/nginx/modules/*.confファイル

.../modules/*.confファイルとは

モジュールの読み出し処理が定義されているファイル。

include  /usr/share/nginx/modules/*.conf;


/etc/nginx/mime.typesファイル

mime.typesファイルとは

リクエストのContent-TypeのMIMEタイプとファイル拡張子の間の対応関係が定義されているファイル。

include /etc/nginx/mime.types;


/etc/nginx/fastcgi_paramsファイル

fastcgi_paramsファイルとは

FastCGIプロトコルでルーティングする場合に使用する。

アプリケーションで使用できる変数を定義する。

nginx.confファイルによって読み込まれる。

OSやそのバージョンによっては、変数のデフォルト値が異なることがある。

実際にインバウンド通信のルーティング先に接続し、上書き設定が必要なものと不要なものを判断する必要がある。

▼ Debian系の場合

Debian10の設定ファイルを以下に示す。

*実装例*

#-------------------------------------------------------
# OSによって、fastcgi_paramsファイルの必要な設定が異なる
#-------------------------------------------------------
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHPのみで必要な設定
fastcgi_param  REDIRECT_STATUS    200;


03. Core

ブロック

▼ events

*実装例*

events {
  worker_connections  1024;
}


ディレクティブ

▼ user

本設定ファイルの実行ユーザーとグループを設定する。

グループ名を入力しなかった場合、ユーザー名と同じものが自動的に設定される。

user  www www;

▼ error_log

error_log  logs/error.log;

▼ include

共通化された設定ファイルを読み込む。

アスタリスクによるワイルドカード (*) に対応している。

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

includeディレクティブをどの階層で実行したかによって、指定した設定ファイル内で実行できるディレクティブが異なる。

例えば、httpディレクティブは一番上の階層で実行する必要があるため、これを定義した設定ファイルは一番上の階層のincludeディレクティブで指定する必要がある。

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

http {
    # ここでhttpを実行する設定ファイルをincludeできない
}

▼ load_module

Nginxでは、ビルド時にモジュール (soファイル) をバイナリを組み込むが、すでにビルド済みのモジュールを実行時に読み込める。

デフォルトでは、モジュールはmodulesディレクトリにある。

load_module modules/<動的モジュール名>;

▼ pid

pid logs/nginx.pid;

▼ worker_connections

workerプロセスが同時に処理できるコネクションの最大数を設定する。

worker_connections 1024;

▼ worker_processes

worker_processes 5;

▼ worker_rlimit_nofile

worker_rlimit_nofile 8192;


03-02. ngx_http_core_module

ブロック

▼ http

全てのHTTPプロトコルのインバウンド通信に共通する処理を設定する。

http {
    # Nginxのバージョンを表示するか否か
    server_tokens      off;
    # MIMEタイプを設定
    include            /etc/nginx/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システムコールを使用するか否か
    sendfile           on;
    # ヘッダーとファイルをまとめてレスポンスするか否か
    tcp_nopush         on;
    # KeepAliveを維持する時間
    keepalive_timeout  65;
    default_type       application/octet-stream;
    include            /etc/nginx/mime.types;
    include            /etc/nginx/conf.d/*.conf;

    server {
        ...
    }
}

▼ location

特定のパスのインバウンド通信に関する処理を設定する。

*実装例*

各設定の優先順位に沿った以下の順番で実装した方が良い。

# 1. ドキュメントルートを指定したインバウンド通信の場合
location = / {

}

# 2. 『/images/』で始まるインバウンド通信の場合
location ^~ /images/ {

}

# 3と4. 末尾が、『gif、jpg、jpegの形式』 のインバウンド通信の場合
# バックスラッシュでドットをエスケープし、任意の文字列ではなく『ドット文字』として識別できるようにする。
location ~* \.(gif|jpg|jpeg)$ {

}

# 5-1. 『/docs/』で始まる全てのインバウンド通信の場合
location /docs/ {

}

# 5-2. 『/』で始まる全てのインバウンド通信の場合
location / {

}

ルートの一致条件は、以下の通りである。

優先順位 prefix ルートの一致条件 ルート例
1 = 指定したルートに一致する場合。 https://example.com/
2 ^~ 指定したルートで始まる場合。 https://example.com/images/foo.gif
3 ~ 正規表現 (大文字・小文字を区別する) 。 https://example.com/images/FOO.jpg
4 ~* 正規表現 (大文字・小文字を区別しない) 。 https://example.com/images/foo.jpg
5 なし 指定したルートで始まる場合。 https://example.com/foo.html
https://example.com/docs/foo.html

▼ server

特定のルーティング先に関する処理を設定する。

*実装例*

server {
    # 80番ポートで受信
    listen      80;
    # Hostヘッダー値
    server_name example.com;
    root        /var/www/foo;
    index       index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass  unix:/run/php-fpm/www.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

▼ リダイレクトとリライトの違い

以下のリンクを参考にせよ。


ディレクティブ

▼ default_type

Content-Typeヘッダー値がmime.typesファイルにないMIME typeであった場合に適用するMIME typeを設定する。

*実装例*

任意のMIME type (指定なし) のインバウンド通信を処理する。

default_type application/octet-stream

▼ listen

インバウンド通信を待ち受けるポート番号を設定する。

*実装例*

インバウンド通信を80番ポートで受信する。

listen 80;

インバウンド通信を443番ポートで受信する。

listen 443 ssl;

▼ sendfile

クライアントへのレスポンス時に、ファイル送信のためにLinuxのsendfileシステムコールを使用するか否かを設定する。

ファイル返信処理をOS内で実行するため、処理が速くなる。

使用しない場合、Nginxがレスポンス時に自身でファイル返信処理を実行する。

*実装例*

sendfile on;

▼ server_name

受信する通信のHostヘッダー値を設定する。

補足としてHostヘッダーには、インバウンド通信のルーティング先のドメイン名が割り当てられている。

server_name example.com;

パブリックIPアドレスを直接的に記述しても良い。

server_name 192.168.0.0;

注意点として、同じIPアドレスからのインバウンド通信のみを受信する場合は、インバウンド通信のHostヘッダー値は常に127.0.0.1 (127.0.0.1) であるため、127.0.0.1を設定できる。

127.0.0.1としても良いが、127.0.0.1のIPアドレスが127.0.0.1でない場合も考慮して、127.0.0.1とした方が良い。

server_name 127.0.0.1;

▼ ssl

HTTPSプロトコルを受信する場合、SSL/TLSプロトコルを有効にする必要がある。

*実装例*

ssl on;

▼ ssl_certificate

HTTPSプロトコルを受信する場合、SSL証明書のパスを設定する。

*実装例*

ssl_certificate /etc/nginx/ssl/server.crt;

▼ ssl_certificate_key

HTTPSプロトコルを受信する場合、SSL証明書と対になる秘密鍵へのパスを設定する。

*実装例*

ssl_certificate_key /etc/nginx/ssl/server.key;

▼ ssl_client_certificate

HTTPSプロトコルを受信する場合、クライアント証明書のパスを設定する。

*実装例*

ssl_client_certificate /etc/nginx/ssl/client.crt;

▼ tcp_nopush

上述のLinuxのsendfileシステムコールを使用する場合に適用できる。

クライアントへのレスポンス時、ヘッダーとファイルを1個のパケットにまとめて返信するか否かを設定する。

*実装例*

tcp_nopush on;

▼ try_files

指定されたパスのファイルを順に探してアクセスする。

また、最後のパラメーターで内部リダイレクトする。

最後のパラメーターでは、異なるパスまたはステータスコードを指定できる。

もし、nginxとアプリケーションを異なる仮想環境で稼働させている場合、try_filesディレクティブがファイル探索の対象とする場所は、あくまでnginxの稼働する仮想環境内になることに注意する。

内部リダイレクトによって、nginx内でリクエストが再処理される。

異なるパスに内部リダイレクトしていた場合は、パスに合ったlocationブロックで改めて処理される。

内部リダイレクトは、URLを書き換えてリダイレクトせずに処理を続行する『リライト』とは異なることに注意する。

location / {
    try_files file ... uri;
}
location / {
    try_files file ... =code;
}

*実装例*

location / {
    # 1. 『/foo.html』のパスで、ファイルをレスポンス
    # 2. 『/foo.html/』のパスで、ファイルをレスポンス
    # 3. 『/index.php?query_string』のパスで内部リダイレクト
    try_files $uri $uri/ /index.php?query_string;
}

# 内部リダイレクト後は、『/index.php?foo=bar』のため、以下で処理される。
location ~ \.php$ {
    # php-fpmにルーティングされる。
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include       fastcgi_params;
}


ヘルスチェックの受信

▼ nginxによるレスポンス

webサーバーのみヘルスチェックを受信する。

ヘルスチェック用のserverブロックで、gifファイルを含むレスポンスを返信するようにlocationブロックを定義する。

Nginxでアクセスログを出力する必要はないため、locationブロックではaccess_logを無効化する。

*実装例*

server {
    listen 80      default_server;
    listen [::]:80 default_server;
    root           /var/www/foo;
    index          index.php index.html;

    location /healthcheck {
        empty_gif;
        access_log off;
        break;
    }
}

▼ アプリケーションによるレスポンス

webサーバーとアプリケーションの両方でヘルスチェックを受信する。

アプリケーション側に200ステータスを含むレスポンスを返信するエンドポイントを実装したうえで、ヘルスチェック用のserverブロックでwebサーバーにルーティングするようにlocationブロックを定義する。

Nginxでアクセスログを出力する必要はないため、locationブロックではaccess_logを無効化する。

*実装例*

server {
    listen 80      default_server;
    listen [::]:80 default_server;
    root           /var/www/foo;
    index          index.php index.html;

    location /healthcheck {
        try_files $uri $uri/ /index.php?$query_string;
        access_log off;
    }
}


03-03. ngx_http_index_module

ディレクティブ

▼ index

リクエストのURLがトレイリングスラッシュで終了する全ての場合、指定されたファイルをURLの末尾に追加する。

*実装例*

index index.php;


03-04. ngx_http_headers_module

ディレクティブ

▼ add_header

レスポンス時に付与するレスポンスヘッダーを設定する。

*実装例*

# Referrer-Policyヘッダーに値を設定する
add_header Referrer-Policy "no-referrer-when-downgrade";


03-05. ngx_http_upstream_module

ブロック

▼ upstream

インバウンド通信のルーティング先をグループ化する。

デフォルトでは、加重ラウンドロビン方式を基に通信をルーティングする。

*実装例*

upstream foo_servers {
    server 192.168.0.1:80;
    server 192.168.0.1:81;
}


03-06. ngx_http_fast_cgi_module

ディレクティブ

▼ fastcgi_params

FastCGIプロトコルでインバウンド通信をルーティングする場合、ルーティング先で使用する変数とその値を設定する。

*実装例*

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

▼ fastcgi_pass

FastCGIプロトコルでインバウンド通信をルーティングする場合、ルーティング先のアドレスとポートを設定する。

*実装例*

fastcgi_pass 127.0.0.1:9000;


03-07. ngx_http_rewrite_module

ディレクティブ

▼ if

条件分岐を設定する。

if ($request_uri = /) {
    # foo変数にfooを設定する
    set $foo foo;
}

if ($host ~* teambox.com) {
    # bar変数にbarを設定する
    set $bar bar;
}


03-08. ngx_http_grpc_module

ディレクティブ

▼ grpc_pass

gRPCによるHTTPリクエストの宛先を設定する。

HTTP/2.0 (例:gRPCなど) を有効化する必要がある。

*実装例*

grpc_pass 127.0.0.1:80;
server {
    listen 80      default_server;

    # HTTP/2を有効化する
    http2 on;

    location / {
        grpc_pass 127.0.0.1:80;
    }
}


03-09. ngx_http_proxy_module

ディレクティブ

▼ proxy_pass

HTTPプロトコルでインバウンド通信をルーティングする場合、ルーティング先のアドレスとポートを設定する。

*実装例*

proxy_pass http://127.0.0.1:80;

受信したリクエストの情報をそのまま使ってプロキシする場合、変数を使用する。

proxy_pass $scheme://$host$request_uri;


03-10. ngx_http_stub_status_module

ディレクティブ

▼ stub_status

特定のパスにリクエストを送信することで、メトリクスを取得できるようにする。

location = /metrics {
    stub_status;
}
$ curl localhost/metrics

Active connections: 1
server accepts handled requests
 93370 93370 74159
Reading: 0 Writing: 1 Waiting: 0


04. 変数

$request_uri

受信したリクエストのHTTPメソッドとURLが割り当てられている。

GET http://_:80/foo


$uri

受信したリクエストのURLパスが割り当てられている。