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

Nginx dynamic proxy_pass не разрешается должным образом

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

Я зарегистрировал домен, допустим - www.example.com. Я настроил все на сайте регистраторов, пинг www.example.com и www. *. Example.com прошел успешно.

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

Вот моя конфигурация 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 в моем браузере.

Если, однако, я изменил регулярное выражение в настройке 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. Я изменил регулярное выражение, все такое же.

  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

Редактировать://

Большое спасибо Ксавье! Помогло добавление следующих двух строк:

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

2 Еще вопросы:

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

Еще раз большое спасибо! У меня ушла неделя, чтобы понять это!

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

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

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

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

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

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

    proxy_set_header "Host" $host;

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

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

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