Обратный прокси-сервер Nginx хочет использовать виртуальный каталог для перенаправления

У меня, надеюсь, простой вопрос. Я запускаю Nginx и некоторые приложения в контейнерах Docker. Некоторые приложения работают на том же хосте, что и Nginx. Я могу получить доступ к приложению, используя, например, app.example.com, но я хочу получить доступ к тому же приложению, используя example.com/app. Я не могу понять, как определить блок сервера с помощью location /app. Я хотел бы добиться чего-то вроде:

server {
  listen       80;
  server_name  app.example.com;
  location / {
    proxy_pass app-srv:port;
  }
}
server {
  listen       80;
  server_name  example.com;
  location /app {
    What do I place here?
  }
}

Изменить: с дополнительной информацией.

Моя конфигурация сервера:

server {
  listen 80;
  server_name openhab.aronica-sys;
  location / {
    proxy_pass http://openhab:8081;
  }
}
server {
  listen 80;
  server_name aronica-sys;
  location /openhab/ {
    proxy_pass http://openhab:8081/;
  }
}

openhab в операторах proxy_pass — это виртуальный адрес Docker для сервера openHAB. 'openhab.aronica-sys' получает:

VM6:1 XHR finished loading: GET "http://openhab.aronica-sys/rest/ui/tiles".
VM6:1 XHR finished loading: GET "http://openhab.aronica-sys/rest/".
VM6:1 XHR finished loading: GET "http://openhab.aronica-sys/rest/habot/greet".
VM6:1 XHR finished loading: GET "http://openhab.aronica-sys/rest/ui/components/ui:widget".
VM6:1 XHR finished loading: GET "http://openhab.aronica-sys/rest/ui/components/ui:page".
VM6:1 XHR finished loading: GET "http://openhab.aronica-sys/rest/items?metadata=semantics,listWidget,widgetOrder".
VM6:1 XHR finished loading: POST "http://openhab.aronica-sys/rest/events/states/2e0eee99-770f-498b-bd9f-736777096c30".
VM6:1 XHR finished loading: POST "http://openhab.aronica-sys/rest/events/states/2e0eee99-770f-498b-bd9f-736777096c30".

aronica-sys/openhab получает:

VM6:1 GET http://aronica-sys/rest/ui/tiles 404 (Not Found)
VM6:1 GET http://aronica-sys/rest/ 404 (Not Found)
VM6:1 XHR failed loading: GET "http://aronica-sys/rest/ui/tiles".
aronica-sys/:1 Uncaught (in promise) Not Found
aronica-sys/:1 Uncaught (in promise) Not Found
VM6:1 XHR failed loading: GET "http://aronica-sys/rest/".

Я не знаю, как интерпретировать приведенную выше информацию и как действовать дальше.


person ArkansasStacker    schedule 07.01.2021    source источник


Ответы (1)


Вам понадобится что-то вроде:

server {
  listen       8080;
  server_name  app.example.com;
  location / {
    proxy_pass http://localhost:9090;
  }
}
server {
  listen       8080;
  server_name  example.com;
  location /app/ {
    proxy_pass http://localhost:9090/;
  }
}

Пожалуйста, будьте осторожны с косой чертой, используемой в локации и в прокси-пассе, они очень важны! Для объяснения косых черт вы можете проверить: https://stackoverflow.com/a/51225241/83037

Редактировать: с приведенной выше конфигурацией ваш фактический серверный процесс будет получать запрос без каких-либо изменений в хост-части. Если вы используете в браузере http://app.example.com/file.html сервер получит запрос на http://app.example.com/file.html ( тот же хост app.example.com). Если вы используете в браузере http://example.com/app/file.html сервер получит запрос на http://example.com/file.html (тот же пример хоста. com, другой путь).

Как правило, сервер может заботиться об имени хоста и/или может заботиться о пути, в приведенном выше примере, если он не заботится об имени хоста, он будет интерпретировать запрос как «дайте мне /file.html», но если он заботится об имени хоста, он будет настроен для работы только для набора имен хостов — сервер может отвечать или example.com, но не для app.example.com.

Судя по вашему добавлению, ваш сервер настроен отвечать только на одно конкретное имя хоста (он заботится об имени хоста). В этом случае вы можете заставить nginx переписать входящий запрос так, чтобы ваш сервер видел только одно имя хоста. Нравится, если вы используете в браузере http://example.com/app/file.html сервер получит запрос на http://app.example.com/file.html. (обратите внимание, что example.com изменился на app.example.com).

Конфигурация для этого:

server {
  listen       8080;
  server_name  app.example.com;
  location / {
    proxy_pass http://localhost:9090;
    proxy_set_header Host app.example.com;
  }
}
server {
  listen       8080;
  server_name  example.com;
  location /app/ {
    proxy_pass http://localhost:9090/;
    proxy_set_header Host app.example.com;
  }
}

ВНИМАНИЕ! Сервер по-прежнему может показывать вам ссылки на домен, на который он настроен. В вашем случае сервер может показать (или построить с помощью javascript) ссылку на http://openhab.aronica-sys/my_page.html. Если это проблема для вас, я бы предложил открыть еще один вопрос - этот вопрос касается виртуального каталога.

person vladmihaisima    schedule 07.01.2021
comment
Спасибо за вашу помощь, но это не сработало. Пожалуйста, смотрите мою следующую запись о том, что я пробовал. - person ArkansasStacker; 11.01.2021