nginx localização baseada no caminho uri

1

Eu tenho um domínio, chame-o example.com, com paths / test1 e / test2.

Solicitações de http example.com/test1 são enviadas para test1.example.com/test1.

Solicitações de http example.com/test2 são enviadas para test2.example.com/test2.

Esta configuração do nginx funcionou bem para meus requisitos até este ponto.

server {

  listen 80 default_server;
  root /usr/share/nginx/html;
  server_name localhost;
  index index.html;
  autoindex on;

  location /test1 {
    resolver ns1.example.com;
    resolver_timeout 5s;
    proxy_pass http://test1.example.com/test1;
    proxy_redirect default;
  }

  location /test2 {
    resolver ns1.example.com;
    resolver_timeout 5s;
    proxy_pass http://test2.example.com/test2;
    proxy_redirect default;
  }

}

Agora preciso alterar a configuração, se possível, para que as solicitações cheguem ao back-end apropriado sem serem adicionadas individualmente à configuração do nginx.

Usar sub-domínios em vez de caminho é uma opção de longo prazo, mas não é viável no momento devido a outras restrições.

Eu preferiria que a solução estivesse contida na configuração do nginx e não dependesse da manutenção de um banco de dados de nomes de host atuais do example.com, se possível.

Dados no caminho do uri após a primeira barra e antes do segundo (se existir) é o que eu preciso digitar.

Por exemplo: example.com/debug/index.html. debug seria analisado. A depuração pode ou não ser um nome de host válido no domínio example.com. Se não for válido (erro 404, 500 ou 502 .. talvez outros), em seguida, solte para uma página pega-tudo. Se for válido, direcione a solicitação para debug.example.com/debug/index.html.

Esta é minha primeira tentativa, mas não funciona (muitos erros de redirecionamentos e imagens / inclusões foram procurados no sistema de arquivos local, em vez de remotamente, embora o index.html básico seja encontrado / carregado).

Alguém sabe o que eu posso estar perdendo ou sabe de alternativas que me ajudarão a atingir meu objetivo?

server {

  listen 80 default_server;
  root /usr/share/nginx/html;
  server_name localhost;
  index index.html;
  autoindex on;

  set $frontend_fqdn "nil";
  set $namespace "nil";

  if ($request_uri ~ "^/([A-Za-z0-9-_]+).*$") {
    set $namespace "$1";
    set $frontend_fqdn "$namespace.example.com";
  }

  location / {
    resolver ns1.example.com;
    resolver_timeout 5s;
    error_page 404 500 502 = @fallback;

    if ($frontend_fqdn !~ "nil") {
      proxy_pass http://$frontend_fqdn$request_uri;
    }
    try_files $uri $uri/ =404;
  }

  location @fallback {
    rewrite ^(.*)$ $scheme://$host permanent;
  }

}

Agradeço antecipadamente por qualquer ajuda.

    
por user3694539 18.11.2015 / 05:58

1 resposta

0

Algo como isso deve funcionar:

server {

  listen 80 default_server;
  root /usr/share/nginx/html;
  server_name localhost;
  index index.html;
  autoindex on;

  location ~ ^/([^/]+) {
    try_files $uri $uri/ @proxy;
  }

  location @proxy {
    resolver ns1.example.com;
    resolver_timeout 5s;
    error_page 404 500 502 = @fallback;
    proxy_pass $scheme://$1.$host;
  }

  location @fallback {
    return 301 $scheme://$host;
  }

}

O primeiro bloco de localização corresponderá a todos os URIs e salvará o primeiro segmento do caminho em $ 1. Em seguida, ele tenta exibir um arquivo / pasta local correspondente, caso exista, caso contrário, ele tentará fazer proxy para um servidor, como você mencionou na sua pergunta, injetando o segmento do caminho como um subdomínio. Se isso falhar, ele redireciona para um local predeterminado.

    
por 18.11.2015 / 07:43

Tags