include /etc/nginx/snippets/maintenance-log.conf; # Liste des IP générée au boot par scripts/build-ip-list.sh à partir # de MAINTENANCE_IP_LIST. Définit la variable $ip_in_list (0 ou 1). include /etc/nginx/snippets/_generated_geo.conf; # Décision finale en croisant le mode et l'appartenance à la liste. # whitelist : on bloque si l'IP n'est PAS dans la liste (ip_in_list=0) # blacklist : on bloque si l'IP EST dans la liste (ip_in_list=1) map "${MAINTENANCE_MODE}:$ip_in_list" $is_in_maintenance { default 0; "whitelist:0" 1; "blacklist:1" 1; } server { listen ${LISTEN_PORT}; server_name ${SERVER_NAME}; access_log /var/log/nginx/access.log combined; access_log /var/log/nginx/maintenance.log maintenance_log if=$is_in_maintenance; error_log /var/log/nginx/error.log warn; error_page 503 /__maintenance.html; # Page statique servie uniquement via error_page (jamais directement accessible). location = /__maintenance.html { internal; root /usr/share/nginx/html; try_files /maintenance.html =500; add_header Retry-After 3600 always; add_header Cache-Control "no-store" always; } location / { # if + return est l'un des seuls usages sûrs de `if` en location (cf. If is Evil). if ($is_in_maintenance) { return 503; } proxy_pass http://${UPSTREAM_HOST}; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Connection ""; } }