5 votes

Nginx Proxy/Upstream redirige vers le mauvais port et protocole

Je suis en train d'utiliser un serveur NGINX en tant que proxy ssl pour d'autres serveurs NGINX. Malheureusement, si une requête est redirigée par un serveur en amont, le champ de localisation contient le mauvais port de destination.

curl -v "https://example.com/site":

> GET /site HTTP/2
> Host: example.com
> User-Agent: curl/7.58.0
> Accept: */*
> 
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 301 
< serveur: nginx
< date: Sun, 18 Mar 2018 20:01:44 GMT
< type de contenu: text/html
< longueur du contenu: 178
< localisation: http://example.com:9101/site/
< strict-transport-security: max-age=15768000; includeSubDomains

Proxy NGINX:

# Proxy: example.com
####################

server {
  listen 0.0.0.0:80;
  listen [::]:80;
  server_name example.com;
  root /srv/www/_empty;
  location / { return 301 https://example.com$request_uri; }
}

amont monamont {
  server [::1]:9101;
}

server {
  listen 0.0.0.0:443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  root /srv/www/_empty;

  location / {

    proxy_set_header    Host                   $http_host;
    proxy_set_header    X-Real-IP              $remote_addr;
    proxy_set_header    X-Forwarded-For        $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto      $scheme;
    proxy_set_header    X-Frame-Options        "";
    proxy_set_header    X-Content-Type-Options "";
    proxy_pass          http://myupstream;
  }
}

Serveur en amont NGINX:

# Site NGINX: example.com
#########################

server {
  # Server
  listen [::1]:9101;
  server_name example.com;

  # Root
  root /srv/www/example.com/staging;

  # Désactiver le cache
  sendfile off;

  # Jeu de caractères
  charset utf-8;

  # Défaut
  location / {
    index index.html;
    try_files $uri $uri/ =404;
  }
}

Les deux instances NGINX tournent en tant que processus maître séparés sur la même machine. Tout le reste fonctionne parfaitement.

Je pensais que le proxy NGINX réécrirait la réponse de l'amont de sorte qu'il convertit http://example.com:9001/site/ en https://example.com/site/.

Qu'ai-je oublié?

3voto

HugoFS Points 313

proxy_redirect default ne fonctionnera pas comme vous vous y attendez car vous utilisez un bloc upstream et nginx ne peut pas obtenir la chaîne requise à partir de l'instruction proxy_pass. Vous pouvez le spécifier explicitement avec:

proxy_redirect http://example.com:9101/ /;

Voir ce document pour plus d'informations.


Alternativement, demandez à votre serveur amont d'arrêter de spécifier un port dans ses réponses de redirection avec:

port_in_redirect off;

Voir ce document pour plus d'informations.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X