Использование Nginx для перенаправления на хост Dynami c - PullRequest
0 голосов
/ 23 февраля 2020

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

У меня есть динамический c набор серверов / имен хостов (из-за использования docker), скажем, service2, service3, service5. Я просто хочу настроить nginx для прокси к ним на основе URL. Цель этого состоит в том, чтобы я мог получить доступ к службам из одной конечной точки, а не выставлять их всех.

Это тип прокси, который я пытаюсь заставить работать

Если я укажу все конечные точки, это будет работать, хотя все еще только для начальной страницы, поэтому http://localhost: 8009 / service2 сделать прокси для http://service2/ однако http://localhost: 8009 / service2 / home просто не удается, но это может быть из-за того, что он не соответствует местоположению. Если, если я просто сделаю определение местоположения / оно работает, то я могу только отменить прокси-запросы на все запросы к одному серверу.

server {
listen       80;
server_name  localhost;

    location /service2 {
        proxy_pass http://service2/;
    }

    location /service5 {
        proxy_pass http://service5/;
    }
}

Вот, пожалуй, мой лучший пример переопределения URL-адреса для Dynami c, но это просто ошибки, поэтому предположим, что это не верно для nginx.

server {
listen       80;
server_name  localhost;

    location ~ (?<myhost>.*)/(?<myuri>.*)$ {
        proxy_pass http://$myhost/$myuri;
    }
}

1 Ответ

1 голос
/ 23 февраля 2020

Регулярное выражение, которое вы используете, не является правильным. вы можете добиться того, что вы пытаетесь сделать, следующим образом

 location ~ /(?<myhost>[^/]+)(/(?<myuri>.*))? {
      return 301 http://$myhost:80/$myuri?$query_string;
    }
➜  ~   curl --head http://127.0.0.1:32769/service1
HTTP/1.1 301 Moved Permanently
Server: nginx/1.17.8
Date: Sun, 23 Feb 2020 20:06:29 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://service1:80/?

➜  ~   curl --head http://127.0.0.1:32769/service1/test
HTTP/1.1 301 Moved Permanently
Server: nginx/1.17.8
Date: Sun, 23 Feb 2020 20:08:43 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://service1:80/test?

➜  ~   curl --head http://127.0.0.1:32769/service1/test?x=100
HTTP/1.1 301 Moved Permanently
Server: nginx/1.17.8
Date: Sun, 23 Feb 2020 20:08:53 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://service1:80/test?x=100

для proxy_pass вам не нужно включать URI или строки запроса, вы можете сделать это следующим образом

server {
    listen       80  default_server;
    server_name  _;

    location ~ /(?<myhost>[^/]+) {
        resolver 127.0.0.11 ipv6=off;

        set $target http://$myhost:80;

        proxy_set_header Host $myhost;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass $target;
    }
}
...