¿Cómo puedo configurar mi servidor nginx para aceptar diferentes subdominios y también puertos?

¿Cómo puedo configurar mi servidor nginx para aceptar diferentes subdominios y también puertos?

Tengo un servidor ejecutándose en Ubuntu/Nginx. Tengo subdominios ejecutándose desde diferentes puertos internos. Quiero exponer una aplicación al público pero no asociarla con ningún nombre de dominio/servidor.

A continuación se muestra mi archivo de configuración:

server {
    server_name app.example.com www.app.example.com;
    access_log /home/hub-app/logs/app.example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8082;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        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; 
    }

    listen 443 ssl; 
    ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;


}   

server {
    server_name example.com www.example.com;
    access_log /home/hub-public/logs/example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8081;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        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; 
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

}

Lo anterior funciona bien y apunta a los dominios especificados, es decir, ejemplo.com y aplicación.ejemplo.com. Ahora quiero agregar otro servidor virtual para ejecutarlo en MY_PUBLIC_IP:8080. El puerto 8080 no debería ser accesible en otros dominios, es decirejemplo.com:8080/app.ejemplo.com:8080no debería estar disponible.

Respuesta1

Puedes usar default_server.

Nginx declarará ese servidor como el servidor predeterminado. Después de eso, Nginx utilizará el servidor predeterminado para manejar las solicitudes cuando su encabezado de host HTTP no coincida con ningún otro bloque de servidor.

¿Qué es default_server en Nginx?

Ejemplo:

server {
    listen 8080 default_server;
    
    root /www/default;
        
    location / {
        index index.html;
    }
}


Lo uso para los robots de escáner de honeypot y les transmito algunos emojis de caca si están buscando phpAdmin o algo parecido :)

Respuesta2

No creo que la respuesta de @Klamberext realmente responda la pregunta. Es decir, el servidor web nginx tiene unservidor predeterminadoconcepto. La página de documentación oficial sobre el tema se puede encontrar aquí:Cómo nginx procesa una solicitud. Sin embargo, uno de los bloques del servidor que escucha en alguna combinación de interfaz/puerto de red siempre actuará como el predeterminado. Si no especifica ese bloque de servidor explícitamente, será el primer bloque de servidor en su configuración. Eso significa que su bloque de servidor con la server_name app.example.com www.app.example.com;línea será el bloque de servidor predeterminado para cualquier solicitud que llegue al puerto TCP 443, atendiendo cualquier solicitud en la que un Hostencabezado HTTP no coincida example.como www.example.com(o si no habrá Hostningún encabezado).

Como ya lo dijo @Klamberext, una práctica común es definir un bloque de servidor auxiliar para detectar todas las solicitudes en las que el Hostencabezado HTTP no coincide con ninguno de los dominios que está atendiendo. Puedes ver un ejemplo enestePues contesta. Por lo general, dicho bloque de servidor contiene la return 444;declaración que es un código de retorno especial de nginx para cerrar inmediatamente la conexión. Sin embargo, parece que necesita algo opuesto, y necesitará dos bloques de servidor para lograrlo, ya que, como ya se dijo, un único bloque de servidor que escuche en el puerto TCP 8080 actuará como el predeterminado sin importar cuál esté Hostconfigurado el encabezado. :

server {
    listen 8080;
    server_name example.com www.example.com app.example.com www.app.example.com;
    return 444;
}
server {
    listen 8080 default_server;
    ... your config here
}

Como alternativa, puedes verificar el Hostvalor del encabezado dentro del bloque de tu servidor, por ejemplo para bloquear un example.comdominio y cualquiera de sus subdominios:

server {
    listen 8080;
    if ($http_host ~ \.?example\.com$) { return 444; }
    ... your config here
}

información relacionada