I server contengono solo un sito Web?


80

Da quanto capisco il collegamento DNS il nome di dominio con l'indirizzo IP del server su cui è memorizzato il sito Web, significa che ogni server può contenere solo un sito Web? In caso contrario, come fa a chiamare l'indirizzo IP del server sapere quale sito Web desidero se ce ne sono molti sullo stesso server?


13
Wikipedia ha una buona introduzione al Web hosting condiviso . Se inserisci http: // <IP_ADDR> / nel tuo browser, la richiesta HTTP non avrà un dominio Host:nell'intestazione. In caso di hosting condiviso, il server Web può essere configurato dal provider per gestirlo in diversi modi (ad es. Avere un predefinito, reindirizzare al provider ecc.).
Jedi

Ho cliccato su link che si rompono con messaggi del tipo "questo server non ha mai / al momento non ospita il sito Web che stai cercando".
Jesvin Jose,

1
Nel caso in cui tu stia cercando un modo lontano per eseguire più applicazioni su un singolo server, supponi di avere due app MyApp e YourApp sulle porte 8001 e 8002 rispettivamente. Puoi avere due bilanciatori del carico o proxy dell'applicazione su: myapp.com e yourapp.com. Invitali a ricevere richieste sulle porte predefinite (80/443) e inoltrarle ai server effettivi alle porte 8001 e 8002 rispettivamente.
rohithpr,

6
Ottima domanda Ogni sito Web aveva bisogno del proprio indirizzo IP (un server può avere più di un indirizzo IP). L'intestazione Host in HTTP / 1.1 è stata introdotta per aggirare il problema esatto che descrivi. Vedi "Conservazione dell'indirizzo Internet" in www8.org/w8-papers/5c-protocols/key/key.html
AE

6
Se http 1.1 non avesse l'intestazione host, ipv6 sarebbe già implementato ;-) :-(
Lenne

Risposte:


149

Fondamentalmente: il browser include il nome di dominio nella richiesta HTTP, quindi il server web sa quale dominio è stato richiesto e può rispondere di conseguenza.


Richieste HTTP

