1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

セキュリティごった煮一人完走チャレンジAdvent Calendar 2024

Day 6

リバースプロキシを作って学ぶ認証の仕組み②OpenRestyとnginx.conf

Last updated at Posted at 2024-12-06

これは何?

前回リバースプロキシの概要を書いたので今回は自分でリバースプロキシを立てることを検討します。今回はOpenRestyを使ってリバースプロキシを作るにあたっての準備のため,以下について調べたことをまとめました。

  • OpenRestyとは
  • nginx.confとは

OpenRestyとは

OpenRestyの位置づけ

3つのnginxをうまく使い分けよう

主に4種類のnginxがあるようです。

  • nginx: 本家
  • NGINX Plus: 商用
  • OpenResty: nginx + ngx_lua + third party module + resty + LUa/LuaJIT
  • Tengine: nginxのfork

OpenRestyにはオリジナルのnginxに加えて主要なモジュールやライブラリをインストールしてあり,Luaスクリプトを使った制御ができるのが特徴です。


よく考えたらnginx.confをちゃんと知らなかった

ということで,nginx.confの基本的な構文をまとめました。

Configuration File's Structure

nginx consists of modules which are controlled by directives specified in the configuration file. Directives are divided into simple directives and block directives. A simple directive consists of the name and parameters separated by spaces and ends with a semicolon (;). A block directive has the same structure as a simple directive, but instead of the semicolon it ends with a set of additional instructions surrounded by braces ({ and }). If a block directive can have other directives inside braces, it is called a context (examples: events, http, server, and location).

nginx.confは以下で構成される。

  • Simple directive: パラメータと値を空白で区切ってセミコロンで終わる 。e.g. worker_processes 1;
  • block directive: {}で囲まれる。
    • block directiveの中にblock directiveが記載される場合はこれをcontextと呼ぶ。

The events and http directives reside in the main context, server in http, and location in server.

  • main(明示的に書かない)
    • http
      • server
      • location
    • events

server block

Generally, the configuration file may include several server blocks distinguished by ports on which they listen to and by server names. Once nginx decides which server processes a request, it tests the URI specified in the request’s header against the parameters of the location directives defined inside the server block.

  • listenするポートが変わるとserverブロックを分けるのが一般的
http {
  server {
    listen 80;
    location / {
      root /data/www;
    }
  }
}

location block

This location block specifies the “/” prefix compared with the URI from the request. For matching requests, the URI will be added to the path specified in the root directive, that is, to /data/www, to form the path to the requested file on the local file system.


    location / {
      root /data/www;
    }

Reverse Proxy

In the first location block, put the proxy_pass directive with the protocol, name and port of the proxied server specified in the parameter (in our case, it is http://localhost:8080):

proxy_passにプロキシされるサーバを指定する。

server {
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
    }

    location /images/ {
        root /data;
    }
}

Passing Request Headers

By default, NGINX redefines two header fields in proxied requests, “Host” and “Connection”, and eliminates the header fields whose values are empty strings. “Host” is set to the $proxy_host variable, and “Connection” is set to close.
NGINXではプロキシされるリクエストに対してデフォルトでは以下を実施している。

  • HTTPヘッダーのHostConnectionが上書きされている。

    • Host: ($proxy_passに指定したFQDN)$proxy_hostに書き換わる

    nginx公式ドキュメントに以下の記述がある。

    $proxy_host
    name and port of a proxied server as specified in the proxy_pass directive;

    つまり,proxy_passを設定すると$proxy_hostが書き換わる

    • Connection: closeに変わる
  • 値が空文字列のヘッダフィールドを削除する --> 逆にプロキシされるリクエストから消したいヘッダは空にすると良い。

To change these setting, as well as modify other header fields, use the proxy_set_header directive. This directive can be specified in a location or higher. It can also be specified in a particular server context or in the http block. For example:

events

Nginx Documentation events

Provides the configuration file context in which the directives that affect connection processing are specified.

接続処理に関係のあるディレクティブを指定する。

  • worker_connections: 同時最大接続数

upstream

upstreamはngx_http_upstream_moduleモジュールの機能である。
Module ngx_http_upstream_module

The ngx_http_upstream_module module is used to define groups of servers that can be referenced by the proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, and grpc_pass directives.

  • サーバのグループを定義するために使用される。
  • 重み付けをしてロードバランシングすることもできる。
upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

upstream backendを定義した場合proxy_passなどでhttp://backendを指定した場合に名前解決される。

nginx.conf内で使われる定義済みの変数について

Alphabetical index of variablesにnginx.conf内で使用できる事前定義された変数がだいたい記載されています。

Error log level

nginxではlogレベルを使うことで出力するログを制御できます。

nginxのログレベルについて
TODO: そのうちちゃんと公式ドキュメントを読む

  • emerg: Emergency situations where the system is in an unusable state.
  • alert: Severe situation where action is needed promptly.
  • crit: Important problems that need to be addressed.
  • error: An Error has occurred. Something was unsuccessful.
  • warn: Something out of the ordinary happened, but not a cause for concern.
  • notice: Something normal, but worth noting has happened.
  • info: An informational message that might be nice to know.
  • debug: Debugging information that can be useful to pinpoint where a problem is occurring.

選択したレベルを指定するとそれより上のレベルのログが出力されるようになります。

例えば

error_log  logs/error.log  info;

のように記載するとinfo以上のレベルのログが出力されるようになります。

ngx.log(ngx.WARN, "hoge") -- 出力される
ngx.log(ngx.INFO, "hogehoge") -- 出力される
ngx.log(ngx.DEBUG, "fugafuga") -- 出力されない

次回

次回はLua Script周りの話を書きます。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?