Apakah server hanya memiliki satu situs web?

80

Seperti dari apa yang saya pahami DNS menghubungkan nama domain dengan alamat IP dari server situs web disimpan, apakah itu berarti setiap server hanya dapat menyimpan satu situs web? Jika tidak, bagaimana cara memanggil alamat IP server mengetahui situs web yang saya inginkan jika ada banyak di server yang sama?

pengguna3407319
sumber
13
Wikipedia memiliki pengantar yang bagus untuk Shared Web Hosting . Jika Anda memasukkan http: // <IP_ADDR> / di browser Anda, permintaan HTTP tidak akan memiliki domain di dalam Host:header. Dalam hal hosting bersama, server web dapat dikonfigurasikan oleh penyedia untuk menangani ini dengan cara yang berbeda (misalnya memiliki default, mengarahkan ulang ke penyedia, dll.).
Jedi
Saya telah mengklik tautan yang memutuskan pesan seperti "server ini tidak pernah / saat ini tidak meng-host situs web yang Anda cari".
Jesvin Jose
1
Jika Anda mencari cara untuk menjalankan beberapa aplikasi pada satu server - katakanlah Anda memiliki dua aplikasi MyApp dan YourApp pada port masing-masing 8001 dan 8002. Anda dapat memiliki dua penyeimbang beban atau proksi aplikasi di: myapp.com dan yourapp.com. Minta mereka menerima permintaan di port default (80/443) dan meneruskannya ke server yang sebenarnya di port 8001 dan 8002 masing-masing.
rohithpr
6
Pertanyaan bagus Setiap situs web dulunya membutuhkan alamat IP sendiri (server dapat memiliki lebih dari satu alamat IP). Header Host di HTTP / 1.1 diperkenalkan untuk mengatasi masalah yang Anda uraikan. Lihat "Konservasi alamat Internet" di www8.org/w8-papers/5c-protocols/key/key.html
AE
6
Jika http 1.1 tidak memiliki header host, ipv6 akan diimplementasikan sekarang ;-) :-(
Lenne

Jawaban:

149

Pada dasarnya: browser menyertakan nama domain dalam permintaan HTTP, sehingga server web tahu domain mana yang diminta dan dapat meresponsnya.


Permintaan HTTP

Begini cara permintaan HTTP tipikal Anda terjadi:

  1. Pengguna menyediakan URL, dalam formulir http://host:port/path.

  2. Browser mengekstrak bagian host (domain) dari URL dan menerjemahkannya ke alamat IP jika perlu, dalam proses yang dikenal sebagai resolusi nama . Terjemahan ini dapat terjadi melalui DNS, tetapi tidak harus (misalnya, hostsfile lokal pada OS umum melewati DNS).

  3. Browser membuka koneksi TCP ke port yang ditentukan, atau default ke port 80, pada alamat IP itu.

  4. Browser mengirim permintaan HTTP. Untuk HTTP / 1.1, tampilannya seperti ini:

    GET /path HTTP/1.1
    Host: example.com
    

    ( HostHeader adalah standar dan diperlukan dalam HTTP / 1.1. Itu tidak ditentukan dalam spesifikasi HTTP / 1.0, tetapi beberapa server tetap mendukungnya.)

Dari sini, server web memiliki beberapa informasi yang dapat digunakan untuk memutuskan apa yang seharusnya menjadi respons. Perhatikan bahwa dimungkinkan untuk satu server web terikat ke beberapa alamat IP.

  • Alamat IP yang diminta, dari soket TCP
    • Alamat IP klien juga tersedia, tetapi ini jarang digunakan - terkadang untuk memblokir / memfilter
  • Port yang diminta, dari soket TCP
  • Nama host yang diminta, seperti yang ditentukan dalam Hostheader oleh browser dalam permintaan HTTP.
  • Jalur yang diminta
  • Header lainnya (cookie, dll.)

Seperti yang Anda perhatikan, pengaturan hosting bersama yang paling umum akhir-akhir ini menempatkan banyak situs web pada satu alamat IP: kombinasi port, hanya menyisakan Hostperbedaan antara situs web.

Ini dikenal sebagai Host Virtual Berbasis-Nama di Apache-land, sementara Nginx menyebut mereka Nama Server di Blok Server dan IIS lebih suka Server Virtual .


Bagaimana dengan HTTPS?

HTTPS sedikit berbeda. Semuanya identik dengan pembentukan koneksi TCP, tetapi setelah itu terowongan TLS terenkripsi harus dibuat. Tujuannya adalah untuk tidak membocorkan informasi tentang permintaan tersebut.

Untuk memverifikasi bahwa server benar-benar memiliki domain ini, server harus mengirim sertifikat yang ditandatangani oleh pihak ketiga yang tepercaya. Browser kemudian akan membandingkan sertifikat ini dengan domain yang diminta.

Ini menimbulkan masalah. Bagaimana server mengetahui sertifikat host (situs web) mana yang akan dikirim, jika perlu melakukan ini sebelum permintaan HTTP diterima?

Secara tradisional, ini diselesaikan dengan memiliki alamat IP khusus (atau port) untuk setiap situs web yang membutuhkan HTTPS. Jelas, ini menjadi bermasalah ketika kita mulai kehabisan alamat IPv4.

Masukkan SNI (Indikasi Nama Server). Browser sekarang melewati nama host selama negosiasi TLS, sehingga server memiliki info ini cukup awal untuk mengirim sertifikat yang benar. Di sisi server, konfigurasi sangat mirip dengan bagaimana virtual host HTTP dikonfigurasikan.

Kelemahannya adalah nama host sekarang disahkan sebagai teks biasa sebelum enkripsi, dan pada dasarnya adalah informasi yang dibocorkan. Ini biasanya dianggap sebagai tradeoff yang dapat diterima, mengingat nama host biasanya diekspos dalam permintaan DNS.


Bagaimana jika Anda meminta situs hanya dengan alamat IP?

Apa yang dilakukan server ketika tidak tahu host spesifik mana yang Anda minta tergantung pada implementasi dan konfigurasi server. Biasanya, ada situs "default", "catchall" atau "fallback" yang ditentukan yang akan memberikan respons terhadap semua permintaan yang tidak secara spesifik menentukan host.

Situs default ini dapat berupa situs independennya sendiri (sering menampilkan pesan kesalahan), atau bisa juga situs lain di server, tergantung pada preferensi admin server.

Bob
sumber
1
Juga, satu situs dapat dipisah di banyak server, seperti halnya dengan load balancers, seperti Heroku dan Amazon.
phyrfox
1
@ phyrfox Ya, saya berpikir tentang menambahkan itu, tapi itu hanya berhubungan dengan pertanyaan dan saya tidak ingin membuat jawabannya terlalu lama. Mungkin masih akan menambahkan bagian untuk nanti.
Bob
Legenda mengatakan bahwa subdomain menunjuk komputer tertentu di dalam jaringan. Secara teori
Loupax
"Secara tradisional, ini diselesaikan dengan memiliki alamat IP khusus (atau port) untuk setiap situs web yang membutuhkan HTTPS. Jelas, ini menjadi masalah ketika kita mulai kehabisan alamat IPv4.", Jadi tanpa invensi itu, kita semua akan memiliki ipv6 sekarang .
Lenne
92

Saya memiliki penjelasan ini untuk orang-orang non-teknologi.

Jack, Jill, dan Joe tinggal di asrama, dan mereka tidak punya ponsel.

Dalam buku telepon, semuanya terdaftar dengan nomor yang sama. (Rekor)

Anda memutar nomornya, dan seseorang mengangkat telepon; Anda mengatakan "Saya ingin berbicara dengan Jill", dan Anda membuatnya terhubung.

Alih-alih A-record (A phonenumber / IP-adress) dalam buku telepon, itu mungkin hanya mengatakan "Asrama X", maka Anda harus mencari lebih jauh untuk nomor Asrama X. Ini adalah catatan CNAME.

Jika Jill tidak tersedia, Anda mungkin mendapatkan

  • 404 Jill tidak ada di sini
  • 410 Jill sudah mati.
  • 301 Jill dipindahkan dengan Peter
  • 302 Jill mengunjungi Peter, panggil saja dia

  • 400 Saya tidak bisa mengerti Anda.

  • 401 siapa kamu? Apa passwordnya? atau Kami tidak mengizinkan penelepon pria setelah 10 malam
  • Diperlukan 402 Pembayaran (Apakah Anda yakin Jill adalah nama aslinya ;-))
  • 403 Tidak, itu bukan kata sandi yang tepat.
  • 418 Jill adalah teko :-)
  • 429 Jill tidak dapat menerima telepon lagi.
  • 451 Anda melanggar perintah penahanan Anda.

  • 500 Sistem telepon kami rusak.

