blob: 7d1879e638cddfe2eeaef545e0afd8364dbf891f [file] [log] [blame]
{%- set site = salt['pillar.get']('nginx:server:site:'+site_name) %}
{%- if site.get('limit', {}).get('enabled', False) %}
# Create whitelist for ip addresses
geo $geo_{{ site_name }} {
default "enforce";
{%- for ip in site.limit.get('ip_whitelist', []) %}
{{ ip }} "whitelist";
{%- endfor %}
}
# First, map all whitelisted IP's to the request query
map $geo_{{ site_name }} $limit_{{ site_name }} {
default {{ site.limit.get('query', '$binary_remote_addr') }};
"whitelist" "";
}
limit_req_zone $limit_{{ site_name }} zone={{ site_name }}:{{ site.limit.get('size', '100m') }} rate={{ site.limit.get('rate', '30r/m') }};
{%- for subfilter_name, subfilter in site.limit.get('subfilters', {}).items() %}
map "${geo_{{ site_name }}}{{ subfilter.get('input', '$limit_{{ site_name }}') }}" $limit_{{ site_name }}_{{ subfilter_name }} {
default {% if subfilter.get('mode', 'whitelist') == "whitelist" %}"{{ subfilter.get('input', '$limit_{{ site_name }}') }}";{% else %}""{% endif %};
"~^whitelist" ""; # Allow previously whitelisted results.
{%- for match in subfilter.get('items', []) %}
"{{ match }}" {% if subfilter.get('mode', 'whitelist') == 'whitelist' %}""{% else %}"{{ subfilter.get('input', '$limit_{{ site_name }}') }}"{% endif %};
{%- endfor %}
}
limit_req_zone $limit_{{ site_name }}_{{ subfilter_name }} zone={{ site_name }}_{{ subfilter_name }}:{{ subfilter.get('size', site.limit.get('size', '100m')) }} rate={{ subfilter.get('rate', site.limit.get('rate', '30r/m')) }};
{%- endfor %}
{%- endif %}
{%- set location = {} %}
{%- if site.get('location') %}
{%- do location.update(site.location) %}
{%- for path, location in location.items() %}
{%- if location.limit is defined %}
{%- if location.get('limit', {}).get('enabled', False) and location.limit.methods is defined %}
{%- if location.limit.methods.ip is defined and location.limit.methods.get('ip').get('enabled',False) %}
# Create whitelist for ip addresses
geo $ip_{{ site_name }}_{{ path|regex_replace("[^A-Za-z0-9]", "") }} {
default "enforce";
{%- for ip in location.limit.methods.ip.get('ip_whitelist', []) %}
{{ ip }} "whitelist";
{%- endfor %}
}
# First, map all whitelisted IP's to the request query
map $ip_{{ site_name }}_{{ path|regex_replace("[^A-Za-z0-9]", "") }} $limit_{{ site_name }}_{{ path|regex_replace("[^A-Za-z0-9]", "") }} {
default {{ location.limit.methods.ip.get('query', '$binary_remote_addr') }};
"whitelist" "";
}
limit_req_zone $limit_{{ site_name }}_{{ path|regex_replace("[^A-Za-z0-9]", "") }} zone=ip_{{ site_name }}_{{ path|regex_replace("[^A-Za-z0-9]", "") }}:{{ location.limit.methods.ip.get('size', '10m') }} rate={{ location.limit.methods.ip.get('rate','10r/s') }};
{%- endif %}
{%- for method, method_data in location.limit.methods.items() %}
{%- if method != 'ip' %}
map $request_method $limit_{{ method }}_{{ site_name }}_{{ path|regex_replace("[^A-Za-z0-9]", "") }} {
default "";
{{ method|upper }} "limit_{{ method }}";
}
limit_req_zone $limit_{{ method }}_{{ site_name }}_{{ path|regex_replace("[^A-Za-z0-9]", "") }} zone={{ method }}_{{ site_name }}_{{ path|regex_replace("[^A-Za-z0-9]", "") }}:{{ location.limit.methods.get(method,{}).get('size', '10m') }} rate={{ location.limit.methods.get(method,{}).get('rate','10r/s') }};
{%- endif %}
{%- endfor %}
{%- endif %}
{%- endif %}
{%- endfor %}
{%- endif %}