1. Nginxのコンフィグについて
nginxのインストール後に行うコンフィグ設定について調べたのでまとめます。
2. コンフィグファイル
nginxのコンフィグファイルは基本的には”nginx.conf”のみです。
nginx.confには共通のサーバ設定のみを記載し、Webサイト固有の設定は複数ドメインをホストする事を考慮し、個別のファイルへ記載します。
nginx設定ファイル
$ vi /etc/nginx/nginx.conf
Webサイト固有の設定ファイル
$ ls /etc/nginx/conf.d/*.conf
/etc/nginx/conf.d 内のconfファイルを全て読み込む設定がnginx.confにデフォルトでされています。(include)
設定ファイルの構成
nginx.conf内のディレクティブ構成は以下の様になっています。
nginx.conf
user …;
worker_processes …;
events {
…;
}
http {
…;
include *.conf;
server{
…
}
}
3. パラメータ
パラメータは{}で括られたディレクティブ毎に設定可能なものが決められています。全ての{}の外側に記載するものはここではglobal directivesと表現します。
3-1. global directives
global directivesパラメータは、nginx.confの全ての{}の外側に記載するパラメータです。
nginxを起動するユーザを指定する
デフォルトでは起動ユーザにnginxを指定しています。
user nginx;
nginxのプロセス起動数を指定する
autoを指定した場合はコア数に合わせてnginxのプロセスを起動します。
worker_processes auto;
エラーログ設定
エラーログの記録ファイル指定、ログレベルを設定します。
error_log /var/log/nginx/error.log warn;
PIDファイルの指定
デフォルトでは/var/runの下に作成されます。
pid /var/run/nginx.pid;
3-2. events directives
events{}directivesの中に記載するパラメータについて記載します。
1ワーカープロセス単位に許容する最大コネクション数を指定
同時接続最大数はworker_connections * worker_processesとなります。
worker_connectionsを1024以上にするにはファイルシステムのディスクプリタ最大数設定も必要となります。また、取り扱えるファイル最大数にはworker_rlimit_nofileも関係する為、注意が必要です。
worker_connections 1024;
mutex(排他制御)の確保の為に待つ時間を調整
別のプロセスが新しい接続を受け付けてからプロセスが新しい接続を受け付け再開するまでの最大待ち時間を指定します。
accept_mutex on; accept_mutex_delay 100ms;
複数の同時接続受け入れ
multi_acceptが無効な場合はプロセスは1度に1つの接続のみ受け付ける。
複数接続を受け付けるにはonにする。
multi_accept on;
接続処理方法の指定
OS毎にあったものを選択する。
use epoll;
対象リストは以下から確認できます。
3-3. http directives
nginxでは複数のhttpサーバ/httpsサーバに関する設定を持てますが、それらの読み込む設定ファイルやgzip、mimeなど共通の設定を記載します。
ファイルの読み込み
デフォルトではMIMEのファイル及びconf.d配下の設定ファイルをお読み込む様に指定されている。
MIMEファイルの読み込み
MIMEタイプと拡張子を関連付けするためのファイルを読み込む
include /etc/nginx/mime.types;
追加設定ファイル(Webサイト)の読み込み
mime.typesで拡張子からMIMEタイプを決定できなかったときに適用する関連付けを行う
default_type application/octet-stream;
追加設定ファイル(Webサイト)の読み込み
設定サイト毎の設定を読み込む
include /etc/nginx/conf.d/*.conf;
ログフォーマットの指定
ログファイルに記載するフォーマットを指定する。以下ではmainという名前のログフォーマットを指定している。この名前はaccess_logの出力先の名前と一致させる必要がある。
log_format main ... ;
アクセスログの出力先とログフォーマットを指定する。
以下では/var/log/nginx/access.logにmainという名前の設定のlogフォーマットでログを記載する。
access_log /var/log/nginx/access.log main;
フッターへのNginxサーババージョンの出力
セキュリティ確保(バージョン情報流出防止)のため、offを推奨する。
server_tokens off;
Webページの文字コードの指定
レスポンスヘッダに文字コードの指定を含める。UTF-8の場合は以下
charset UTF-8;
パフォーマンス関連
コンテンツファイルの読み込みとレスポンスの送信にsendfileシステムコールを使用する
キャッシュのように動作する為、サーバの高速化に役立つ。Nginxが期待する最新ファイルを返さない等、問題が発生した場合はoffにする。
sendfile on;
TCP_NOPUSHオプション
sendfile有効時のみ利用可能。レスポンスヘッダとファイルの内容をまとめて送ることができる。
tcp_nopush on;
TCP_NODELAYオプション(Nagleアルゴリズム)の無効化。
デフォルトでon。動作としては未送信データがMSSとなる/ACK未受信のものがなくなるまでデータの送信を遅延させ、纏めてデータを送信しようとする。
tcp_nodelay on;
一度開いたファイル情報をキャッシュする
最大100個のキャッシュを保持し、20秒アクセスが無いとキャッシュから削除される様に設定。
open_file_cache max=100 inactive=20s;
クライアントとの接続タイムアウト
キープアライブタイムアウトに65秒を指定
keepalive_timeout 65s;
HTTPS関連
SSLセッションをキャッシュし、同一接続元からのSSLハンドシェイクを省略する
ssl_session_cache shared:SSL:30m; ssl_session_timeout 5m;
SSLを暗号化するサイズを指定(TTFB改善)
ssl_buffer_size 4k;
gzip圧縮関連
gzip圧縮を行う事でクライアントとの通信量を減らし、レスポンスを高速化する。
gzip圧縮を有効にする
gzip on;
MSIE6ではgzip圧縮を有効にしない
gzip_disable "msie6";
gzip圧縮の対象を指定
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip圧縮レベル
gzip_comp_level 9;
圧縮済みファイルの配信
gzip_static on;
指定した内容ごとにキャッシュを分ける必要があることを、キャッシュサーバやCDNに伝える
gzip_vary on;
キャッシュサーバやCDNを経由した際にもgzipを有効にする
gzip_proxied any;
レスポンスを圧縮するのに利用するバッファサイズを指定
gzip_buffers 16 8k;
HTTP1.1以上の場合にgzipを利用する。
gzip_http_version 1.1;
3-4. server directives
serverディレクティブではサイト毎/プロトコル毎の組み合わせでさサーバ設定を行う。http directivesの中に作成する。
サーバ待ち受けポート/Virtual Serverの指定
fastopen/reuseportはパフォーマンス向上を目指し指定。
ポート80番でhttp2で待ち受け
listen 80 http2 fastopen=10 reuseport;
ポート443でhttp2/ssl でデフォルトサーバとして待ち受け
listen 443 default_server ssl http2 fastopen=10 reuseport;
サーバ名/ドメインの設定
server_name blog.hashihei.com;
既にQUIC、HTTP/3のサポートは予定されており、早ければv1.17の中で実装がされる様です。
ドキュメントルートの設定
root /var/html/www;
インデックスファイルの指定
index index.html index.htm index.php;
アクセスログの指定。log_formatにmainを指定している場合の設定。
access_log /var/log/nginx/host.access_443.log main;
SSL証明書の設定
letsencryptの場合
ssl_certificate /etc/letsencrypt/live/[domainname]/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/[domainname]/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
証明書の場合
ssl_certificate /[path-to-the-cert-dir]/cert.pem; ssl_certificate_key /[path-to-the-cert-dir]/cert.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;