# ============================================================================== # ARQUIVO DE CONFIGURAÇÃO GLOBAL NGINX (VERSÃO MINIMALISTA) # ============================================================================== # AUTOR: Gemini (Especialista NGINX) # DATA DA ALTERAÇÃO: 27/09/2025 # # --- DESCRIÇÃO --- # Esta configuração é intencionalmente mínima. Ela define apenas as diretivas # que, por arquitetura do NGINX, devem existir no escopo global 'http'. # Todas as políticas de SSL, compressão, segurança e timeouts devem ser # declaradas explicitamente em cada arquivo de configuração de site. # ============================================================================== # ========================================================== # Carregamento de Módulos Globais # ========================================================== load_module modules/ngx_http_brotli_filter_module.so; load_module modules/ngx_http_geoip2_module.so; load_module modules/ngx_http_modsecurity_module.so; load_module modules/ngx_http_brotli_static_module.so; load_module modules/ngx_http_cache_purge_module.so; load_module modules/ngx_http_upstream_fair_module.so; load_module modules/ngx_http_echo_module.so; load_module modules/ngx_http_headers_more_filter_module.so; user www-data; worker_processes auto; worker_rlimit_nofile 65535; pid /run/nginx.pid; events { worker_connections 16384; multi_accept on; } http { # --- Configurações Globais Mínimas --- sendfile on; tcp_nopush on; server_tokens off; # Padrão de segurança básico proxy_headers_hash_bucket_size 512; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_session_cache shared:SSL:60m; # Otimização de sessão SSL # --- DEFINIÇÃO DAS ZONAS DE CACHE (OBRIGATÓRIO AQUI) --- # Declara todas as zonas de cache disponíveis para os sites. proxy_cache_path /var/cache/nginx/zabbix_cache levels=1:2 keys_zone=zabbix_cache:10m max_size=1g inactive=60m use_temp_path=off; proxy_cache_path /var/cache/nginx/api_cache levels=1:2 keys_zone=api_cache:10m max_size=100m inactive=5m use_temp_path=off; proxy_cache_path /var/cache/nginx/exchange_private_cache levels=1:2 keys_zone=exchange_private_cache:20m max_size=500m inactive=10m use_temp_path=off; proxy_cache_path /var/cache/nginx/zammad_cache levels=1:2 keys_zone=zammad_cache:10m max_size=500m inactive=60m use_temp_path=off; proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:10m max_size=2g inactive=90d use_temp_path=off; proxy_cache_path /var/cache/nginx/nextcloud_private_cache levels=1:2 keys_zone=nextcloud_private_cache:20m max_size=1g inactive=15m use_temp_path=off; proxy_cache_path /var/cache/nginx/nextcloud_previews_cache levels=1:2 keys_zone=nextcloud_previews:20m max_size=2g inactive=7d use_temp_path=off; proxy_cache_path /var/cache/nginx/nextcloud_cache_grupopralog levels=1:2 keys_zone=nextcloud_cache:120m max_size=10g inactive=6h use_temp_path=off; proxy_cache_path /var/cache/nginx/nextcloud_session_cache levels=1:2 keys_zone=nextcloud_session_cache:50m max_size=500m inactive=30m use_temp_path=off; proxy_cache_path /var/cache/nginx/foldertree_cache keys_zone=foldertree_cache:10m levels=1:2 inactive=1m max_size=100m; proxy_cache_path /var/cache/nginx/business_cache keys_zone=business_cache:10m inactive=60m max_size=1g; proxy_cache_path /var/cache/nginx/gitea_cache levels=1:2 keys_zone=gitea_cache:10m inactive=60m max_size=1g; proxy_cache_path /var/cache/nginx/itguys_cache levels=1:2 keys_zone=itguys_cache:10m inactive=60m max_size=1g; proxy_cache_path /var/cache/nginx/snipeit_cache levels=1:2 keys_zone=snipeit_cache:10m inactive=60m max_size=1g; proxy_cache_path /var/cache/nginx/grafana_cache levels=1:2 keys_zone=grafana_cache:10m inactive=60m max_size=1g; proxy_cache_path /var/cache/nginx/technitium_cache levels=1:2 keys_zone=technitium_cache:10m inactive=60m max_size=1g; proxy_cache_path /var/cache/nginx/unifi_cache levels=1:2 keys_zone=unifi_cache:10m inactive=60m max_size=1g; proxy_cache_path /var/cache/nginx/magnusbilling_cache levels=1:2 keys_zone=magnusbilling_cache:10m max_size=1g inactive=7d use_temp_path=off; proxy_cache_path /var/cache/nginx/workspace_cache levels=1:2 keys_zone=workspace_cache:10m max_size=1g inactive=60m use_temp_path=off; proxy_cache_path /var/cache/nginx/solucionei_cache levels=1:2 keys_zone=solucionei_cache:20m max_size=2g inactive=90d use_temp_path=off; proxy_cache_path /var/cache/nginx/rhema_cache levels=1:2 keys_zone=rhema_cache:20m max_size=2g inactive=90d use_temp_path=off; proxy_cache_path /var/cache/nginx/vcenter_cache levels=1:2 keys_zone=vcenter_cache:10m max_size=1g inactive=60m use_temp_path=off; proxy_cache_path /var/cache/nginx/ferreirareal_cache levels=1:2 keys_zone=ferreirareal_cache:10m inactive=60m max_size=1g; # --- DEFINIÇÃO DE CAPACIDADES DE SEGURANÇA (OBRIGATÓRIO AQUI) --- # Define as 'variáveis' e 'zonas' que os sites podem usar para segurança. map $http_user_agent $is_bad_bot { default 0; ~*(nikto|sqlmap|wpscan|gobuster|dirbuster|feroxbuster|nessus|nmap|curl) 1; } map $request_uri $is_suspicious_uri { default 0; ~*(\.env|\.git|/vendor/|/setup\.php|/\.well-known/|/phpmyadmin|/config\.php|composer\.json) 1; } map $is_bad_bot$is_suspicious_uri $block_request { default 0; ~1 1; } geo $is_internal { default 0; 10.10.0.0/16 1; 10.11.0.0/16 1; 10.12.0.0/16 1; 172.16.0.0/16 1; 45.169.73.155 1; 201.73.213.130 1; 177.74.160.17 1; 177.74.160.18 1; 177.74.160.19 1; 177.74.160.20 1; 177.74.160.21 1; 177.74.160.22 1; 177.74.160.23 1; 45.169.87.168 1; 45.169.87.169 1; 45.169.87.170 1; 45.169.87.171 1; 45.169.87.172 1; 45.169.87.173 1; 45.169.87.174 1; 45.169.87.175 1; 45.169.73.154 1; 201.73.213.129 1; } map $is_internal $limit_key { 0 $binary_remote_addr; 1 ""; } map $is_bad_bot $bad_bot_key { 1 $binary_remote_addr; default ""; } map $request_uri $cache_asset { ~*\.(css|js|mjs|svg|gif|png|jpg|jpeg|ico|wasm|woff|woff2|ttf|otf)$ 1y; default off; } limit_req_zone $limit_key zone=global_limit:20m rate=10r/s; limit_req_zone $bad_bot_key zone=bad_bot_limit:10m rate=5r/m; # --- ATIVAÇÃO GLOBAL DO WAF (MODSECURITY) --- modsecurity on; modsecurity_rules_file /etc/nginx/modsecurity.conf; # --- CONFIGURAÇÃO DO MÓDULO GEOIP2 --- # Carrega o banco de dados GeoIP e mapeia as variáveis usadas no log. # Carrega o banco de dados de Cidades/Países geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb { $geoip2_continent_code; $geoip2_country_code; $geoip2_country_name; $geoip2_state_code; $geoip2_state_name; $geoip2_city_name; $geoip2_postal_code; $geoip2_latitude; $geoip2_longitude; $geoip2_timezone; } # Carrega o banco de dados de Provedor (ASN) geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb { $geoip2_asn; $geoip2_isp; } # --- DEFINIÇÃO DO FORMATO DE LOG (OBRIGATÓRIO AQUI) --- # Define um formato de log rico que pode ser chamado por qualquer site. log_format detailed_proxy escape=json '{' # Timestamps e Identificadores '"@timestamp":"$time_iso8601",' '"time_local":"$time_local",' '"msec":"$msec",' '"request_id":"$request_id",' '"hostname":"$hostname",' '"worker_pid":$pid,' # Informações de Conexão e Cliente '"remote_addr":"$remote_addr",' '"remote_port":$remote_port,' '"server_addr":"$server_addr",' '"server_port":"$server_port",' '"real_ip":"$http_x_forwarded_for",' '"http_x_real_ip":"$http_x_real_ip",' '"remote_user":"$remote_user",' # Detalhes da Requisição HTTP '"request":"$request",' '"request_method":"$request_method",' '"scheme":"$scheme",' '"server_protocol":"$server_protocol",' '"host_header":"$host",' '"request_uri":"$request_uri",' '"uri":"$uri",' '"document_uri":"$document_uri",' '"args":"$args",' '"query_string":"$query_string",' '"request_length":$request_length,' # Caminhos de Arquivo no Servidor '"document_root":"$document_root",' '"realpath_root":"$realpath_root",' '"request_filename":"$request_filename",' # Headers da Requisição '"http_referer":"$http_referer",' '"http_user_agent":"$http_user_agent",' '"http_cookie":"$http_cookie",' '"http_accept_encoding":"$http_accept_encoding",' '"http_accept_language":"$http_accept_language",' # Detalhes da Resposta '"status":$status,' '"body_bytes_sent":$body_bytes_sent,' '"bytes_sent":$bytes_sent,' '"sent_http_server":"$sent_http_server",' '"sent_http_date":"$sent_http_date",' '"sent_http_location":"$sent_http_location",' '"sent_http_content_type":"$sent_http_content_type",' '"sent_http_content_encoding":"$sent_http_content_encoding",' '"sent_http_cache_control":"$sent_http_cache_control",' '"sent_http_content_security_policy":"$sent_http_content_security_policy",' '"sent_http_x_frame_options":"$sent_http_x_frame_options",' # Performance e Conexão '"request_time":$request_time,' '"pipe":"$pipe",' '"connection":"$connection",' '"connection_requests":$connection_requests,' '"limit_rate":"$limit_rate",' # SSL/TLS '"ssl_protocol":"$ssl_protocol",' '"ssl_cipher":"$ssl_cipher",' '"ssl_session_id":"$ssl_session_id",' '"ssl_server_name":"$ssl_server_name",' '"ssl_session_reused":"$ssl_session_reused",' '"ssl_client_verify":"$ssl_client_verify",' # Upstream (versão ultra compatível) '"upstream_addr":"$upstream_addr",' '"upstream_status":"$upstream_status",' '"upstream_connect_time":"$upstream_connect_time",' '"upstream_header_time":"$upstream_header_time",' '"upstream_response_time":"$upstream_response_time",' '"upstream_response_length":$upstream_response_length,' '"upstream_cache_status":"$upstream_cache_status",' # Compressão '"compression_ratio":"$gzip_ratio",' # Módulo GeoIP2 (Expandido) '"geoip_continent_code":"$geoip2_continent_code",' '"geoip_country_code":"$geoip2_country_code",' '"geoip_country_name":"$geoip2_country_name",' '"geoip_state_code":"$geoip2_state_code",' '"geoip_state_name":"$geoip2_state_name",' '"geoip_city_name":"$geoip2_city_name",' '"geoip_postal_code":"$geoip2_postal_code",' '"geoip_latitude":$geoip2_latitude,' '"geoip_longitude":$geoip2_longitude,' '"geoip_timezone":"$geoip2_timezone",' '"geoip_asn":$geoip2_asn,' '"geoip_isp":"$geoip2_isp",' # Variáveis Customizadas (do seu nginx.conf) '"is_bad_bot":"$is_bad_bot",' '"is_suspicious_uri":"$is_suspicious_uri",' '"block_request":"$block_request",' '"is_internal_ip":"$is_internal",' '"rate_limit_key":"$limit_key",' '"bad_bot_rate_limit_key":"$bad_bot_key",' '"cacheable_asset_ttl":"$cache_asset"' '}'; log_format suspicious_bot 'SUSPICIOUS_BOT: $remote_addr - "$http_user_agent" - "$request"'; # --- LOGS GLOBAIS DE FALLBACK --- # Logs mínimos para requisições que não correspondem a nenhum 'server' block. error_log /var/log/nginx/error.log warn; access_log /var/log/nginx/access.log; # --- Inclusão dos Arquivos de Configuração de Sites --- include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }