point212
@point212
сисадмин linux, программист php

m.domain.ru -> domain.ru/m на nginx (но с подковыркой)

Дано:
nginx на фронтэнде в качестве балансировщика.
jetty на бэкэнде.

Пользователи должны приходить на sub.domain.ru.
И в строке браузера должно везде оставаться sub.domain.ru.
Однако к jetty уже должны приходить запросы вида domain.ru/sub/

Пока что допёр до такой конфигурации.
Для domain.ru отправляем запрос на прямую на бэкэнд
А для m.domain.ru переписываем поле заголовка Host в domain.ru, а запрос отправляем к бэкэнду переписывая URI как /m/{запрос}

И вроде бы даже все работает. Но дело в том, что в приложении все URL к статике прописаны как /public/mobile. Соответственно при заходе на m.domain.ru они преобразовываются в mobile.ru/m/public/mobile, и сервер их не находит. Написал workaround, но что-то он не работает. Не пойму что я делаю не так.

Может быть есть вообще более изящное решение этой проблемы?

    server {
        listen       80;
        server_name  m.domain.ru;
        
        root           /path/to/jetty/webapps/;

        # все запросы к m.domain.ru переписываем отправляем к jetty как localhost:8080/m/, а поле заголовка Host переписываем на domain.ru 
        location / {
             proxy_pass              http://127.0.0.1:8080/m$request_uri;
             proxy_set_header        Host domain.ru;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_cache off;
             proxy_redirect off;
        
        }

        #но делаем исключение для статики
        location /public/mobile {
             proxy_pass              http://localhost:8080/;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host domain.ru;
             proxy_cache off;
             proxy_redirect off;

        }

    }

    server {
        listen       80;
        server_name  domain.ru;
        root           /path/to/jetty/webapps/;
        location / {
             proxy_pass                    http://localhost:8080/;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host $http_host;
             proxy_cache off;
             proxy_redirect off;
        }
    }

  • Вопрос задан
  • 3639 просмотров
Пригласить эксперта
Ответы на вопрос 3
AMar4enko
@AMar4enko
Не совсем понятно — по какому адресу эта статика правильно лежит? И правильно ли, что запросы к статике вы проксируете? Может напрямую энджиниксом отдавать?
Ответ написан
@Power
Вроде, правильно так (это для m.domain.ru):

location / {
  proxy_pass http://localhost:8080/m/;
  ...
}

location /public/mobile/ {
  proxy_pass http://localhost:8080;
  ...
}
Ответ написан
AMar4enko
@AMar4enko
Вам надо во втором сервере написать что-то вроде
location /m/public/mobile {
             proxy_pass                    http://localhost:8080/public/mobile/$uri;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host $http_host;
             proxy_cache off;
             proxy_redirect off;
}


Правда я не помню навскидку насчет $uri и /$uri — в каком-то из этих вариантов он выкинет из $uri location и в итоге у вас на бэкенд уйдет нужный запрос.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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