Nginx 502 при показе страницы с ошибкой?

Я настраивал Nginx в качестве обратного прокси для приложения на сервере. Часть этого включает страницу обслуживания, которая имеет внешнее содержание (например, изображения). Мне удалось найти способ настройки страницы ошибок с изображениями, возвращающими 200, но похоже, что обратный прокси-сервер изменит всю среду. Вот оригинальное решение со страницы поддержки nginx с проблемой контента

error_page 503 @maintenance;

location @maintenance {
    root /path_to_static_root;
    if (!-f $request_filename) {
        rewrite ^(.*)$ /rest_of_path/maintenance.html break;
    }
    return 200;
}

Обратный прокси настроен как:

location / {
            proxy_pass         http://127.0.0.1:9007/;
            proxy_redirect     off;
}

Проблема заключается в том, что когда обнаруживается, что файл существует в корне "обслуживания", что-то идет не так, и сервер возвращает 502. Кто-нибудь знает, в чем причина?

Некоторое предположение мне интересно, если сервер прослушивает порт 80, он каким-то образом передает любой хороший запрос файла обратно в прокси. Если бы это было правдой, как бы этого избежать?

редактировать

Вот ошибка в журнале nginx. Я напрямую пытаюсь получить доступ к 50x.html. Не уверен, почему это произойдет?

2012/02/17 19:39:15 [error] 21394#0: *13 connect() failed (111: Connection refused) while connecting to upstream, client: (my ip address), server: _, request: "GET /50x.html HTTP/1.1", upstream: "http://127.0.0.1:9007/50x.html", host: "domain.com"

Похоже, что он действительно пытается получить из приложения, а не рут. Как я могу обойти это?

Редактировать 2

Первоначально я думал, что нашел ответ, где было сделано изменение для nginx v1.0.12, но это не решило проблему. В нем была похожая ситуация, но я думаю, что исправление было слишком конкретным.

1 ответ

Решение

Вам не нужно задействовать бэкэнд (IE, не следует использовать прокси-пароль), поскольку ваша страница обслуживания должна быть статическим html-файлом, который Nginx может обслуживать напрямую.

Предполагая, что у вас есть настройки, настроенные как...

server {
    listen 80;
    server_name example.com;
    root /path/to/webroot;


    # Regular locations etc
    ...
}

Создайте папку с именем "503_status" и поместите туда свою страницу обслуживания с именем "503.html".

После этого создайте файл с именем "maintenance.default" в каталоге Nginx со следующим содержимым...

error_page 503 /503_status/503.html;

# Candidate for redirection if not ending with one of these extensions.
if ( $request_uri !~ \.(jpg|gif|png|css|js)$ ) {
     set $maint  "Tr";
}
# Candidate for redirection if not a request for the maintenance page 
if ( $request_uri !~ ^/maintenance/$ ) {
    set $maint  "${maint}ue";
}
# Redirect to a location where the status code will be issued 
if ( $maint = True ) {
    rewrite ^ /maintenance/ redirect;
}
# Due to Nginx quirk, issue the status code in a location context.
# Make "internal" to prevent direct browsing.
location /maintenance {
    internal;
    return 503;
}
# 503_status folder as "internal" so no direct browsing 
location 503_status {
    internal;
    alias /server/path/to/503_status/folder;
}

Всякий раз, когда вы вводите сайт в эксплуатацию, просто включите файл следующим образом...

server {
    listen 80;
    server_name example.com;
    root /path/to/webroot;

    include /server/path/to/maintenance.default;        

    # Regular locations etc
    ...
}

Это будет обслуживать вашу страницу обслуживания, а также любые ресурсы, которые ей нужны (просто убедитесь, что расширение находится в списке). Бэкэнд-сервер вообще не входит в игру.

Другие вопросы по тегам