I'm trying to set a default error_page for my entire nginx server (as in for all vhosts).

I'm trying it with following code:

http {
    error_page 404 /var/www/default/404.html;

Also, I'd like to be able to create a vhost and make it use the default 404.html if I don't explicitly write another one.

Something like:

server {
    server_name mydomain.com
    root /var/www/mydomain.com/;

Anyways, I'm getting the following error:

[error] 16842#0: *1 open() "/var/www/mydomain.com/var/www/default/404.html" failed (2: No such file or directory)

While I do understand the error, and I do understand why it's happening, I can't understand why can't I tell NGINX to user the default error_page as an absolute path instead of appending it to the root of my vhost.

Any idea how to make it?


  • /var/www/default is not the same as /var/default/, did you modify that output by hand at all?
    – gparent
    Feb 21, 2013 at 15:41
  • @gparent Oh, yes, sorry, that's a typo in the error. I'll change it in a second. Feb 21, 2013 at 15:41

3 Answers 3


As you've already discovered, the error_page directive specifies a document that is relative to the document root.

One way to work around this is to create a separate file containing your error page specifications, which contains the appropriate location blocks, and then include that from each server which will use the "global" error_page.

For example, a file /etc/nginx/global404:

location = /404.html {
    root /var/www/default;

error_page 404 /404.html;

Now in each server block, you will:

include global404;
  • 2
    This indeed is a solution, but it's not perfect. Isn't there really some way I could tell NGINX to use a default error_page without having to put it on every server{} ? Feb 22, 2013 at 7:56
  • Nope, sorry. This is about the best you can do. Feb 22, 2013 at 8:01
  • Do you know if this was asked in the ML of NGINX? If it wasn't, I could try asking and see if they can implement it. Feb 22, 2013 at 8:07
  • You can try. Maybe Igor will implement it, or maybe he will yell at you. :) Feb 22, 2013 at 8:08
  • Hahaha, let's hope he'll do the first! Or at least won't do the second :P Feb 22, 2013 at 8:08

Seems like error_page is inherited only if there's no other error_page directives in server/location. So to reset error_page 404 for your server, just set some other error page, like:

server {
  error_page 399 /;

This server won't inherit error_page 404 (and any other) from 'html' block.


I plan to use the include approach previously submitted but, for the sake of thoroughness, an alternative: Use symlinks. It still requires an extra operation for each vhost you manage but it does offer the benefit of not requiring further server config changes and restarts.

http {
    error_page 404 /error/404.html;

...and then in each vhost's root...

ln -s [path to error page html directory] /[vhost root]/error

This approach strikes me as inelegant and unportable (I'd vote it down if I have enough rep to vote things up or down) but it works.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.