Я новичок в 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.
Ваше здоровье!