Nginx динамический proxy_pass не решает правильно

У меня есть проблемы при конфигурировании nginx, я искал сеть решения, и у меня есть некоторые остатки, но я все еще не могу придумать надлежащую конфигурацию.

Я зарегистрировал домен, скажем, - www.example.com. Я настроил все на сайте регистраторов, проверив с помощью ping-запросов www.example.com, и www.*.example.com успешно выполняется.

У меня есть Tomcat Apache, работающий на моей машине, слушающей на порте 8080. Я хочу настроить динамический proxy_pass. Таким образом, если у меня есть приложение MyApp, работающий у кота и достижимый через localhost:8080/MyApp, я хочу смочь достигнуть его с www.MyApp.example.com, таким образом, в основном субдомен был бы названием приложения у кота.

Вот моя конфигурация nginx:

server {
  server_name ~^(www\.)?(?<sub_domain>.+)\.example\.com$;
  listen 80;

  location / {
     proxy_pass http://localhost:8080/$sub_domain/;
  }
}

Когда я перехожу к www.myapp.example.com, я перенаправляюсь к http://localhost:8080/myapp - Я подразумеваю, что буквально заканчиваю с http://localhost:8080/myapp в моем браузере.

Если однако я изменяю regex в установке nginx к:

server {
      server_name www.myapp.example.com myapp.example.com
      listen 80;

      location / {
         proxy_pass http://localhost:8080/myapp/;
      }
    }

Затем все работает как очарование. Я знаю, что это должно сделать что-то с сопоставителем, я уже попытался поместить сопоставитель в nginx, но это ничего не изменяет.

Что я пропускаю здесь?

//редактирование:

Вот моя конфигурация. Я все еще становлюсь перенаправленным на www.myapp.example.com/myapp/login вместо www.myapp.example.com/login. Я изменил regex, тем не менее то же.

  http {

    upstream backend {

             server 127.0.0.1:8080;

    }

    server {                                                         
          server_name ~^(www\.)?(?<sub_domain>.+)\.example\.com$;
          listen 80;                                                        


           location / {
               proxy_set_header "Host" $host;
               proxy_pass http://backend/prefix-$sub_domain/;

               proxy_redirect http://$host/prefix-$sub_domain/ http://$host;

           }

    }

завихрение:

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /prefix-myapp/ HTTP/1.1
> User-Agent: curl/7.35.0
> Accept: */*
> Host: www.myapp.example.com
>
< HTTP/1.1 302 Found
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=E609EB96D8F27FD6F4E7F9ED9ACA5245; Path=/prefix-myapp/; HttpOnly
< Location: http://www.myapp.example.com/prefix-myapp/login;jsessionid=E609EB96D8F27FD6F4E7F9ED9ACA5245
< Content-Length: 0
< Date: Tue, 21 Oct 2014 16:48:05 GMT
<
* Connection #0 to host 127.0.0.1 left intact

Править://

Большое спасибо Xavier! Добавление после двух строк помогло:

proxy_pass http://backend/prefix-$domain$request_uri;
proxy_redirect http://$host/prefix-$domain http://$host;

Еще 2 вопроса, хотя:

  1. Эта конфигурация оказывает большое влияние на производительность?
  2. Я могу отфильтровать что-то от $request_uri (например, JSESSIONID=1233....)?

Снова, большое спасибо! Мне потребовалась неделя для понимания этого!

6
задан 22 October 2014 в 13:49
1 ответ

Когда вы используете переменные в директиве proxy_pass , nginx будет использовать разрешение времени выполнения, кроме случаев, когда:

  • целевой сервер объявлен как IP-адрес
  • имя целевого сервера является частью вышестоящей группы серверов
  • , имя целевого сервера уже было разрешено (например, оно совпадает с именем сервера в другом блоке сервера)

В этом случае распознаватель времени выполнения не поможет, так как localhost может не быть разрешается DNS. Также бесполезно иметь разрешение времени выполнения, поскольку здесь вы можете явно избежать этого.

Итак, два простых решения:

Теперь вам нужно, чтобы перенаправление вашего прокси-сервера было правильным. Итак, либо:

  • ваша цель прокси обрабатывает заголовок хоста, и вы передаете его с помощью:

    proxy_set_header "Host" $ host;

  • ваша цель прокси не может обрабатывать заголовок Host для перенаправления, и вам нужно переписать их с nginx, используя:

    proxy_redirect http: // $ proxy_host / $ sub_domain http: // $ host;

Однако, если он вообще не поддерживает заголовок Host, ссылки будут повреждены.

7
ответ дан 3 December 2019 в 00:25

Теги

Похожие вопросы