Как маршрутизировать первый сегмент URI, используя NGINX в качестве обратного прокси? - PullRequest
1 голос
/ 21 апреля 2019

Я пытаюсь построить архитектуру / инфраструктуру на 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 и подпоследовательности: / 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 в местоположении, заданном регулярным выражением, или внутри именованного местоположения

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

1 Ответ

1 голос
/ 21 апреля 2019

Вы хотите использовать блок 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";
}
...