Вопрос или проблема
Я пытаюсь интегрировать панели Grafana в веб-приложение. Использование URL-адресов grafana в веб-приложении завершалось ошибками CORS. После поиска на сайте сообщества Grafana я обнаружил, что Grafana не поддерживает это и предложил использовать обратный прокси для устранения CORS. Поэтому я добавил nginx. Я смог избавиться от ошибок CORS после добавления необходимой конфигурации в файл nginx.conf, но Grafana по-прежнему не загружается. Ниже приведена конфигурация и проблема, с которой я сталкиваюсь –
- Использую nginx-1.15.5 на Windows 10
Вот конфигурации на моем компьютере –
grafana custom.ini
http_port = 3000
domain = localhost
root_url = %(protocol)s://%(domain)s/grafana/
nginx.conf
worker_processes 1;
error_log logs/error.log debug;
events {
worker_connections 1024;
}
http {
server {
listen 80;
root C:\\installables\\nginx-1.15.5\\www;
index index.html index.htm;
server_name localhost;
location /grafana/ {
proxy_pass http://localhost:3000/;
rewrite ^/grafana/(.*) /$1 break;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' "*";
#add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers'
'Accept,
Authorization,
Cache-Control,
Content-Type,
DNT,
If-Modified-Since,
Keep-Alive,
Origin,
User-Agent,
X-Requested-With' always;
return 204;
}
add_header 'Access-Control-Allow-Origin' "*";
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers'
'Accept,
Authorization,
Cache-Control,
Content-Type,
DNT,
If-Modified-Since,
Keep-Alive,
Origin,
User-Agent,
X-Requested-With' always;
add_header 'Access-Control-Expose-Headers' 'Content-Type,Content-Length,Content-Range';
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
Приложение работает на
имеет следующий файл JSP с кодом для вызова Grafana и отображения ее в iframe.
<script language="javaScript">
$.ajax({
type: "GET",
url: "http://localhost/grafana/",
contentType: "application/json",
xhrFields: {
withCredentials: false
},
headers: {
// Установите здесь любые пользовательские заголовки.
},
success: function(data){
$("#monitoringframe").attr('srcdoc',data)
},
error : function(err) {
console.log('Ошибка!', err)
}
});
</script>
<iframe name="monitoringframe" id="monitoringframe" src="https://serverfault.com/questions/938619/about:blank" sandbox="allow-forms allow-popups allow-same-origin allow-scripts" width=100% height=600 border="0" frameborder="0" />
URL-адрес Grafana работает без проблем CORS, но не загружается при загрузке файлов javascript графана. Я не уверен, почему js-файлы не загружаются
который вызывает URL-адрес приложения. Они должны были быть вызваны с URL-адресом, например,
Следующие журналы из консоли разработчика Chrome
20:24:33.392 XHR завершил загрузку: OPTIONS "http://localhost/grafana/".
20:24:33.409 XHR завершил загрузку: GET "http://localhost/grafana/".
20:24:33.411 XHR завершил загрузку: OPTIONS "http://localhost/grafana/login".
20:24:33.449 XHR завершил загрузку: GET "http://localhost/grafana/login".
20:24:33.451 VM25370 about:srcdoc:281 GET http://localhost:9121/grafana/public/build/vendor.4ad1072db19f1dad74f5.js net::ERR_ABORTED 404 (Не найдено)
20:24:33.452 VM25370 about:srcdoc:269 GET http://localhost:9121/grafana/public/build/grafana.dark.css?v5.3.2+0d821d0 net::ERR_ABORTED 404 (Не найдено)
20:24:33.456 VM25370 about:srcdoc:281 GET http://localhost:9121/grafana/public/build/app.4ad1072db19f1dad74f5.js net::ERR_ABORTED 404 (Не найдено)
Мне нужна ваша помощь, чтобы понять, что здесь не так и как это сделать.
Это сработало для меня после нескольких изменений. Первое из них было самым важным и помогло решить эту проблему.
-
Расположите веб-приложение также за прокси. Ранее я входил в веб-приложение, используя номер порта, а затем после загрузки страницы мониторинга оно пыталось загрузить grafana в iframe, используя обратный прокси. Я провел много отладки и попыток изменений конфигурации ngnix, чтобы это сработало, и затем подумал о добавлении правила перезаписи, чтобы отправить запрос в grafana. И для этого мне нужно было разместить приложение за обратным прокси тоже. Но это одно изменение сделало разницу, и не было необходимости добавлять никакое правило перезаписи. Ниже приведен измененный файл nginx.conf
worker_processes 1;
#error_log logs/error.log debug;
events {
worker_connections 1024;
}
http {
server {
listen 80;root C:\\installables\\nginx-1.15.5\\www; index index.html index.htm; server_name localhost; location /grafana/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header 'Access-Control-Allow-Origin' $http_origin; add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; add_header 'Access-Control-Expose-Headers' 'Content-Type,Content-Length,Content-Range'; add_header 'Access-Control-Allow-Headers' 'Accept, Authorization, Cache-Control, Content-Type, DNT, If-Modified-Since, Keep-Alive, Origin, User-Agent, X-Requested-With' always; if ($request_method = 'OPTIONS') { return 204; } proxy_pass http://localhost:3000/; } location / { proxy_pass http://localhost:9121/; } }
}
-
Мне пришлось исправить ошибочную функцию, чтобы загрузить содержимое ответа в iframe. Вот это конкретное измененное изменение.
success: function(data){ var iframeDoc = $("#monitoringframe").get(0).contentDocument; iframeDoc.open(); iframeDoc.write(data); iframeDoc.close(); }
.
Ответ или решение
Проблема загрузки JavaScript файлов Grafana при использовании NGINX в качестве обратного прокси
Ситуация, с которой вы столкнулись, касается правильной настройки NGINX для обхода проблем с CORS (Cross-Origin Resource Sharing) и успешной загрузки JavaScript файлов Grafana через вашу веб-приложение. Давайте разберёмся с проблемой более подробно.
1. Проблема CORS и Reverse Proxy
Вы правильно заметили, что прямые запросы к Grafana могут вызывать ошибки CORS, т.к. они исходят из другого домена или порта. Использование NGINX как обратного прокси действительно может помочь решить эту проблему. Ваша первоначальная настройка NGINX была близка к правильной, но, к сожалению, в ней недоставало некоторых важных аспектов, что и вызывало ошибки при загрузке файлов.
Ваша первая конфигурация NGINX:
location /grafana/ {
proxy_pass http://localhost:3000/;
rewrite ^/grafana/(.*) /$1 break;
...
}
Проблема:
Вы используете rewrite
, что может нарушать пути к статическим файлам, таким как JavaScript и CSS, которые находятся в /grafana/public/build/
.
2. Решение через полное проксирование приложения
Ваше решение по добавлению веб-приложения за прокси также является правильным шагом. Это означает, что и Grafana, и основное веб-приложение теперь обрабатываются через один и тот же сервер, что предотвращает конфликты CORS.
Модифицированная конфигурация NGINX:
location /grafana/ {
proxy_pass http://localhost:3000/;
}
location / {
proxy_pass http://localhost:9121/;
}
Такой подход устраняет необходимость переписывания URL и позволяет всем запросам обрабатываться корректно.
3. Код для загрузки графиков в iframe
Ваш второй шаг по изменению кода JavaScript для загрузки содержимого в iframe выглядит следующим образом:
success: function(data) {
var iframeDoc = $("#monitoringframe").get(0).contentDocument;
iframeDoc.open();
iframeDoc.write(data);
iframeDoc.close();
}
Объяснение:
Изменения позволяют корректно открывать iframe и записывать в него HTML-код, полученный от сервера. Это необходимо для обеспечения того, чтобы содержимое корректно рендерилось.
Заключение
Таким образом, ваша проблема с загрузкой JavaScript файлов Grafana была решена за счет:
- Устранения CORS проблем за счёт интеграции как Grafana, так и вашего веб-приложения под единый прокси NGINX.
- Корректной обработки загрузки содержимого в iframe с помощью JavaScript.
Настоятельно рекомендую протестировать вашу обновленную конфигурацию и код на различных браузерах, чтобы убедиться в отсутствии других потенциальных проблем. Если проблема будет повторяться, рекомендуем проверить логи NGINX для выявления возможных ошибок.
Если у вас возникнут дополнительные вопросы или потребуются разъяснения по конкретным аспектам, пожалуйста, не стесняйтесь обращаться за помощью!