Lenne
sumber
Bagi yang penasaran RFC di belakang 418 adalah tools.ietf.org/html/rfc2324 dan artikel yang menarik sitesdoneright.com/blog/2013/03/... :)
Wordzilla
6

Seperti dari apa yang saya pahami DNS menghubungkan nama domain dengan alamat IP dari server situs web disimpan, apakah itu berarti setiap server hanya dapat menyimpan satu situs web?

Pertama, Anda perlu memahami bahwa ada sejumlah konsep berbeda di sini.

  • Situs web, sekelompok halaman web yang membentuk keseluruhan yang koheren.
  • Alamat IP, alamat numerik (32-bit untuk IPv4, 128 bit untuk IPv6) yang digunakan oleh protokol internet sebagai sumber atau tujuan untuk lalu lintas.
  • Server, mesin yang tugasnya melayani permintaan dari klien.
  • Hostname, nama yang digunakan untuk mengidentifikasi mesin di DNS (mis. "Www.example.com" atau "en.wikipedia.org")

Tidak ada hubungan satu-ke-satu di antara semua hal ini. Satu server dapat memiliki beberapa alamat IP; beberapa nama host dapat menunjuk pada satu alamat IP; satu nama host dapat menunjuk pada beberapa alamat IP. Beberapa situs web dapat menggunakan nama host yang sama. Satu situs web dapat tersebar di beberapa nama host.

