# Generated from 'nginx-conf-inner.in' on Mon Mar 2 10:51:28 AM UTC 2026.# inner nginx configuration for DOMjudge# This is in a separate file to not have duplicate configserver_name_default_;# set max upload size to infinite since PHP has a setting for thisclient_max_body_size0;# Prevent indexing by robotsadd_headerX-Robots-Tag"none"always;# Variables used in the nginx configurationset$domjudgeRoot/opt/domjudge/domserver/webapp/public;# Set this to '' instead of /domjudge when running in the root of your systemset$prefix'';# /team/scoreboard -> cached /public?static=true (avoid hammering PHP-FPM)location=/team/scoreboard{limit_exceptGETHEAD{denyall;}includefastcgi_params;fastcgi_passdomjudge;fastcgi_split_path_info^(.+\.php)(/.*)$;fastcgi_paramSCRIPT_FILENAME$domjudgeRoot/index.php;fastcgi_paramSCRIPT_NAME$prefix/index.php;fastcgi_paramDOCUMENT_ROOT$domjudgeRoot;fastcgi_paramDOCUMENT_URI/public;fastcgi_paramQUERY_STRING"static=true";fastcgi_paramREQUEST_URI/public?static=true;fastcgi_paramSERVER_NAME$host;fastcgi_paramHTTPS$fastcgi_param_https_variable;fastcgi_cachedj_scoreboard;fastcgi_cache_key"$scheme://$host/public?static=true";# TTL = 3sfastcgi_cache_valid2003s;fastcgi_cache_validany0;fastcgi_cache_lockon;fastcgi_cache_lock_timeout5s;fastcgi_cache_lock_age5s;fastcgi_cache_use_staleupdating;fastcgi_cache_background_updateon;fastcgi_ignore_headersCache-ControlExpiresSet-Cookie;fastcgi_hide_headerSet-Cookie;add_headerX-Cache-Status$upstream_cache_statusalways;}location/{root$domjudgeRoot;location=/status/fpm{access_logoff;includefastcgi_params;fastcgi_paramSCRIPT_NAME/fpm_status;fastcgi_paramDOCUMENT_URI/fpm_status;fastcgi_paramREQUEST_URI/fpm_status;fastcgi_paramSCRIPT_FILENAME/fpm_status;fastcgi_paramSERVER_NAME$host;fastcgi_paramHTTPS$fastcgi_param_https_variable;fastcgi_passdomjudge;}location^~/status/{alias/opt/domjudge/status/;indexindex.phpindex.html;try_files$uri$uri/=404;location~ \.php${includefastcgi_params;fastcgi_split_path_info^(.+\.php)(/.*)$;fastcgi_paramSCRIPT_FILENAME$request_filename;fastcgi_paramSERVER_NAME$host;fastcgi_paramHTTPS$fastcgi_param_https_variable;fastcgi_passdomjudge;}}try_files$uri@domjudgeFront;# Handle API requests separately to be able to split the loglocation/api/{try_files$uri@domjudgeFrontApi;error_log/var/log/nginx/domjudge-api.log;access_log/var/log/nginx/domjudge-api.log;}}# Or you can install it with a prefix#location /domjudge { return 301 /domjudge/; }#location /domjudge/ {# root $domjudgeRoot;# rewrite ^/domjudge/(.*)$ /$1 break;# try_files $uri @domjudgeFront;# Handle API requests separately to be able to split the log# location /domjudge/api/ {# rewrite ^/domjudge/(.*)$ /$1 break;# try_files $uri @domjudgeFrontApi;# }#}location@domjudgeFront{sub_filter_onceoff;sub_filter'href="/team/scoreboard"''href="/team/scoreboard" target="_blank"';fastcgi_split_path_info^(.+\.php)(/.*)$;fastcgi_passdomjudge;includefastcgi_params;fastcgi_paramSERVER_NAME$host;fastcgi_paramSCRIPT_FILENAME$domjudgeRoot/index.php;fastcgi_paramSCRIPT_NAME$prefix/index.php;fastcgi_paramREQUEST_URI$prefix$uri?$args;fastcgi_paramDOCUMENT_ROOT$domjudgeRoot;fastcgi_paramHTTPS$fastcgi_param_https_variable;# Prevents URIs that include the front controller. This will 404:# http://domain.tld/app_dev.php/some-pathinternal;}location@domjudgeFrontApi{fastcgi_split_path_info^(.+\.php)(/.*)$;fastcgi_passdomjudge;includefastcgi_params;fastcgi_paramSERVER_NAME$host;fastcgi_paramSCRIPT_FILENAME$domjudgeRoot/index.php;fastcgi_paramSCRIPT_NAME$prefix/index.php;fastcgi_paramREQUEST_URI$prefix$uri?$args;fastcgi_paramDOCUMENT_ROOT$domjudgeRoot;fastcgi_paramHTTPS$fastcgi_param_https_variable;# Prevents URIs that include the front controller. This will 404:# http://domain.tld/app_dev.php/some-pathinternal;# Use a separate log file for the APIerror_log/var/log/nginx/domjudge-api.log;access_log/var/log/nginx/domjudge-api.log;}# The X-Frame-Options header defends against so-called 'clickjacking' attacks.# Should you want to load part of DOMjudge (e.g. the public scoreboard) in# a HTML frame or iframe, disable this header for that part of DOMjudge only.add_headerX-Frame-Options"DENY";# The following headers should be fine for any DOMjudge installation.add_headerReferrer-Policy"same-origin";add_headerX-Content-Type-Options"nosniff";add_headerX-XSS-Protection"1; mode=block";error_log/var/log/nginx/domjudge.log;access_log/var/log/nginx/domjudge.log;
Tune the opcache params inside php.ini according to the opcache monitor