Nginxのlocation以下の設定を共有化する

nomoa,web development

Nginx 特定のlocationにIP制限をかける。例えば以下の状態から/admin-api/ 以下のアクセスにIP制限をかけたいとする

# /etc/nginx/sites-enabled/www.conf
http {
  server {
    location / {
      proxy_set_header        Host            $host;
      proxy_set_header        X-Real-IP       $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      client_max_body_size    10m;
      client_body_buffer_size 128k;
      proxy_connect_timeout   90;
      proxy_send_timeout      90;
      proxy_read_timeout      90;
      proxy_buffers           32 4k;

      proxy_pass      http://big_server_com;
    }
  }
}

location以下の共通化したい内容を別のファイルに記載

# /etc/nginx/shared.conf
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

proxy_pass      http://big_server_com;
# /etc/nginx/sites-enabled/www.conf
http {
  server {
    location ~ ^/admin-api/ {
      # 以下に個別の設定を記載する
      deny all;
      allow 192.168.1.0/24;
      allow 10.1.1.0/16;
      allow 2001:0db8::/32;

      include /etc/nginx/shared.conf
    }
    location / {
      include /etc/nginx/shared.conf
    }
  }
}

ChatGPT3.5に聞いてみた

以下は、例としてlocation /app1/とlocation /app2/の設定を共有する方法です。

まず、共通の設定を含むファイルを作成します。例えば、/etc/nginx/conf.d/common.confという名前のファイルを作成し、以下のように設定します。

bash
location / {
    # 共通の設定
    ...
}

location /static/ {
    # 共通の設定
    ...
}

次に、/etc/nginx/conf.d/app1.confファイルと/etc/nginx/conf.d/app2.confファイルを作成し、それぞれ以下のように設定します。

bash
server {
    ...
    location /app1/ {
        include /etc/nginx/conf.d/common.conf;
        # app1の設定
        ...
    }
}

server {
    ...
    location /app2/ {
        include /etc/nginx/conf.d/common.conf;
        # app2の設定
        ...
    }
}

こうすることで、/etc/nginx/conf.d/common.confに書かれた共通の設定が、/app1/と/app2/の両方のlocationブロックで共有されるようになります。

ChatGPT感想

うーん微妙に違うんだよな。locationブロックが共有化されるのは分かってたんでheaderの設定だけ書いても動作するのかどうか知りたかったんだけど「location以下の内容を書いても共有化できる?」って聞いてもその真偽を確かめるには実際にコード書くかドキュメント読むしか無いよね。 実際に試せる環境ならChatGPTが出力したコード試すほうが早い、そうじゃないならドキュメント読むしか無い。

© nomoa.devRSS