Jika tidak, bagaimana cara memanggil alamat IP server mengetahui situs web yang saya inginkan jika ada banyak di server yang sama?

Di masa lalu (HTTP 1.0 dan sebelumnya) setiap nama host yang ingin ditangani server berbeda harus memiliki alamat IP sendiri. Ini agak boros.

HTTP 1.1 menambahkan Hostheader "sebagai bidang wajib dalam permintaan HTTP (IIRC beberapa vendor sebelumnya mendukung ini sebagai ekstensi). Ini memberitahu server mana nama host telah diminta dan karenanya memungkinkannya untuk menyajikan konten yang berbeda untuk nama host yang berbeda pada saat yang sama Alamat IP. Dukungan untuk HTTP 1.1 di klien sekarang ada di mana-mana.

Sayangnya, SSL (kemudian TLS) menambahkan kerutan. Membuat sesi SSL / TLS mengharuskan server untuk menampilkan sertifikat kepada klien yang mencakup nama host yang diminta, tetapi permintaan HTTP tidak sampai sampai sesi SSL / TLS dibuat.

Dimungkinkan untuk memiliki satu sertifikat yang mencakup beberapa nama host melalui penggunaan SubjectAltNamebidang atau penggunaan wildcard di CommonNamebidang tersebut. Namun, ini menimbulkan tantangan administratif, terutama jika nama host yang terlibat berada di bawah domain dengan kepemilikan yang berbeda.

Jadi TLS memperkenalkan ekstensi "indikasi nama server" (SNI). Dengan ekstensi ini, klien mengirimkan nama host yang diminta ke server selama prosedur jabat tangan TLS. Server kemudian dapat menyajikan sertifikat yang sesuai. Sayangnya, sementara versi saat ini dari semua implementasi SSL / TLS utama mendukung SNI, butuh waktu lama untuk versi yang lebih lama tidak digunakan lagi.

plugwash
sumber
Anda lupa menyebutkan bahwa TCP dapat mendengarkan pada banyak port, menjalankan server yang berbeda pada masing-masing ...
Toby Speight
Ya, tetapi Anda tidak memiliki portnumber di dns, dan Anda tidak dapat mengharapkan pengguna joe.p. untuk mengunjungi our.fabulous.site:81 Selain itu, beberapa firewall memblokir akses keluar ke portnumber yang tidak standar.
Lenne
3

