Как настроить пользовательскую страницу ошибок 503 в NGINX?

Я узнал, как заставить NGINX возвращать страницы ошибок клиентов 503, но я не могу узнать, как сделать следующее:

Пример конфигурационного файла:

    location / {
        root   www;
        index  index.php;
        try_files /503.html =503;
    }

    error_page 503 /503.html;
    location = /503.html {
        root   www;
    }

Как вы можете видеть, в соответствии с приведенным выше кодом, если в корневом каталоге находится страница с именем 503.html, сайт вернет эту страницу пользователю.

Но кажется, что хотя код выше работает, когда кто-то просто посещает мой сайт, набрав

он не захватывает запросы вроде:

С моим кодом пользователь все еще может видеть страницу профиля или любые другие страницы, кроме index.php.

Вопрос:

Как привязать запросы ко всем страницам моего сайта и пересылать их на 503.html, когда 503.html присутствует в моей корневой папке?

Ответ 1

Обновлено: изменено "если -f" на "try_files".

Попробуйте следующее:

server {
    listen      80;
    server_name mysite.com;
    root    /var/www/mysite.com/;

    location / {
        try_files /maintenance.html $uri $uri/ @maintenance;

        # When maintenance ends, just mv maintenance.html from $root
        ... # the rest of your config goes here
     }

    location @maintenance {
      return 503;
    }

}

Дополнительная информация:

https://serverfault.com/questions/18994/nginx-best-practices

http://wiki.nginx.org/HttpCoreModule#try_files

Ответ 2

Нижеследующая конфигурация работает для близкого к последнему стабильному nginx 1.2.4. Я не мог найти способ включить страницу обслуживания с помощью if, но, по-видимому, согласно IfIsEvil, это нормально if.

  • Чтобы включить обслуживание touch /srv/sites/blah/public/maintenance.enable. Вы можете rm отключить файл.
  • Ошибка 502 будет сопоставлена ​​с 503, чего хочет большинство людей. Вы не хотите предоставлять Google 502.
  • Пользовательские 502 и 503 страницы. Ваше приложение будет генерировать другие страницы ошибок.

В Интернете существуют другие конфигурации, но они, похоже, не работают с последним nginx.

server {
    listen       80;
    server_name blah.com;

    access_log  /srv/sites/blah/logs/access.log;
    error_log  /srv/sites/blah/logs/error.log;

    root   /srv/sites/blah/public/;
    index  index.html;

    location / {
        if (-f $document_root/maintenance.enable) {
            return 503;
        }
        try_files /override.html @tomcat;
    }

    location = /502.html {
    }

    location @maintenance {
       rewrite ^(.*)$ /maintenance.html break;
    }

    error_page 503 @maintenance;
    error_page 502 =503 /502.html;

    location @tomcat {
         client_max_body_size 50M;

         proxy_set_header  X-Real-IP  $remote_addr;
         proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header  Host $http_host;
         proxy_set_header  Referer $http_referer;
         proxy_set_header  X-Forwarded-Proto http;
         proxy_pass http://tomcat;
         proxy_redirect off;
    }
}

Ответ 3

Другие ответы правильны, но просто добавьте, что если вы используете внутренние прокси, вам также нужно добавить proxy_intercept_errors on; на один из ваших прокси-серверов.

Итак, например...

    proxy_intercept_errors on;
    root /var/www/site.com/public;
    error_page 503 @503;
    location @503 {
       rewrite ^(.*)$ /scripts/503.html break;
    }