Passagem de proxy Nginx para proxy reverso

Sep 11 2020

Sou bastante novo no nginx e estou preso à configuração atual.

Eu também verifiquei ssl - nginx redireciona , nginx como proxy para aplicativo web , nginx proxy_pass , nginx proxy rewrite e outro post relacionado à minha pergunta .

Eu também olhei para alguns outros posts que não me ajudaram agora. Não li todas as cerca de 21.500 postagens sobre os tópicos nginxe proxy.

O Google também falhou em me direcionar para a solução.

A configuração atual é:

[CMS (Plone in LAN)]<--->[Reverse-Proxy (Apache / http://oldsite.foo)]

Esta é a configuração do site antigo. Basicamente, precisamos de um redesenho do CMS. Mas cresceu com muitas dependências e módulos escritos por pelo menos dois desenvolvedores (que nunca se conheceram). Será uma tarefa por apenas um ano substituí-lo adequadamente. Há também algumas coisas estranhas na configuração do Apache, então não podemos evitar o uso do Apache no momento.

Infelizmente, precisamos de um redesenho óptico o mais rápido possível.

Então, tivemos a ideia de usar o Diazo / XSLT no Nginx para redesenhar o antigo site e mostrar aos nossos avaliadores alguns resultados.

Portanto, tento a seguinte configuração:

[Plone]<--->[Apache]<--->[Proxy (XSLT in Nginx / https://newsite.foo)]

Aqui está o meu xslt_for_oldsitearquivo de configuração (Cache-Control desativado apenas para depuração):

add_header Cache-Control no-cache;

server {
  server_name newsite.foo;
  server_tokens off;

  listen b.b.b.b:80;

  return 301 https://$server_name$request_uri;

  access_log /var/log/nginx/newsite.port80.access.log;
  error_log /var/log/nginx/newsite.port80.error.log;
}

server {
  server_name newsite.foo;
  server_tokens off;

  listen b.b.b.b:443 ssl;

  access_log /var/log/nginx/newsite.port443.access.log;
  error_log /var/log/nginx/newsite.port443.error.log;

  ssl_certificate /etc/ssl/certs/nginx.crt;
  ssl_certificate_key /etc/ssl/private/nginx.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!aNULL:!MD5:!ADH:!AECDH;
  ssl_session_cache shared:SSL:5m;

  proxy_http_version 1.1;

  #proxy_set_header X-Forwarded-Host $host:$server_port;
  #proxy_set_header X-Forwarded-Server $host; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#  proxy_set_header Connection "";
#  proxy_ignore_headers Expires;

#  proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-forwarded-host $host;

  sub_filter_types *;
  sub_filter_once off;
  sub_filter "http://oldsite.foo" "https://newsite.foo";

  location / {
    proxy_pass http://oldsite.foo/;
    proxy_redirect off;
    #proxy_redirect http://oldsite.foo/ https://newsite.foo/;
    proxy_set_header Host $host;
  }
}

Se eu iniciar meu navegador para me conectar a http://oldsite.foo então carrega:

  • 1 documento HTML do site antigo
  • 3 arquivos CSS do site antigo
  • 9 arquivos JS do site antigo
  • 10 arquivos gráficos do site antigo

Mas se eu usar meu navegador para obter https://newsite.foo então carrega:

  • 1 documento HTML do site de notícias
  • apenas 5 arquivos gráficos do site antigo (solicitação direta do meu navegador)
  • tudo mais está faltando

Embora o documento HTML recebido com wget https://newsite.foo -o index.htmltenha todos os links modificados para https://newsite.foo(substituindo corretamente http://oldsite.foocom https://newsite.foo), o navegador mostra todos os links não modificados: em http://oldsite.foovez de https://newsite.foo.

Eu obtenho o seguinte cabeçalho de servidor com curl -I https://newsite.foo:

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 11 Sep 2020 10:28:15 GMT
Content-Type: text/html
Connection: keep-alive
Accept-Ranges: none
Accept-Ranges: bytes
X-Varnish: 1216306480
Age: 0
Via: 1.1 varnish
Set-Cookie: I18N_LANGUAGE="de"; Path=/
Via: 1.1 oldsite.foo
Vary: Accept-Encoding
Cache-Control: no-cache

Eu brinquei com o add_header, proxy_set_headere proxy_redirect. Eu tentei também

location ~* .* {
  proxy_pass http://oldsite.foo$request_uri;
  proxy_redirect off;
  proxy_set_header Host $host;
}

mas nenhuma das minhas mudanças mudou o comportamento do nginx que redireciona as solicitações GET para http://oldsite.foo e mostra as respostas como se viessem de https://newsite.foo .

Não tenho resposta para estas perguntas:

  • Por que meu navegador continua se conectando a http://oldsite.foo? Deve se conectar ahttps://newsite.foo .
  • Por que os links no HTML são diferentes entre a versão de wgete meu navegador?
  • Por que mais da metade do site não chega ao navegador https://newsite.foo?
  • Como posso consertar isso?

Há alguém aí que pode me apontar a direção certa?

Desde já, obrigado. Pelo menos obrigado por ler meu post.

Cumprimentos.

Respostas

choogeoh Sep 15 2020 at 13:11

Enquanto isso, encontrei a solução.

O Apache enviou os dados compactados e sub_filter não conseguiu lidar com isso (veja a documentação oficial: sub_filter ).

Na verdade, tentei evitar isso usando, proxy_set_header Accept-Encoding "";mas não funcionou. O motivo é que essa parte deve ser definida no contexto do local .

Portanto, a configuração correta para Ubuntu 20.04 LTS, Nginx 1.14.0 no momento da escrita (2020-09-15) é:

...
server {
  server_name newsite.foo;
  server_tokens off;
  
  listen b.b.b.b:443 ssl;

  access_log /var/log/nginx/newsite.port443.access.log;
  error_log /var/log/nginx/newsite.port443.error.log;

  ssl_certificate /etc/ssl/certs/nginx.crt;
  ssl_certificate_key /etc/ssl/private/nginx.key;

  # Double check and modify this part BEFORE using in production:
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!aNULL:!MD5:!ADH:!AECDH;
  ssl_session_cache shared:SSL:5m;

location / {
  proxy_http_version 1.1;
  proxy_set_header Accept-Encoding "";  # MUST be written HERE in this context!
  proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr;
  proxy_pass http://oldsite.foo;
  proxy_redirect off;
  sub_filter_types text/html text/css text/javascript;  # If unsure you may use '*'
  sub_filter_once off;
  sub_filter http://oldsite.foo https://newsite.foo;
}
...

Obrigado a adrianTNT que apontou a parte crucial para mim (veja o detalhe que falta ).