Estoy usando un servidor NGINX como proxy SSL para algunos otros servidores NGINX. Desafortunadamente, si un servidor ascendente redirige una solicitud, el campo de ubicación contiene el puerto de destino incorrecto.
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
< server: nginx
< date: Sun, 18 Mar 2018 20:01:44 GMT
< content-type: text/html
< content-length: 178
< location: 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; }
}
upstream myupstream {
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;
}
}
Servidor ascendente NGINX:
# NGINX Site: example.com
#########################
server {
# Server
listen [::1]:9101;
server_name example.com;
# Root
root /srv/www/example.com/staging;
# Disable Caching
sendfile off;
# Charset
charset utf-8;
# Default
location / {
index index.html;
try_files $uri $uri/ =404;
}
}
Ambas instancias de NGINX se ejecutan como procesos maestros separados en la misma máquina. Todo lo demás funciona perfectamente.
Pensé que NGINX Proxy reescribiría la respuesta ascendente para que se convirtiera http://example.com:9001/site/
a https://example.com/site/
.
¿Qué me olvidé?
Respuesta1
proxy_redirect default
no funcionará de la manera esperada porque está utilizando un upstream
bloque y nginx
no puede obtener la cadena requerida de la proxy_pass
declaración. Puedes especificarlo explícitamente con:
proxy_redirect http://example.com:9101/ /;
Vereste documentopara más.
Alternativamente, dígale a suservidor ascendentedejar de especificar un puerto en sus respuestas de redirección con:
port_in_redirect off;
Vereste documentopara más.