Ecco come avviene la tua tipica richiesta HTTP:

  1. L'utente fornisce un URL, nel modulo http://host:port/path.

  2. Il browser estrae la parte host (dominio) dell'URL e, se necessario, lo traduce in un indirizzo IP, in un processo noto come risoluzione dei nomi . Questa traduzione può avvenire tramite DNS, ma non è necessario (ad esempio, il hostsfile locale su sistemi operativi comuni ignora il DNS).

  3. Il browser apre una connessione TCP alla porta specificata o, per impostazione predefinita, porta 80, su quell'indirizzo IP.

  4. Il browser invia una richiesta HTTP. Per HTTP / 1.1, è simile al seguente:

    GET /path HTTP/1.1
    Host: example.com
    

    (L' Hostintestazione è standard e richiesta in HTTP / 1.1. Non è stato specificato nelle specifiche HTTP / 1.0, ma alcuni server lo supportano comunque.)

Da qui, il server web ha diverse informazioni che può usare per decidere quale dovrebbe essere la risposta. Si noti che è possibile che un singolo server web sia associato a più indirizzi IP.

  • L'indirizzo IP richiesto, dal socket TCP
    • È anche disponibile l'indirizzo IP del client, ma questo viene usato raramente, a volte per bloccare / filtrare
  • La porta richiesta, dal socket TCP
  • Il nome host richiesto, come specificato Hostnell'intestazione dal browser nella richiesta HTTP.
  • Il percorso richiesto
  • Qualsiasi altra intestazione (cookie, ecc.)

Come sembra aver notato, la configurazione di hosting condiviso più comune in questi giorni mette più siti Web su un unico indirizzo IP: combinazione di porte, lasciando solo la Hostdifferenziazione tra i siti Web.

Questo è noto come Host virtuale basato sul nome in Apache-land, mentre Nginx li chiama Server Names in Server Blocks e IIS preferisce Virtual Server .


Che dire di HTTPS?

HTTPS è un po 'diverso. Tutto è identico alla creazione della connessione TCP, ma successivamente deve essere stabilito un tunnel TLS crittografato. L'obiettivo è quello di non perdere alcuna informazione sulla richiesta.

Per verificare che il server sia effettivamente proprietario di questo dominio, il server deve inviare un certificato firmato da una terza parte attendibile. Il browser confronterà quindi questo certificato con il dominio richiesto.

Questo presenta un problema. Come fa il server a sapere quale certificato host (sito Web) inviare, se deve farlo prima di ricevere la richiesta HTTP?

Tradizionalmente, questo è stato risolto con un indirizzo IP (o porta) dedicato per ogni sito Web che richiede HTTPS. Ovviamente, questo diventa problematico quando iniziamo a rimanere senza indirizzi IPv4.

Immettere SNI (Indicazione nome server). Il browser ora passa il nome host durante le negoziazioni TLS, quindi il server ha queste informazioni abbastanza presto per inviare il certificato corretto. Sul lato server, la configurazione è molto simile alla configurazione degli host virtuali HTTP.

Il rovescio della medaglia è che il nome host è ora passato come testo normale prima della crittografia, ed è essenzialmente informazioni trapelate. Questo di solito è considerato un compromesso accettabile, considerando comunque il nome host normalmente esposto in una query DNS.


Cosa succede se si richiede un sito solo per indirizzo IP?

Cosa fa il server quando non sa quale host specifico hai richiesto dipende dall'implementazione e dalla configurazione del server. In genere, è stato specificato un sito "predefinito", "catchall" o "fallback" che fornirà le risposte a tutte le richieste che non specificano esplicitamente un host.

Questo sito predefinito può essere un sito indipendente (che spesso mostra un messaggio di errore) oppure può essere uno qualsiasi degli altri siti sul server, a seconda delle preferenze dell'amministratore del server.


1
Inoltre, un sito può essere suddiviso su più server, come nel caso dei sistemi di bilanciamento del carico, come utilizzano Heroku e Amazon.
phyrfox,

1
@phyrfox Sì, ho pensato di aggiungerlo, ma è solo tangenzialmente correlato alla domanda e non volevo che la risposta fosse troppo lunga. Potrebbe ancora finire per aggiungere una sezione per dopo.
Bob,

La leggenda vuole che i sottodomini puntino a computer così specifici all'interno di una rete. In teoria
Loupax,

"Tradizionalmente, questo è stato risolto con un indirizzo IP (o porta) dedicato per ogni sito Web che richiede HTTPS. Ovviamente, questo diventa problematico quando iniziamo a rimanere a corto di indirizzi IPv4." Quindi, senza quell'invasione, ormai tutti avremmo ipv6 .
Lenne,

92

Ho questa spiegazione per le persone non tecnologiche.

Jack, Jill e Joe vivono in un dormitorio e non hanno il cellulare.

Nella rubrica, sono tutti elencati con lo stesso numero. (Un record)

Componi il numero e qualcuno risponde al telefono; dici "Vorrei parlare con Jill" e la metterai in riga.

Invece di un record A (un numero di telefono / indirizzo IP) nella rubrica, si può semplicemente dire "Dormitory X", quindi è necessario cercare ulteriormente il numero per Dormitory X. Questo è un record CNAME.

Se Jill non è disponibile, potresti ottenere

  • 404 Jill non è qui
  • 410 Jill è morto.
  • 301 Jill viene trasferito con Peter
  • 302 Jill è in visita a Peter, chiamalo invece

  • 400 Non ti capisco.

  • 401 Chi sei? Qual è la password? o Non permettiamo ai chiamanti di sesso maschile dopo le 22:00
  • 402 Pagamento richiesto (Sei sicuro che Jill sia il suo vero nome ;-))
  • 403 No, questa non è la password giusta.
  • 418 Jill è una teiera :-)
  • 429 Jill non può più ricevere chiamate.
  • 451 Stai violando il tuo ordine restrittivo.

  • 500 Il nostro sistema telefonico è guasto.


Per i curiosi la RFC dietro 418 è tools.ietf.org/html/rfc2324 e un articolo interessante sitesdoneright.com/blog/2013/03/… :)
Wordzilla,

6

Da quanto capisco il collegamento DNS il nome di dominio con l'indirizzo IP del server su cui è memorizzato il sito Web, significa che ogni server può contenere solo un sito Web?

Innanzitutto, devi capire che ci sono una serie di concetti distinti qui.

  • Sito Web, un gruppo di pagine Web che formano un insieme coerente.
  • Indirizzo IP, un indirizzo numerico (32 bit per IPv4, 128 bit per IPv6) utilizzato dal protocollo Internet come sorgente o destinazione per il traffico.
  • Server, una macchina il cui compito è soddisfare le richieste dei client.
  • Nome host, un nome utilizzato per identificare una macchina nel DNS (ad es. "Www.example.com" o "en.wikipedia.org")

Non esiste una relazione uno a uno tra queste cose. Un server può avere più indirizzi IP; più nomi host possono puntare a un indirizzo IP; un nome host può puntare a più indirizzi IP. Più siti Web possono avere lo stesso nome host. Un sito Web può essere distribuito su più nomi host.

In caso contrario, come fa a chiamare l'indirizzo IP del server sapere quale sito Web desidero se ce ne sono molti sullo stesso server?

In passato (HTTP 1.0 e precedenti) ogni nome host che il server voleva gestire in modo diverso doveva avere il proprio indirizzo IP. Questo è stato piuttosto dispendioso.

HTTP 1.1 ha aggiunto l Host'intestazione come campo obbligatorio nella richiesta HTTP (IIRC alcuni fornitori lo avevano precedentemente supportato come estensione). Questo diceva al server quale nome host era stato richiesto e quindi gli permetteva di servire contenuti diversi per nomi host diversi sullo stesso Indirizzo IP. Il supporto per HTTP 1.1 nei client ora è onnipresente.

