nginx: Webサーバ(Dockerイメージ)


前提


ドキュメント


Dockerイメージでの利用

docker pull nginx:stable-alpine

CMD: イメージのデフォルトコマンド

docker image inspect --format '{{.Config.Cmd}}' nginx:stable-alpine

コンテナ起動

# --detach: コンテナをバックグラウンドで起動
docker run --rm -it --name temp --publish 80:80 --detach nginx:stable-alpine

# アクセス
curl localhost

# ログ
docker logs temp
172.17.0.1 - - [12/Apr/2019:14:16:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
# => アクセス元がdocker0ブリッジになってしまう

# 停止
docker stop temp

フロントエンドのネットワーク: hostモード

docker run --rm -it --name temp --network host --detach nginx:stable-alpine

nginxコマンド: コンテナのシェルで試す

# AlpineにBashはない
docker run --rm -it --name temp nginx:stable-alpine /bin/sh

# ヘルプ
nginx -h

# サーバ起動(バックグラウンド)
nginx

# アクセス
wget -O - localhost

# サーバ停止
nginx -s stop

nginxコマンドをフォアグラウンド実行するとき

nginx -g "daemon off;"

2種類のプロセスが動く

マスタープロセスのプロセスID


設定ファイル: /etc/nginx/nginx.conf

ディレクティブ

ディレクティブと呼ぶ各種設定を一行ずつ記述する。末尾セミコロン。

ディレクティブ パラメータ;

コンテキスト

セミコロンの代わりに{}で他のディレクティブをグループ化するものを、コンテキストやブロックと呼ぶ。

コンテキスト パラメータ {
  他のディレクティブ;
  他のディレクティブ;
}

ディレクティブによっては、特定のコンテキストでしか使えない。

includeディレクティブ

設定ファイルは分割でき、必要とする場所でincludeディレクティブで読み込む。

include conf.d/other.conf

設定ファイルを出力: nginx -T

# デフォルト設定を出力して終了
docker run --rm -it nginx:stable-alpine nginx -T

コンテキストの階層

トップレベルのmainコンテキスト

最低限のnginx.conf

# トップレベル => mainコンテキスト
events { }

http {
  # ここはトップレベルではない
  server {
    location / { # リクエスト・パス
      root /var/www/; # コンテンツ・ディレクトリ
    }
  }
}

mainコンテキストのその他ディレクティブ


httpコンテキスト

クライアントが要求したURLに応じて、どのように処理するか記述する。https(TLS)も含む。

URL => ホスト・ポート・パスの構成

URL例: http://example.com:80/path/to/file

これらの違いをserverでグループ化し、中でマッチングを記述する。

URLのマッチング

マッチ後の処理


serverコンテキスト

listen: ポートで分岐

http {
  server {
    listen 8080;
    location / {
      root /var/www8080/;
    }
  }
  server {
    # ポート80がデフォルト
    location / {
      root /var/www/;
    }
  }
}

server_name: ホストで分岐

http {
  server {
    server_name *.localhost;
    location / {
      root /var/www/;
    }
  }
  server {
    server_name host1.localhost;
    location / {
      root /var/www-host1/;
    }
  }
}

locationコンテキスト

/から始まるURIパス(http(s)://ドメイン名:ポートより後ろの部分)の違いに応じて、処理を分岐する。

location 修飾語 パス表現 {
  # パスに応じた処理、設定
}

修飾語

前方一致どうしは、最長マッチが優先、正規表現どうしは、最初にマッチしたもの優先。


設定ファイルを指定して起動

# コンテンツ・ディレクトリ作成
mkdir -p www/
echo '<h1>Hello, nginx!</h1>' > www/index.html

docker run --rm -it --name temp --network host --detach \
  --mount type=bind,source="$PWD"/nginx.conf,destination=/etc/nginx/nginx.conf,readonly \
  --mount type=bind,source="$PWD"/www,destination=/var/www,readonly \
  nginx:stable-alpine

ログ出力先: /var/log/nginx/


ログ書式: log_formatディレクティブ

# main
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

# combined
log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

ログ例

# combinedフォーマット
127.0.0.1 - - [15/Apr/2019:13:36:09 +0000] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0"