Paso de proxy Nginx a proxy inverso
Soy bastante nuevo en nginx y me quedo con la configuración actual.
También verifiqué ssl - nginx redirecciona , nginx como proxy para la aplicación web , nginx proxy_pass , nginx proxy rewrite y otra publicación relacionada con mi pregunta .
También miré otras publicaciones que no me ayudaron en este momento. No leí todas las aproximadamente 21500 publicaciones sobre los temas nginxy proxy.
Google tampoco me dirigió a la solución.
La configuración actual es:
[CMS (Plone in LAN)]<--->[Reverse-Proxy (Apache / http://oldsite.foo)]
Esta es la configuración del sitio anterior. Básicamente necesitamos un rediseño del CMS. Pero ha crecido con muchas dependencias y módulos autoescritos por al menos dos desarrolladores (que nunca se conocieron). Será una tarea de apenas un año reemplazarlo correctamente. También hay algunas cosas raras en la configuración de Apache, por lo que no podemos evitar usar Apache en este momento.
Desafortunadamente, necesitamos un rediseño óptico tan pronto como podamos.
Así que tuvimos la idea de usar Diazo / XSLT en Nginx para rediseñar el sitio web antiguo y mostrarles a nuestros evaluadores algunos resultados.
Por lo tanto, intento la siguiente configuración:
[Plone]<--->[Apache]<--->[Proxy (XSLT in Nginx / https://newsite.foo)]
Aquí está mi xslt_for_oldsitearchivo de configuración (Cache-Control solo está desactivado para depurar):
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;
}
}
Si inicio mi navegador para conectarme http://oldsite.foo luego carga:
- 1 documento HTML del sitio antiguo
- 3 archivos CSS del sitio antiguo
- 9 archivos JS del sitio antiguo
- 10 archivos gráficos de oldsite
Pero si uso mi navegador para obtener https://newsite.foo luego carga:
- 1 documento HTML del nuevo sitio
- solo 5 archivos gráficos del sitio antiguo (solicitud directa desde mi navegador)
- todo lo demás falta
Mientras que el documento HTML recibido con wget https://newsite.foo -o index.htmltiene todos los enlaces modificados https://newsite.foo(reemplazando correctamente http://oldsite.foocon https://newsite.foo), el navegador muestra todos los enlaces sin modificar: en http://oldsite.foolugar de https://newsite.foo.
Obtengo el siguiente encabezado del servidor con 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
Jugué con el add_header, proxy_set_headery proxy_redirect. Probé también
location ~* .* {
proxy_pass http://oldsite.foo$request_uri;
proxy_redirect off;
proxy_set_header Host $host;
}
pero ninguno de mis cambios cambió el comportamiento de nginx al que redirige las solicitudes GET a http://oldsite.foo y muestra las respuestas como si vinieran de https://newsite.foo .
No tengo respuesta a estas preguntas:
- Por qué mi navegador sigue conectándose a http://oldsite.foo? Debería conectarse ahttps://newsite.foo .
- ¿Por qué los enlaces en HTML son diferentes entre la versión de
wgety mi navegador? - ¿Por qué más de la mitad del sitio web no llega al navegador? https://newsite.foo?
- ¿Cómo puedo arreglar esto?
¿Hay alguien por ahí que pueda señalarme la dirección correcta?
Gracias por adelantado. Al menos gracias por leer mi publicación.
Atentamente.
Respuestas
Mientras tanto encontré la solución.
Apache envió los datos comprimidos con gzip y sub_filter no pudo manejarlos (consulte la documentación oficial: sub_filter ).
De hecho, traté de evitar esto usando proxy_set_header Accept-Encoding "";pero no funcionó. La razón es que esta parte debe configurarse en el contexto de la ubicación .
Por lo tanto, la configuración correcta para Ubuntu 20.04 LTS, Nginx 1.14.0 en el momento de escribir este artículo (2020-09-15) es:
...
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;
}
...
Gracias a adrianTNT que señaló la parte crucial para mí (ver el detalle que falta ).