nginx

nginxでリバースプロキシ設定をした際の「add_header」について

はじめに

Nginxを用いてリバースプロキシ構成を敷いているシステムに対し、セキュリティ対策のためhttpレスポンスにいくつかヘッダを追加する必要性に迫られた。
とりあえずnginx.confの適当な箇所に「add_header」属性を追加したところ、同じ要素のヘッダが2つ追加されて返ってくるという事態に見舞われたので、回避方法をメモしておく。

Nginx設定

/etc/nginx/nginx.conf
http {
    proxy_buffering       on;
    proxy_buffer_size     8k;
    proxy_buffers         100 8k;
    proxy_cache_path      /var/cache/nginx/reverseproxy levels=1:2 keys_zone=reverseproxy:15m inactive=7d max_size=1000m;
    proxy_temp_path       /var/cache/nginx/temp 1 2;
    proxy_connect_timeout 60;
    proxy_read_timeout    90;
    proxy_send_timeout    60;
    proxy_cache_valid     200 2h;
    proxy_cache_valid     302 2h;
    proxy_cache_valid     301 4h;
    proxy_cache_valid     any 1m;

    # set header
    set_real_ip_from    xx.xx.xx.xx;
    real_ip_header      X-Forwarded-For;

    # backend
    upstream backend {
        ip_hash;
        server localhost:8080;
    }

    include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Remote-Addr $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header Host $host;

    location / {
        proxy_no_cache 0;
        proxy_cache_bypass 0;
        proxy_redirect off;
        proxy_cache reverseproxy;
        proxy_cache_key "$scheme://$host$request_uri";
        proxy_pass http://backend;
    }

}

server {
    listen 8080;
    server_name localhost;
    root /var/www/html;

    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    location / {
        try_files $uri $uri/ =404;
    }
}

default.confのバックエンド側(localhost:8080)のserverディレクティブの中に記載すると、1つずつヘッダが追加されて返ってきた。
それ以外のディレクティブに書くと「add_header」に記載したヘッダが2つずつ追加されて返ってくる。
なお原因は調査中。