Как я могу настроить пользовательскую страницу ошибки 503 в NGINX? - PullRequest
12 голосов
/ 09 апреля 2011

Я узнал, как заставить 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 присутствует в моей корневой папке?

Ответы [ 3 ]

7 голосов
/ 28 января 2013

Приведенная ниже конфигурация работает для последней стабильной версии 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;
    }
}
6 голосов
/ 09 апреля 2011

Обновлено : изменено "if -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

4 голосов
/ 09 июля 2013

Другие ответы верны, но просто добавим, что если вы используете внутренние прокси, вам также необходимо добавить 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...