Назад | Перейти на главную страницу

Локация Nginx блокирует взлом Meteor с помощью обратного прокси

У меня два сервера:

У меня есть два восходящих направления, по одному на каждом сервере:

upstream remote-app {
  server 123.45.67.890:8080;
}

upstream local-app {
  server localhost:7000;
}

Если я использую отдельные серверные блоки, все работает нормально.

server {
  listen 80;
  server_name local.* local.myapp.com;
  access_log /var/log/nginx/local.myapp.access.log;
  error_log /var/log/nginx/local.myapp.error.log debug;
  error_page 404 /4xx.html;
  error_page 500 502 503 504 /5xx.html;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://local-app;
    proxy_redirect off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

server {
  listen 80;
  server_name remote.* remote.myapp.com;
  access_log /var/log/nginx/remote.myapp.access.log trace;
  error_log /var/log/nginx/remote.myapp.error.log debug;
  error_page 404 /4xx.html;
  error_page 500 502 503 504 /5xx.html;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://remote-app;
    proxy_redirect off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    add_header Cache-Control no-cache;
  }
}

Но мне нужно выполнить условную маршрутизацию на основе пути, а не только поддомена. Поэтому я пытаюсь добавить блок местоположения, чтобы перенаправить часть локального трафика на удаленный сервер.

server {
  listen 80;
  server_name local.* local.myapp.com;
  access_log /var/log/nginx/local.myapp.access.log;
  error_log /var/log/nginx/local.myapp.error.log debug;
  error_page 404 /4xx.html;
  error_page 500 502 503 504 /5xx.html;

  location = /broken {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://remote-app;
    proxy_redirect off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://local-app;
    proxy_redirect off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

Теперь, когда я приезжаю http://local.myapp.com/broken, У меня пустой белый экран с кучей ошибок консоли:

В SyntaxError: Unexpected token < похоже, браузер пытается прочитать javascript из файла html.

Я не могу понять, как это отладить. я вижу readv() not ready (11: Resource temporarily unavailable) в журнале ошибок Nginx сервера A, но я не знаю, связано ли это. Я не знаю, как отследить запрос на сервере B, потому что развертывание находится в контейнере Docker. Какие-либо предложения?

После получения рекомендаций от @zodern, Я понял, что первоначальный запрос /broken обрабатывается правильно, но Meteor не обслуживает единый ответ со всеми js и css. Он обслуживает html-файл, который затем вызывает 90 других запросов обратно к серверу A. Блок местоположения, обрабатывающий все эти запросы, - это блок без модификаторов и корневого пути. /, который отправляет все в локальное восходящее приложение. Поэтому я не уверен, что можно будет запустить два разных приложения Meteor на разных серверах в зависимости от запрошенного пути. 😕