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パスが割り当てられている。