Passagem de proxy Nginx para proxy reverso
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
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 ).