Primeiramente, defina sua diretiva raiz fora do bloco de localização - neste caso, acima da diretiva error_page -. Veja a página de armadilhas do nginx. A razão para isso é que muitas diretivas (incluindo error_page) precisam conhecer caminhos relativos a algo - e todos os caminhos são supostos como relativos (ou seja, /404.html não está na raiz do seu sistema de arquivos - é relativo ao seu documento). raiz).
server{
#listen 80; - not needed
server_name www.foo.com;
root /srv/www/foo/public_html;
expires 1M;
access_log /srv/www/foo/logs/access.log;
error_log /srv/www/foo/logs/error.log;
error_page 404 /404.html;
location / {
index index.html;
rewrite ^/(.*)/$ /$1 permanent;
try_files "${uri}.html" $uri $uri/ =404;
}
location = /404.html {
internal;
}
}
Se o acima não resolver o erro, aumente o detalhamento de seu error_log (por exemplo, para 'informações') e veja qual página o nginx está realmente servindo quando você atinge um 404.