Sfortunatamente, SSL (successivamente TLS) ha aggiunto una ruga. La creazione di una sessione SSL / TLS richiede che il server presenti un certificato al client che copra il nome host richiesto, ma la richiesta HTTP non arriva fino a quando non viene stabilita la sessione SSL / TLS.

È possibile avere un certificato che copra più nomi host attraverso l'uso del SubjectAltNamecampo o l'uso di caratteri jolly nel CommonNamecampo. Tuttavia, ciò rappresenta una sfida amministrativa, soprattutto se i nomi host coinvolti si trovano in domini con proprietà diverse.

Pertanto TLS ha introdotto l'estensione "SNI (server name indicazione)". Con questa estensione, il client invia il nome host richiesto al server durante la procedura di handshake TLS. Il server può quindi presentare il certificato appropriato. Sfortunatamente, mentre le versioni attuali di tutte le principali implementazioni SSL / TLS supportano SNI, è passato molto tempo perché le versioni precedenti non funzionassero.


Hai dimenticato di menzionare che TCP può ascoltare su molte porte, eseguendo server diversi su ogni ...
Toby Speight,

Sì, ma non hai portnumber in dns e non puoi aspettarti che joe.p.user vada sul nostro sito.fabulous.site:81 Inoltre, alcuni firewall bloccano l'accesso in uscita a portnumber non standard.
Lenne,

3

La risposta è un po 'più complicata di quanto alcune delle risposte si siano rivelate essere. Quando si esegue una ricerca DNS, È NECESSARIO ottenere un indirizzo IP ( Arecord per IPv4, AAAAper IPv6). Devi essere in grado di aprire un socket su TCP / IP per comunicare o tutto fallisce. Tale indirizzo può rappresentare un server o potrebbe rappresentare un bilanciamento del carico. Potrebbe persino rappresentare un proxy. Se l'host si trova dietro CloudFlare, ad esempio, l'indirizzo ottenuto è di un server CloudFlare. Il vero server è da qualche altra parte. Ciò consente all'host di evitare problemi come gli attacchi Denial of Service.

L'hosting virtuale è ciò che stai chiedendo (alcune delle altre domande toccate su questo, ma non in dettaglio). L'hosting virtuale accetta la richiesta Web e controlla il nome host (ad esempio domain.com) per determinare quale sito Web pubblicare. Quindi nel server web HTTP Apache avresti una configurazione come questa

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias domain.com

    DocumentRoot /var/www/domain.com
</virtualHost>

Questo è semplificato per esempio. Quindi stiamo dicendo ad Apache di ascoltare sulla porta 80 di qualsiasi IP (nella moderna macchina virtuale che ospita l'IP della tua macchina potrebbe essere diverso dal suo IP attivo). Quindi diciamo che questo è il domain.comsito Web e in quale directory si trova quel sito Web. Possiamo quindi ripetere questo blocco più volte per dire ad Apache di gestire diversi siti Web. Ogni web server supporta questo tipo di sistema.

Un altro modo per gestire questo sarebbe dire al server web di indirizzare tutto il traffico web verso un singolo script di programmazione (ad esempio PHP, ASP.NET, ecc.) E quindi quel singolo script determinerà quale sito Web e pagina visualizzare.


1

Usando DNS puoi assegnare tutti i nomi a un singolo indirizzo IP che vuoi (nel tuo file hosts puoi semplicemente separare ogni nome con spazi, per esempio). Utilizzando un server DNS è inoltre possibile assegnare più indirizzi IP a un singolo nome . Non è limitato a una relazione uno a uno.

Un web server conosce quale sito servire esaminando l'URL richiesto. Verifica quale dominio è stato richiesto, la porta richiesta e quale protocollo è stato utilizzato. Questo non ha nulla a che fare con il DNS ed è gestito dal protocollo HTTP.


0

Il server Web ha il concetto di contenitore host ( ecco la documentazione per Tomcat, per esempio). È possibile configurare più contenitori host per lo stesso indirizzo casella / ip, che serve più domini. I contenitori hanno directory di lavoro indipendenti, regni di autenticazione, directory dei registri e cose simili.

Il server trova il contenitore pertinente per la nuova richiesta. Il nome del dominio fa parte di questa richiesta HTTP.

Istanze di server Web completamente diverse possono condividere lo stesso indirizzo IP se vengono eseguite su porte diverse. Viene utilizzato principalmente in vari ambienti di sviluppo e test in cui i nomi di dominio potrebbero non essere disponibili, poiché il server di produzione non può essere eseguito su una porta arbitraria.

Infine, anche se per un sito Web è richiesto l'indirizzo IP univoco rigoroso, una casella del server ha spesso più schede di rete, quindi è configurata per utilizzare più indirizzi IP.


0

Il tuo indirizzo IP del server può contenere contemporaneamente diversi nomi di dominio.

Quando si accede al sito Web, il browser invia la richiesta HTTP con il nome di dominio al suo interno e il server può trovare i dati del sito Web che dovrebbe inviare in quel momento.

Si chiama host virtuali, così semplice :)

Dai un'occhiata qui per ulteriori informazioni su DNS e host virtuali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.