nginx

nginxについてまとめ(設定編)

More than 1 year has passed since last update.

概要

前回: nginxについてまとめ(導入編)

今回はApacheでよく使う機能を中心に、目的別に設定方法を調査した。

設定ファイルのルール

  • モジュール = nginxの構成単位

    • 設定ファイルはモジュール単位で記述する
    http{
        # httpモジュールの設定
    }
    
    # coreモジュールの設定はくくる必要がない
    
    モジュール名 内容
    core プロセス制御、設定ファイル制御、ロギング
    event イベント処理(パフォーマンス・チューニング
    http webサーバ関連の設定
    mail メール関連の設定
  • ディレクティブ = 命令

    • ディレクティブは他のディレクティブを内包し得る
    http{
        server{
            # ...
        }
    }
    
  • コンテキスト = モジュールあるいはディレクティブが作るスコープ

    • { } で囲まれた範囲を指す
    • coreモジュールのコンテキスト(一番外側)はmainコンテキストと呼ばれる

目的別の設定例

一般設定

実行ユーザを指定する

# nginxユーザを設定
user nginx;

設定ファイルを読み込む

ルート設定ファイルnginx.conf内にincludeを記述することで、他の設定ファイルの読み込みが可能。設定ファイルはApacheと同様にconf.d/に格納することが多い様子。

include /usr/local/etc/nginx/conf.d/ssl.conf

パフォーマンスを調整する

  • worker_processにより実行プロセス数を指定できる
# 2プロセスで動かす
# CPUのコア数より多く設定してもパフォーマンスは上がらないとのこと
worker_processes 2;
  • worker_connectionsによりコネクション数を制限する
events{
    worker_connections  512;
}
  • その他、keepalive_requests、keepalive_timeouttcp_nopush,tcp_nodelay`などなど...

エラーログを指定する

  • httpなど、core以外のコンテキストに対して個別に設定が可能
  • ログレベルを設定可能

    • デフォルトはコンテキストに依存する
    • レベルは低い順に、debug, info, notice, warn, error, crit, alert, emerg
  • エラーログに対してフォーマットを指定する方法は不明だった。レベル指定以外できない?

nginx.conf
error_log  logs/nginx/error.log debug;

Webサーバ設定

基本設定

  • listen によりIPとポートを指定する
  • server_nameによりサーバ名を指定する
  • rootによりドキュメントルートを指定する
  • charsetによりレスポンスヘッダのContent-typeを指定する
http{
    # listenはポートのみ指定でも可
    listen 80;
    server_name www.example.com;
    root /var/www/html/www.example.com;
    charset UTF-8;
}

アクセスログを設定する

http{
    log_format formatA '[$time_local]$connection - $status';
    access_log formatA /var/logs/nginx/access_log
}

仮想サーバを構築する

ドメインベース
  • serverを復数記述することで、仮想サーバとして動作する
    • http内に記述できるディレクティブは、だいたいsever内にも記述できる様子
http{
    server{
        server_name alpha.example.com;
    }
    server{
        server_name bravo.example.com;
    }
}
IPベース
  • listenで別個のIPを指定することで、IPベースの仮想サーバを構築できる
http{
    server{
        listen 192.168.0.1:80;
        server_name alpha.example.com;
    }
    server{
        listen 192.168.0.2:80;
        server_name bravo.example.com;
    }
}

エイリアスを指定する

  • locationにより、パスごと個別のドキュメントルートを設定可能
http{
    server{
        location /foo{
            root /path/to/foo;
        }
        location /bar{
            root /path/to/bar;
        }
    }
}
  • なお、indexファイルはindexで指定できた
http{
   index index.html index.htm;
}

ファイル一覧を表示する/しない

  • Apacheでいうところのindexesは、autoindexで指定できる
http{
    # ファイル一覧を有効化
    autoindex on;
}

IPフィルタリング

  • allow / denyでアクセスを許可 / 拒否する
http{
    allow 127.0.0.1;
    deny all;
}

なお、設定ファイルの上にあるルールが優先される

# allowが優先されるため、全アクセスを許可する
http{
    allow all;
    deny all;
}

# denyが優先されるため、全アクセスを拒否する
http{
    deny all;
    allow all;
}

BASIC認証を設定する

  • auth_basicでBASIC必須の旨とメッセージを、auth_basic_user_fileで.htpasswdファイルを設定する
http{
    auth_basic "BASIC AUTH";
    auth_basic_user_file /path/to/.htpasswd;
}

SSL(https)に対応する

  • listenで443ポートとSSLを使うことを指定
  • sslでSSLを有効に
  • ssl_certificateで証明書+中間証明書のファイルを指定
  • ssl_certificate_keyで秘密鍵を指定
http{
    listen 443 ssl;
    ssl on;
    ssl_certificate      /path/to/cert.pem;
    ssl_certificate_key  /path/to/cert.key;  
}

Rewriteルールを設定する

  • rewriteでルールを指定する
    • lastフラグを付けると、rewrite後にlocationディレクティブを再評価する
    • breakフラグの場合は再評価しない
# /a/b を /a-bに変換する
rewrite ^/(.*)/(.*)$ $1-$2 last;

不明点

.htaccessはないらしい

調べた限りでは、.htaccessのようにフォルダ別に動的な設定ファイルを配置する仕組みはなかった。

制御構文

  • setによる変数定義, ifによる条件分岐など、スクリプト的な機能もある様子
  • ただドキュメントを見ると、このディレクティブはrewrite関連の様子。それ以外の目的では使えない...?

参考