{%- from "nginx/map.jinja" import server with context -%}
user {{ server.system_user }};
worker_processes {{ server.get('worker', {}).get('processes', 'auto') }};
worker_rlimit_nofile {{ server.get('worker', {}).get('limit', {}).get('nofile', '20000') }};
pid /run/nginx.pid;


events {
        worker_connections {{ server.get('worker', {}).get('connections', '1024') }};
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout {{ server.get('keepalive_timeout', '65') }};
        types_hash_max_size 2048;
        server_tokens {% if server.get('tokens', False) %}on{% else %}off{% endif %};

        server_names_hash_bucket_size 128;
        # server_name_in_redirect off;

        variables_hash_bucket_size {{server.get('variables_hash_bucket_size', '128') }};

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Logging Settings
        ##

        access_log {{ server.get('log', {}).get('access', server.log_dir + '/access.log') }};
        error_log {{ server.get('log', {}).get('error', server.log_dir + '/error.log') }};

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # nginx-naxsi config
        ##
        # Uncomment it if you installed nginx-naxsi
        ##

        #include /etc/nginx/naxsi_core.rules;

        ##
        # nginx-passenger config
        ##
        # Uncomment it if you installed nginx-passenger
        ##

        #passenger_root /usr;
        #passenger_ruby /usr/bin/ruby;

{% if server.upstream is defined %}
        ## Upstreams
        include /etc/nginx/upstream.conf;
{% endif %}

        ##
        # Virtual Host Configs
        ##


{%- if server.limit_req_module is defined %}
 {%- set _data = server.limit_req_module %}
   {%- include "nginx/files/_limit_req_module.conf" %}
{%- endif %}

{%- if server.limit_conn_module is defined %}
 {%- set _data = server.limit_conn_module %}
   {%- include "nginx/files/_limit_conn_module.conf" %}
{%- endif %}

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*.conf;

}

{% if server.stream is defined %}
## Streams
include /etc/nginx/stream.conf;
{% endif %}

#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}
