NGINX загружает DOM, но возвращает 502 для изображений и активов
Я создаю пользовательскую страницу размером 50x.html, но не могу загрузить ресурсы из моего usr/share/nginx/html
каталог. Я думаю, что проблема заключается в моих исходных настройках для обратного прокси-сервера для моего приложения. Как мне избавиться от upstream: "http://127.0.0.1:1234"
только при обслуживании моего статического файла nginx из usr/share/nginx/html
(то есть, когда обратный прокси-сервер не работает), но во всех других настройках используется восходящий канал (например, как моя конфигурация уже настроена прямо сейчас)?
Журнал ошибок Nginx:
2016/07/22 16:10:06 [error] 24000#0: *94 connect() failed (111: Connection refused) while connecting to upstream, client: <<client-ip-here>>, server: foo.com, request: "GET /img-1024.png HTTP/1.1", upstream: "http://127.0.0.1:1234/img-1024.png", host: "foo.com", referrer: "https://foo.com/logo.png"
nginx.conf:
upstream api {
server 127.0.0.1:1234;
}
...
error_page 501 502 503 /500.html;
location = /500.html {
root /usr/share/nginx/html;
}
...
Я пытался использовать try_files: try_files $uri $uri/
или в каком-то варианте безрезультатно.
Спасибо
2 ответа
Подход состоит в том, чтобы обслуживать статические файлы во внешнем интерфейсе и только через прокси, если они не существуют. Вы можете развернуть страницы ошибок и ресурсы на этом сервере. Избегайте конфликтов каталогов между интерфейсом и бэкэндом.
Например:
root /usr/share/nginx/html;
location / {
try_files $uri @proxy;
}
location @proxy {
proxy_pass http://api;
}
Смотрите этот документ для деталей.
Вы правы - nginx не может отличить запрос ресурсов страницы ошибок от обычных запросов.
Вы должны либо изменить ресурсы, чтобы использовать уникальный путь, по которому можно выполнить сопоставление местоположения (возможно, что-то вроде /500/logo.png
) или использовать внешнюю службу для размещения ресурсов (S3 и т. п.) и загрузить ее оттуда.
Для совпадения местоположения это будет выглядеть примерно так:
location /500 {
root /usr/share/nginx/html;
}