Proxy http reverso parcial usando nginx

1

Eu tenho vários serviços HTTP em execução na mesma máquina, em portas diferentes. Gostaria de usar o nginx como um proxy reverso, mas parece que não consigo configurar minha configuração corretamente.

Eu gostaria do seguinte:

  • /fossil/ == > %código%
  • http://127.0.0.1:8080/fossil/index.php == > %código%
  • /fossil/(whatever) == > %código%
  • mais alguns locais específicos a serem servidos pelo próprio nginx
  • e tudo mais para ser manipulado pelo Apache == > %código%

São os dois primeiros que parecem causar problemas; Eu quero que tudo sob http://127.0.0.1:8080/(whatever) seja manipulado por fóssil, na porta 8080; exceto a própria raiz, essa deve ser manipulada por uma página especial do PHP (sob o Apache).

Qual seria o caminho a seguir aqui?

    
por Martijn 19.04.2011 / 22:13

2 respostas

1

Experimente a configuração abaixo.

Não deixe de ver os comentários na seção location = /fossil/ . Também tenha em mente que os pedidos para / fossil / (whatever) se tornam / (whatever), portanto, quaisquer urls retornados em seu conteúdo devem ser / fossil / (whatever) e not / (whatever). Se necessário, você pode usar o sub_filter no lado nginx para substituir / fossil / (whatever) por / (whatever) quando o conteúdo for retornar ao cliente.

location = /fossil/ {
  # matches /fossil/ query only
  #
  # if Apache isn't configured to serve index.php as the index
  # for /fossil/ uncomment the below rewrite and remove or comment
  # the proxy_pass
  #
  # rewrite /fossil/ /fossil/index.php;
  proxy_pass http://127.0.0.1:8080;
}

location = /fossil/index.php {
  # matches /fossil/index.php query only
   proxy_pass http://127.0.0.1:8080;
}

location /fossil/ {
  # matches any query beginning with /fossil/
  proxy_pass http://127.0.0.1:8080/;
}

location /webmin/ {
  # matches any query beginning with /webmin/
  proxy_pass http://127.0.0.1:10000/;
}

location / {
  # matches any query, since all queries begin with /, but regular
  # expressions and any longer conventional blocks will be
  # matched first.
  proxy_pass http://127.0.0.1:8001;
}

# locations to be handled by nginx go below
    
por 20.04.2011 / 03:55
1

Isso é bastante simples com dois tipos de localização estática. location = é uma correspondência exata e a localização / localização é uma correspondência de prefixo. link

server {
  server_name www.example.com;

  # Set defaults for the proxy_pass directives in each location
  # Add the client IP
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  # Pass through the request hostname
  proxy_set_header Host $host;

  # Everything that doesn't match a more specific location
  location / {
    proxy_pass http://127.0.0.1:8001;
  }

  location = /fossil/ {
    proxy_pass http://127.0.0.1:8080/fossil/index.php;
  }

  location /fossil/ {
    # Do you really want to strip off /fossil here but not above?
    # The trailing / replaces /fossil/ with /
    proxy_pass http://127.0.0.1:8080/;
  }

  location /webmin/ {
    proxy_pass http://127.0.0.1:10000/;
  }

  .. add your other locations ...
}
    
por 20.04.2011 / 03:19