AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1050668
Accepted
Ice Drake
Ice Drake
Asked: 2021-01-22 03:18:30 +0800 CST2021-01-22 03:18:30 +0800 CST 2021-01-22 03:18:30 +0800 CST

HTTPS + proxy reverso Nginx + reescrita de URL

  • 772

Estou tentando direcionar todo o tráfego HTTPS para o servidor Nginx, onde ele lidará com todas as solicitações como solicitações HTTP para todos os servidores internos. Até agora, consigo fazer com que o modelo abaixo funcione para a maioria dos meus servidores.

server {
    listen 443 default ssl;
    ssl_certificate /etc/letencrypt/live/somesite.com/fullchain.pem;
    ssl_certificate_key /etc/letencrypt/live/somesite.com/privkey.pem;
    server_name somesite.com;

    location ^~ /Service {
      proxy_pass http://192.168.1.2;
    }

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

No entanto, estou restrito a sempre ter que combinar https://somesite.com/Service com http://192.168.1.2/Service para que o acima funcione.

Não posso ter https://somesite.com/Service para trabalhar com http://192.168.1.2/Hello .

Ou que não posso direcionar isso para outra porta como https://somesite.com/Service com http://192.168.1.2:3000 .

Por exemplo, quando alterei o acima para isso:

location /Service/ {
    proxy_pass http://192.168.1.2:80/;
}

location / {
    proxy_pass http://192.168.1.3;
}

Usando a seguinte configuração de registro:

log_format upstreamlog '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
access_log /var/log/nginx/access.log upstreamlog;

Este é o log que obtive:

[22/Jan/2021:09:56:28 +0000] 172.56.38.95 - - - somesite.com to: 192.168.1.2:80: GET /Service/ HTTP/1.1 upstream_response_time 0.004 msec 1611309388.445 request_time 0.004
[22/Jan/2021:09:56:28 +0000] 172.56.38.95 - - - somesite.com to: 192.168.1.2:80: GET /Service/js/default.cache.a331c8c3.js HTTP/1.1 upstream_response_time 0.000 msec 1611309388.547 request_time 0.002
[22/Jan/2021:09:56:28 +0000] 172.56.38.95 - - - somesite.com to: 192.168.1.2:80: GET /Service/favicon.ico HTTP/1.1 upstream_response_time 0.012 msec 1611309388.757 request_time 0.012
[22/Jan/2021:09:56:28 +0000] 172.56.38.95 - - - somesite.com to: 192.168.1.3:80: GET /api/v1/oauth.json?_=1611309389573 HTTP/1.1 upstream_response_time 0.016 msec 1611309388.771 request_time 0.017

Pode-se ver no log que as três primeiras buscas estão corretas. A quarta está errada. Nenhum outro pedido foi feito depois. Depois de rastrear um pouco mais, percebo que o 192.168.1.2 já tem um servidor Nginx rodando e processando páginas PHP usando FastCGI. Não sei se isso faz diferença ou não.

Então, tentei usar a reescrita em combinação com o que tenho acima, mas encontrei uma página não encontrada. Presumo que não parece funcionar para HTTPS, talvez? Assim, isso me levou a fazer a pergunta de como configurar o Nginx para reverter o proxy com reescrita de URL e HTTPS externamente.

rewrite nginx https reverse-proxy
  • 2 2 respostas
  • 1700 Views

2 respostas

  • Voted
  1. Best Answer
    Nikita Kipriyanov
    2021-01-23T00:10:31+08:002021-01-23T00:10:31+08:00

    Veja a documentação do NGINX , o primeiro exemplo é exatamente o que você está fazendo e está bem explicado:

    se você configurar um locationbloco com um caminho1 e um proxy_passcom um caminho2, você terminará com toda a "árvore de caminhos" sendo realocada de caminho1 para caminho2:

    server {
        ...
        server_name example.net;
        location /some/path/ {
            proxy_pass http://www.example.com/link/;
        }
    }
    

    se você acessar https://example.net/some/path/blah, ele fará um proxy para http://www.example.com/link/blah.

    A próxima ressalva é o que exatamente seu servidor de origem retorna. Pode emitir algum HTML, algum JS, algum CSS, e todos eles podem conter links HTTP(S); alguns deles são relativos , mas alguns não são. A consideração muito importante é que uma proxy_passdiretiva não instrui o Nginx a reescrever quaisquer links dentro de dados proxy. Se houver caminhos não relativos, eles permanecerão como estavam e o cliente os interpretará como instruções para ir "fora" do prefixo proxy.

    Como vemos em seu arquivo de log, o servidor web retorna algum código Javascript na solicitação 2:

    [22/Jan/2021:09:56:28 +0000] 172.56.38.95 - - - somesite.com to: 192.168.1.2:80: GET /Service/js/default.cache.a331c8c3.js HTTP/1.1 upstream_response_time 0.000 msec 1611309388.547 request_time 0.002
    

    Esse código provavelmente contém alguns caminhos não relativos, ou seja, tem um caminho começando com /api/. O cliente então faz um pedido de acordo com esse caminho, que está fora da árvore proxy (que é apenas /Service/por enquanto), vemos na linha 4:

    [22/Jan/2021:09:56:28 +0000] 172.56.38.95 - - - somesite.com to: 192.168.1.3:80: GET /api/v1/oauth.json?_=1611309389573 HTTP/1.1 upstream_response_time 0.016 msec 1611309388.771 request_time 0.017
    

    O Nginx, de acordo com sua configuração, proxies corretamente essa solicitação em outro lugar (ela é capturada com location /regra).

    Existem várias maneiras de contornar isso. Se você tiver apenas alguns prefixos usados ​​com caminhos não relativos e nada mais estiver usando-os, você pode apenas fazer proxy deles à medida que são retornados:

    # (inside a "server" block, above "location /" rule)
        location /api/ {
            proxy_pass http://www.example.com/api/;
        }
    

    Outra forma é instalar um filtro no Nginx usando um ngx_http_sub_module, o que alteraria o conteúdo servido , atualizando todos os URIs para a nova base.

    Por favor, tenha em mente que não pode haver uma maneira completamente à prova de balas de fazer isso. Os links podem aparecer não apenas em arquivos HTML, CSS e JS baseados em texto, mas também em arquivos binários proprietários. E não sabemos a priori quais links eles podem conter para proximá-los preventivamente. No passado recente, um Adobe Flash foi um exemplo desse formato binário. Ninguém sabe o que será inventado no futuro para expor o mesmo problema.

    • 1
  2. DubStep
    2021-01-22T07:05:28+08:002021-01-22T07:05:28+08:00

    Você está tentando usar proxy e reescrever. Eles precisam ser feitos em lugares separados embora. O proxy vai passar o mesmo caminho que recebe para o servidor de origem. Se você quiser reescrever para outro local, faça isso em seu servidor de origem para que ele saiba reescrever solicitações de /service para /hello. Caso contrário, você receberá um 404 porque o servidor de origem não terá ideia do que fazer com a solicitação de /service.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve