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

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

  • (A) Обратный прокси Nginx, который направляет запросы внутренне или к B
  • (B) Развертывание метеора с использованием meteor-up версии 1.2.11 (Nginx внутри Docker)

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

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 сервера А, но я не знаю, связано ли это. Я не знаю, как отследить запрос на сервере B, потому что развертывание находится в контейнере Docker. Какие-либо предложения?

1 ответ

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

Другие вопросы по тегам