У меня два сервера:
У меня есть два восходящих направления, по одному на каждом сервере:
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 на разных серверах в зависимости от запрошенного пути. 😕