Passer du proxy Nginx au proxy inverse
Je suis assez nouveau sur nginx et coincé avec la configuration actuelle.
J'ai également vérifié ssl - nginx redirige , nginx en tant que proxy pour l'application Web , nginx proxy_pass , réécriture du proxy nginx et un autre message lié à ma question .
J'ai également examiné d'autres articles qui ne m'ont pas aidé pour le moment. Je n'ai pas lu tous les quelque 21500 messages sur les sujets nginxet proxy.
Google a également échoué à me diriger vers la solution.
La configuration actuelle est:
[CMS (Plone in LAN)]<--->[Reverse-Proxy (Apache / http://oldsite.foo)]
Il s'agit de l'ancienne configuration du site. Fondamentalement, nous avons besoin d'une refonte du CMS. Mais il s'est développé avec de nombreuses dépendances et des modules auto-écrits par au moins deux développeurs (qui ne se sont jamais rencontrés). Ce ne sera qu'une tâche d'un an pour le faire remplacer correctement. Il y a aussi des choses étranges dans la configuration d'Apache, nous ne pouvons donc pas éviter d'utiliser Apache pour le moment.
Malheureusement, nous avons besoin d'une refonte optique dès que possible.
Nous avons donc eu l'idée d'utiliser Diazo / XSLT dans Nginx pour repenser l'ancien site Web et montrer à nos évaluateurs quelques résultats.
Par conséquent, j'essaye la configuration suivante:
[Plone]<--->[Apache]<--->[Proxy (XSLT in Nginx / https://newsite.foo)]
Voici mon xslt_for_oldsitefichier de configuration (Cache-Control uniquement désactivé pour le débogage):
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 je lance mon navigateur pour me connecter à http://oldsite.foo puis il charge:
- 1 document HTML de oldsite
- 3 fichiers CSS de oldsite
- 9 fichiers JS de oldsite
- 10 fichiers graphiques de oldsite
Mais si j'utilise mon navigateur pour obtenir https://newsite.foo puis il charge:
- 1 document HTML de newsite
- seulement 5 fichiers graphiques de oldsite (demande directe de mon navigateur)
- tout le reste manque
Alors que le document HTML reçu avec wget https://newsite.foo -o index.htmla tous les liens modifiés vers https://newsite.foo(remplaçant correctement http://oldsite.foopar https://newsite.foo), le navigateur affiche tous les liens non modifiés: http://oldsite.fooau lieu de https://newsite.foo.
J'obtiens l'en-tête de serveur suivant avec 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
J'ai joué avec le add_header, proxy_set_headeret proxy_redirect. J'ai essayé aussi
location ~* .* {
proxy_pass http://oldsite.foo$request_uri;
proxy_redirect off;
proxy_set_header Host $host;
}
mais aucun de mes changements n'a changé le comportement de nginx qui redirige les requêtes GET vers http://oldsite.foo et montre les réponses comme si elles venaient de https://newsite.foo .
Je n'ai pas de réponse à ces questions:
- Pourquoi mon navigateur continue de se connecter à http://oldsite.foo? Il devrait se connecter àhttps://newsite.foo .
- Pourquoi les liens dans le HTML sont-ils différents entre la version de
wgetet mon navigateur? - Pourquoi plus de la moitié du site Web n'atteint pas le navigateur https://newsite.foo?
- Comment puis-je réparer cela?
Y a-t-il quelqu'un qui puisse m'indiquer la bonne direction?
Merci d'avance. Au moins merci d'avoir lu mon post.
Meilleures salutations.
Réponses
En attendant, j'ai trouvé la solution.
Apache a envoyé les données gzippées et sub_filter n'a pas pu les gérer (voir la documentation officielle: sub_filter ).
En effet, j'ai essayé d'éviter cela en utilisant proxy_set_header Accept-Encoding "";mais cela n'a pas fonctionné. La raison en est que cette partie doit être définie dans un contexte de localisation .
Par conséquent, la configuration correcte pour Ubuntu 20.04 LTS, Nginx 1.14.0 au moment de la rédaction (2020-09-15) est:
...
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;
}
...
Merci à adrianTNT qui a souligné la partie cruciale pour moi (voir le détail manquant ).