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