Как перенаправить первый сегмент URI, используя NGINX в качестве обратного прокси?

Я пытаюсь построить архитектуру/инфраструктуру на Amazon Web Services. Сегодня у меня есть EC2, работающий как шлюз, с NGINX в фоновом режиме. Кстати, я новичок в NGINX.

На прошлой неделе у меня был этот файл конфигурации NGINX:

server {
    listen 80;

    # I put * for hide the real domain name
    server_name ******.com.ar www.******.com.ar;

    location / {
         proxy_set_header   X-Forwarded-For $remote_addr;
         proxy_set_header   Host $http_host;
         proxy_pass         "http://private.ip.1:80/";
    }
}

И это сработало отлично! Когда я захожу на www.domain.com.ar, я получаю перенаправление на частный IP 1 через порт 80.

Но сейчас мне нужно немного изменить файл конфигурации.

1) Во-первых, мне нужно перенаправить некоторые известные пути на частный IP-адрес 1 (например, /company, /portfolio, /services, /contact и subsequences: /company/ourvision, /services/software, /contact/workwithus). Я использую NodeJS, а не PHP.

2) И если ни один из предыдущих путей не совпадает, мне нужно получить первый сегмент URI в качестве подстановочного знака (например, http://domain.com.ar/*) соответствует только этим символам: A-z0-9 и отправляет на частный ip 2 на порт 3000, также мне нужно отправить подстановочное слово тоже (например, http://private.ip.2:3000/wildcard-word)

Я только пытался добиться успеха по второму пункту, но не мог с этим справиться.

server {
    listen 80;
    server_name ******.com.ar www.******.com.ar;

    location / {
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass         "http://private.ip.1:80/";
    }

    location ~ ^/(.*)/?$ { 
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass         "http://private.ip.2:3000/$1";
    }
}

Но это не работает. Когда я захожу на http://example.com.ar, я иду прямо на частный IP 2 на порту 3000 Кстати, в другом случае я получаю следующую ошибку, когда использую команду nginx -t: «proxy_pass» не может иметь часть URI в расположении, заданном регулярным выражением, или внутри именованного местоположения< /эм>

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


person Alexander Vari    schedule 21.04.2019    source источник
comment
Когда вы говорите первый сегмент URI, вы имеете в виду, что такой URI, как /foo/bar, должен быть отправлен на *.2:3000/foo (с полностью удаленным /bar/)?   -  person Richard Smith    schedule 21.04.2019
comment
Привет @Ричард. Нет, я хочу сделать следующее: когда я иду по пути вроде /company или /company/workwithus, NGINX должен перенаправить меня на ip1:80/company (или ip1:80/company/workwithus, как угодно)... но когда я иду по пути вроде /other_word (подстановочное слово, не объявленное в конфигурационном файле NGINX) Мне нужно сделать редирект на ip2:3000/other_word... Теперь вы меня поняли? Спасибо, бро!   -  person Alexander Vari    schedule 21.04.2019


Ответы (1)


Вы хотите использовать блок location / { ... } в качестве подстановочного знака, поскольку он соответствует любому URI, который не будет соответствовать другому блоку location.

Вам не нужен компонент URI в операторе proxy_pass, так как вы не изменяете URI перед отправкой вверх по течению. Подробнее см. в этом документе.

Вы можете сэкономить на наборе текста, указав операторы proxy_set_header во внешнем блоке и разрешив их наследование обоими блоками location. Подробнее см. в этом документе.

Например:

proxy_set_header   X-Forwarded-For $remote_addr;
proxy_set_header   Host $http_host;

location ~ ^/(company|portfolio|services|contact|)(/|$) {
    proxy_pass         "http://private.ip.1:80";
}

location / {
    proxy_pass         "http://private.ip.2:3000";
}
person Richard Smith    schedule 21.04.2019
comment
Это верно! Спасибо за простую настройку! Работает как шарм. Есть только одна вещь, которая плоха в этой конфигурации, и это основной путь к веб-сайту. Я имею в виду, что когда я перехожу к http://example.com.ar/, мне также нужно сделать proxy_pass для ip1:80. С этим конфигом, когда я захожу в веб, я захожу сразу на ip2:3000, не ставя слово после слэша. - person Alexander Vari; 22.04.2019
comment
Можете ли вы прислать мне ссылку на документы, чтобы понять, как вы строите эту часть? ^/(company|portfolio|services|contact)(/|$). Заранее спасибо! - person Alexander Vari; 22.04.2019
comment
Я отредактировал ответ, добавив / в регулярное выражение. Вы можете использовать этот веб-сайт, чтобы разобраться в регулярных выражениях. - person Richard Smith; 22.04.2019