
He estado lidiando con este escenario por un tiempo y no puedo encontrar el error o la configuración que me lleva a esto: tengo un dominio ejemplo.com y varios subdominios (app.example.com, test.example.com, etc.) Los puertos 80 y 443 apuntan al servicio Nginx de una máquina virtual (IP 10.10.10.10). También tengo una máquina virtual con Windows Server que sirve los puertos IIS 80 y 443 (este servidor web example.com/_/login?returnurl= funciona bien si enruta el puerto del enrutador a esta máquina virtual (todas estas máquinas virtuales están en una infraestructura de nube), entonces IIS funciona bien.
Por otro lado, tengo una aplicación web que funciona en un servidor web Apache en una VM diferente (IP 10.10.10.11) con SSL (instalado con certbot) en un subdominio app.example.com.
También funciona bien pasando por el proxy inverso de Nginx. Este es el archivo de configuración para ese servidor:
server {
server_name app.example.com.ar www.app.example.com.ar;
location / {
proxy_pass http://10.10.10.2/;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/app.example.com.ar/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/app.example.com.ar/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = app.example.com.ar) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name app.example.com.ar www.app.example.com.ar;
return 404; # managed by Certbot
}
Aquí es cuando las cosas se complican:
Si intenta obtener http example.com (que sirve a iis) a través de nginx, obtenga un servidor web Apache con app.example.com. Si intenta obtener la URL completa del sitio example.com/_/login. returnurl=, obtiene un error de apache 404
¿Por qué está pasando esto?
TLDR: tener varias máquinas virtuales con un servidor web (IIS y Apache) intentando redirigir a través del proxy inverso nginx y todas las solicitudes http obtienen el servidor web Apache.
# configuration file /etc/nginx/nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
# configuration file /etc/nginx/mime.types:
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
image/svg+xml svg svgz;
image/webp webp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
# configuration file /etc/nginx/sites-enabled/app.example.com.ar:
server {
server_name app.example.com.ar www.app.example.com.ar;
location / {
proxy_pass http://10.10.10.2/;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/app.example.com.ar/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/app.example.com.ar/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = app.example.com.ar) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name app.example.com.ar www.app.example.com.ar;
return 404; # managed by Certbot
}
# configuration file /etc/letsencrypt/options-ssl-nginx.conf:
# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file. Contents are based on https://ssl-config.mozilla.org
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
# configuration file /etc/nginx/sites-enabled/reverseproxy.conf:
server {
listen 80;
server_name _;
location / {
proxy_pass http://10.10.10.196:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Por favor, avíseme si necesita más información u otra cosa.
¡Me alegraría mucho la ayuda!
Respuesta1
Supongo que la entrada DNS example.com
apunta al servidor cuya configuración se muestra en la pregunta.
Esta configuración tiene tres hosts virtuales definidos:
server {
server_name app.example.com.ar www.app.example.com.ar;
listen 443 ssl; # managed by Certbot
location / {
proxy_pass http://10.10.10.2/;
}
}
server {
listen 80;
server_name app.example.com.ar www.app.example.com.ar;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://10.10.10.196:80;
}
}
El primer host está app.example.com.ar
en el puerto 443 (TLS), que invierte los servidores proxy a 10.10.10.2
.
El segundo host está app.example.com.ar
en el puerto 80 (HTTP), que devuelve 404 no encontrado.
El tercero no tiene definido server_name
.
nginx selecciona el host virtual que se utilizará comprobando el Host
encabezado en la solicitud HTTP o SNI
el campo en el paquete TLS ClientHello.
Toma el nombre de la solicitud e intenta buscar un server
bloque coincidente para el puerto.
En su caso, una solicitud http://example.com.ar
significa que nginx intenta buscar un bloque cuyo server_name example.com.ar
valor listen
está configurado en 80
. No existe tal bloque, por lo que nginx usa el bloque predeterminado.
Dado que no hay ninguna server
entrada default_server
especificada, nginx utilizará el primer server
bloque coincidente como predeterminado para manejar la solicitud. En este caso se trata del segundo bloque. En ese bloque de servidor, la acción es return 404;
, que puedes ver en tu navegador.
Para solucionar el problema, debe configurar lo adecuado server_name
en el tercer bloque.