Ho diversi server in esecuzione sulla stessa macchina, alcuni solo con http, altri con http e https. Esistono diversi blocchi server definiti in file separati inclusi nel file di configurazione principale.
Ho impostato un server "predefinito" per http che servirà una "pagina di manutenzione" generica per le richieste che non corrispondono a nessuno degli altri nomi_server negli altri file di configurazione. Il server predefinito http funziona come previsto, utilizza il nome_server "_" e appare per primo nell'elenco di include (poiché ho osservato che nel caso di nomi di server duplicati tra server, viene utilizzato quello visualizzato per primo). Funziona benissimo.
Mi aspetterei lo stesso blocco server esatto (cambiando solo "ascolta 80 default_server" su "ascolta 443 default_server" e anche invece di servire la pagina "return 444"), tuttavia non lo è. Al contrario, sembra che il nuovo server https predefinito stia effettivamente afferrando tutte le connessioni https in entrata e causandone il fallimento, sebbene gli altri blocchi server abbiano nomi_server più appropriati per le richieste in arrivo. La rimozione del nuovo server https predefinito causerà il ripristino del comportamento semi-corretto: i siti Web con https verranno caricati correttamente; ma i siti Web senza https verranno tutti indirizzati al primo server https nei file include (che secondo i documenti, se non appare "default_server", il primo blocco server che appare sarà "predefinito").
Quindi la mia domanda è: qual è il modo corretto di definire un "server predefinito" in nginx per le connessioni ssl? Perché quando imposto esplicitamente un "default_server" diventa avido e afferra tutte le connessioni mentre quando lascio implicitamente a nginx decidere il "server predefinito" funziona come mi aspetterei (con il server errato impostato come predefinito e gli altri server reali comportarsi correttamente)?
Ecco i miei "server predefiniti". Http funziona senza interrompere altri server. Https rompe altri server e consuma tutto.
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
}
Qualcuno di voi vede cosa potrebbe esserci di sbagliato qui?