Jawabannya sedikit lebih rumit daripada beberapa jawaban yang ada. Ketika Anda melakukan pencarian DNS, Anda HARUS mendapatkan alamat IP ( Arekam untuk IPv4, AAAAuntuk IPv6). Anda harus dapat membuka soket melalui TCP / IP untuk berkomunikasi atau semuanya gagal. Alamat itu mungkin mewakili server atau mungkin mewakili penyeimbang beban. Bahkan bisa mewakili proxy. Jika host ada di belakang CloudFlare, misalnya, alamat yang Anda dapatkan adalah dari server CloudFlare. Server sebenarnya ada di tempat lain. Ini memungkinkan tuan rumah menghindari masalah seperti serangan Denial-of-Service.

Hosting virtual adalah apa yang Anda tanyakan (beberapa pertanyaan lain menyentuh ini, tetapi tidak secara mendetail). Hosting virtual mengambil permintaan web dan melihat nama host (yaitu domain.com) untuk menentukan situs web mana yang akan ditayangkan. Jadi di server web Apache HTTP Anda akan memiliki konfigurasi seperti ini

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

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

Ini disederhanakan misalnya. Jadi kami memberi tahu Apache untuk mendengarkan pada port 80 IP mana saja (di mesin virtual modern yang menghosting IP mesin Anda mungkin berbeda dari IP live-nya). Kami kemudian memberi tahu bahwa ini adalah domain.comsitus web dan direktori tempat tinggalnya. Kami kemudian dapat mengulangi blok ini berulang-ulang untuk memberi tahu Apache untuk menangani situs web yang berbeda. Setiap server web mendukung sistem jenis ini.

Cara lain untuk menangani ini adalah dengan memberi tahu server web untuk mengarahkan semua lalu lintas web ke satu skrip pemrograman tunggal (yaitu PHP, ASP.NET, dll) dan kemudian skrip tunggal akan menentukan situs web dan halaman mana yang akan ditampilkan.

Machavity
sumber
1

Menggunakan DNS, Anda dapat menetapkan sebanyak mungkin nama ke alamat IP individual yang Anda inginkan (dalam file host Anda, Anda dapat memisahkan setiap nama dengan spasi, misalnya). Menggunakan server DNS Anda juga dapat menetapkan beberapa alamat IP untuk satu nama . Itu tidak terbatas pada hubungan satu-ke-satu.

Server web tahu situs mana yang akan dilayani dengan memeriksa URL yang diminta. Itu terlihat di mana domain diminta, port yang diminta dan protokol apa yang digunakan. Ini tidak ada hubungannya dengan DNS dan ditangani oleh protokol HTTP.

Krowe
sumber
0

Server web memiliki konsep wadah host (di sini adalah dokumentasi untuk Tomcat, misalnya). Beberapa wadah host dapat dikonfigurasi untuk kotak / alamat ip yang sama, melayani beberapa domain. Kontainer memiliki direktori kerja yang independen, ranah otentikasi, direktori log dan hal-hal sejenisnya.

Server menemukan wadah yang relevan untuk permintaan baru, membeli nama domain, adalah bagian dari permintaan HTTP ini.

Contoh server web yang sama sekali berbeda dapat berbagi alamat IP yang sama jika mereka berjalan pada port yang berbeda. Ini sebagian besar digunakan dalam berbagai lingkungan pengembangan dan pengujian di mana nama domain mungkin tidak tersedia, karena server produksi tidak dapat berjalan pada port arbitrer.

Akhirnya, bahkan jika alamat IP yang sangat unik diperlukan untuk situs web, kotak server sering memiliki beberapa adapter jaringan sehingga dikonfigurasi untuk menggunakan beberapa alamat IP.

h22
sumber
0

Alamat IP server Anda dapat menyimpan banyak nama domain yang berbeda secara bersamaan.

Ketika Anda mengakses situs web, browser Anda mengirimkan permintaan HTTP dengan nama domain di dalamnya, dan server dapat menemukan data situs web mana yang harus dikirim kepada Anda saat itu.

Ini disebut host virtual, sesederhana itu :)

Lihatlah di sini untuk informasi lebih lanjut tentang DNS dan host virtual.

Tim Connor
sumber