Внутренняя страница ошибок Nginx при падении upstream-сервера

Внутренняя страница ошибок Nginx при падении upstream-сервера

Я новичок в Nginx и у меня есть обратный прокси-сервер к вышестоящему серверу Glassfish. Я пытаюсь настроить пользовательскую страницу 503 на случай, если приложение будет закрыто на техническое обслуживание. Мне не удается сделать это уже несколько часов. Страница maintenance.html содержит ссылку css и jpg. Они отображаются, когда меня перенаправляют на страницу технического обслуживания. Все, что я получаю, — это текст страницы и поврежденное изображение.

CentOS 6.5 nginx 1.4.4 (из репозитория nginx)

upstream glassfish {
server <upstream IP>:8181 max_fails=1;
}

server {
 listen       80;
 server_name  localhost;

#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;

error_page  404 502   /static/error.html;
error_page  503      /static/maintenance.html;

location ~ ^/static/ {
    internal;
}

 location / {
 proxy_set_header X-Real-IP  $remote_addr;
 proxy_set_header X-Forwarded-For $remote_addr;
 proxy_set_header Host $host;
 proxy_pass https://glassfish;
 port_in_redirect off;
 }
}

Ошибка, которая отображается в access.log, следующая:

[19/дек/2013:17:49:17 -0500] "GET /static/main.css HTTP/1.1" 404 1136 "http:/// [19/дек/2013:17:49:18 -0500] "GET /static/header-logo.jpg HTTP/1.1" 404 1136 "http:///

Я проверил, что /etc/nginx/html/static/header-logo.jpg существует

Я уверен, что это достаточно просто, но я просто не могу понять!

решение1

Недавно я хотел сделать то же самое (показать более красивую страницу обслуживания/ошибок с изображениями, CSS и пользовательскими шрифтами).

В итоге я применил такой внутренний блок местоположения:

server {

  error_page 502 = @maintenance;

  location @maintenance {
    root /path/to/maintenance-site;

    if (!-f $request_filename) {
      rewrite ^ /index.html break;
    }
  }
}

Я написалСообщение блогаоб этом, если вам нужны более подробные сведения (был недоступен, потому что я восстанавливал свою инфраструктуру, но теперь снова работает).

решение2

Вы говорите, что делаете это:

location ~ ^/static/ {
    internal;
}

Ключевое internalслово означает, что это locationвидно только для внутренних запросов, каковыми error_pageявляются ваши запросы.

Если вы хотите иметь возможность доступа /static/непосредственно из веб-браузера, что, по-видимому, необходимо для отображения изображений, на которые ссылаются страницы ошибок, то вам придется удалить директиву internalиз указанного файла location.

решение3

Я думаю, что наилучшим подходом будет сделать следующее:

  • Использоватьinline CSS
  • Конвертируйте ваши изображения вBase64

После этого вы можете встроить сгенерированную строку Base64 в background-imageправило CSS следующим образом:

background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEADI.....==)

<img>Вы также можете использовать строку с тегами, просто передайте ее srcатрибуту следующим образом:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEADI.....==" />

Таким образом вы сможете сохранить internalправило nginx.

Ваше здоровье!

Связанный контент