Do máy chủ chỉ giữ một trang web?


80

Theo những gì tôi hiểu thì DNS liên kết tên miền với địa chỉ IP của máy chủ mà trang web được lưu trữ trên đó, điều đó có nghĩa là mỗi máy chủ chỉ có thể giữ một trang web? Nếu họ không, làm thế nào để gọi địa chỉ IP của máy chủ biết tôi muốn trang web nào nếu có nhiều trên cùng một máy chủ?


13
Wikipedia có một giới thiệu tốt về Shared Web Hosting . Nếu bạn nhập http: // <IP_ADDR> / trong trình duyệt của mình, yêu cầu HTTP sẽ không có tên miền trong Host:tiêu đề. Trong trường hợp lưu trữ được chia sẻ, máy chủ web có thể được nhà cung cấp định cấu hình để xử lý việc này theo các cách khác nhau (ví dụ: có mặc định, chuyển hướng đến nhà cung cấp, v.v.).
Jedi

Tôi đã nhấp vào các liên kết ngắt với các thông báo như "máy chủ này chưa bao giờ / hiện không lưu trữ trang web bạn đang tìm kiếm".
Jesvin Jose

1
Trong trường hợp bạn đang tìm cách chạy nhiều ứng dụng trên một máy chủ - hãy nói rằng bạn có hai ứng dụng MyApp và YourApp trên các cổng 8001 và 8002 tương ứng. Bạn có thể có hai bộ cân bằng tải hoặc proxy ứng dụng tại: myapp.com và yourapp.com. Yêu cầu họ nhận các yêu cầu tại các cổng mặc định (80/443) và chuyển tiếp nó đến (các) máy chủ thực tế tại các cổng 8001 và 8002 tương ứng.
rohithpr

6
Câu hỏi tuyệt vời. Mỗi trang web được sử dụng để cần địa chỉ IP của riêng mình (một máy chủ có thể có nhiều hơn một địa chỉ IP). Tiêu đề máy chủ trong HTTP / 1.1 đã được giới thiệu để giải quyết vấn đề chính xác mà bạn mô tả. Xem "bảo tồn địa chỉ Internet" trong www8.org/w8- con / 5c
AE

6
Nếu http 1.1 không có tiêu đề máy chủ, ipv6 sẽ được triển khai ngay bây giờ ;-) :-(
Lenne

Câu trả lời:


149

Về cơ bản: trình duyệt bao gồm tên miền trong yêu cầu HTTP, vì vậy máy chủ web biết tên miền nào được yêu cầu và có thể phản hồi tương ứng.


Yêu cầu HTTP

Đây là cách yêu cầu HTTP điển hình của bạn xảy ra:

  1. Người dùng cung cấp một URL, trong mẫu http://host:port/path.

  2. Trình duyệt trích xuất phần máy chủ (tên miền) của URL và dịch nó thành địa chỉ IP nếu cần, trong một quy trình được gọi là phân giải tên . Bản dịch này có thể xảy ra thông qua DNS, nhưng nó không phải (ví dụ: hoststệp cục bộ trên các hệ điều hành phổ biến bỏ qua DNS).

  3. Trình duyệt mở kết nối TCP tới cổng được chỉ định hoặc mặc định là cổng 80, trên địa chỉ IP đó.

  4. Trình duyệt gửi yêu cầu HTTP. Đối với HTTP / 1.1, nó trông như thế này:

    GET /path HTTP/1.1
    Host: example.com
    

    ( HostTiêu đề là tiêu chuẩn và bắt buộc trong HTTP / 1.1. Nó không được chỉ định trong thông số HTTP / 1.0, nhưng dù sao một số máy chủ cũng hỗ trợ nó.)

Từ đây, máy chủ web có một số thông tin có thể sử dụng để quyết định phản hồi sẽ là gì. Lưu ý rằng có thể một máy chủ web bị ràng buộc với nhiều địa chỉ IP.

  • Địa chỉ IP được yêu cầu, từ ổ cắm TCP
    • Địa chỉ IP của máy khách cũng có sẵn, nhưng điều này hiếm khi được sử dụng - đôi khi để chặn / lọc
  • Cổng được yêu cầu, từ ổ cắm TCP
  • Tên máy chủ được yêu cầu, như được chỉ định trong Hosttiêu đề của trình duyệt trong yêu cầu HTTP.
  • Đường dẫn được yêu cầu
  • Bất kỳ tiêu đề nào khác (cookie, v.v.)

Như bạn có vẻ đã nhận thấy, thiết lập lưu trữ chia sẻ phổ biến nhất hiện nay đặt nhiều trang web trên một địa chỉ IP duy nhất: kết hợp cổng, chỉ Hostđể phân biệt giữa các trang web.

Đây được gọi là Máy chủ ảo dựa trên tên trong vùng đất Apache, trong khi Nginx gọi chúng là Tên máy chủ trong Khối máy chủ và IIS thích Máy chủ ảo .


HTTPS thì sao?

HTTPS là một chút khác nhau. Mọi thứ đều giống hệt với việc thiết lập kết nối TCP, nhưng sau đó, một đường hầm TLS được mã hóa phải được thiết lập. Mục tiêu là không rò rỉ bất kỳ thông tin nào về yêu cầu.

Để xác minh rằng máy chủ thực sự sở hữu tên miền này, máy chủ phải gửi chứng chỉ được ký bởi bên thứ ba đáng tin cậy. Trình duyệt sau đó sẽ so sánh chứng chỉ này với tên miền mà nó yêu cầu.

Điều này trình bày một vấn đề. Làm thế nào để máy chủ biết chứng chỉ của máy chủ (trang web) nào sẽ gửi, nếu nó cần thực hiện việc này trước khi nhận được yêu cầu HTTP?

Theo truyền thống, điều này đã được giải quyết bằng cách có một địa chỉ IP (hoặc cổng) dành riêng cho mọi trang web yêu cầu HTTPS. Rõ ràng, điều này trở nên có vấn đề khi chúng ta bắt đầu dùng hết địa chỉ IPv4.

Nhập SNI (Chỉ định tên máy chủ). Trình duyệt hiện vượt qua tên máy chủ trong các cuộc đàm phán TLS, vì vậy máy chủ có thông tin này đủ sớm để gửi chứng chỉ chính xác. Về phía máy chủ, cấu hình rất giống với cách cấu hình máy chủ ảo HTTP.

Nhược điểm là tên máy chủ hiện được chuyển dưới dạng văn bản thuần túy trước khi mã hóa và về cơ bản là thông tin bị rò rỉ. Đây thường được coi là một sự đánh đổi chấp nhận được, vì dù sao tên máy chủ thường được hiển thị trong truy vấn DNS.


Điều gì nếu bạn yêu cầu một trang web chỉ bằng địa chỉ IP?

Máy chủ làm gì khi không biết máy chủ cụ thể nào bạn yêu cầu phụ thuộc vào cấu hình và cài đặt máy chủ. Thông thường, có một trang web "mặc định", "bắt" hoặc "dự phòng" được chỉ định sẽ cung cấp phản hồi cho tất cả các yêu cầu không chỉ định rõ ràng máy chủ lưu trữ.

Trang web mặc định này có thể là trang web độc lập của riêng nó (thường hiển thị thông báo lỗi) hoặc có thể là bất kỳ trang web nào khác trên máy chủ, tùy thuộc vào sở thích của quản trị viên máy chủ.


1
Ngoài ra, một trang web có thể được phân chia trên nhiều máy chủ, như trường hợp của bộ cân bằng tải, như Heroku và Amazon sử dụng.
phyrfox

1
@phyrfox Yea, tôi đã nghĩ đến việc thêm nó, nhưng nó chỉ liên quan đến câu hỏi và tôi không muốn trả lời quá lâu. Có thể cuối cùng vẫn thêm một phần cho nó sau.
Bob

Truyền thuyết kể rằng các tên miền phụ chỉ ra các máy tính cụ thể trong một mạng. Về lý thuyết
Loupax

"Theo truyền thống, điều này đã được giải quyết bằng cách có một địa chỉ IP (hoặc cổng) dành riêng cho mọi trang web yêu cầu HTTPS. Rõ ràng, điều này trở nên có vấn đề khi chúng tôi bắt đầu sử dụng hết địa chỉ IPv4." .
Lenne

92

Tôi có lời giải thích này cho những người không công nghệ.

Jack, Jill và Joe sống ở ký túc xá và họ không có điện thoại di động.

Trong danh bạ, tất cả đều được liệt kê với cùng một số. (Bản ghi A)

Bạn quay số, và ai đó nhấc điện thoại lên; bạn nói "Tôi muốn nói chuyện với Jill", và bạn đưa cô ấy vào cuộc.

Thay vì bản ghi A (Số điện thoại / địa chỉ IP) trong danh bạ, nó có thể chỉ nói "Ký túc xá X", sau đó bạn phải tìm thêm số cho Ký túc xá X. Đây là bản ghi CNAME.

Nếu Jill không có sẵn, bạn có thể nhận được

  • 404 Jill không có ở đây
  • 410 Jill đã chết.
  • 301 Jill được chuyển đến với Peter
  • 302 Jill đang đến thăm Peter, thay vào đó hãy gọi anh ta

  • 400 tôi không thể hiểu bạn.

  • 401 Bạn là ai? Mật khẩu là gì? hoặc Chúng tôi không cho phép người gọi nam sau 10 giờ tối
  • 404 Yêu cầu thanh toán (Bạn có chắc Jill là tên thật của cô ấy ;-))
  • 403 Không, đó không phải là mật khẩu đúng.
  • 418 Jill là một ấm trà :-)
  • 429 Jill không thể nhận thêm bất kỳ cuộc gọi nào.
  • 451 Bạn đang vi phạm lệnh cấm của bạn.

  • 500 Hệ thống điện thoại của chúng tôi đã bị hỏng.


Đối với người hiếu RFC đằng sau 418 là tools.ietf.org/html/rfc2324 và một bài viết thú vị sitesdoneright.com/blog/2013/03/... :)
Wordzilla

6

Theo những gì tôi hiểu thì DNS liên kết tên miền với địa chỉ IP của máy chủ mà trang web được lưu trữ trên đó, điều đó có nghĩa là mỗi máy chủ chỉ có thể giữ một trang web?

Đầu tiên, bạn cần hiểu rằng có một số khái niệm riêng biệt ở đây.

  • Trang web, một nhóm các trang web tạo thành một tổng thể thống nhất.
  • Địa chỉ IP, địa chỉ số (32 bit cho IPv4, 128 bit cho IPv6) được giao thức internet sử dụng làm nguồn hoặc đích cho lưu lượng.
  • Máy chủ, một máy có nhiệm vụ phục vụ các yêu cầu từ khách hàng.
  • Tên máy chủ, tên được sử dụng để xác định máy trong DNS (ví dụ: "www.example.com" hoặc "en.wikipedia.org")

Không có mối quan hệ một-một giữa bất kỳ những điều này. Một máy chủ có thể có nhiều địa chỉ IP; nhiều tên máy chủ có thể trỏ đến một địa chỉ IP; một tên máy chủ có thể trỏ đến nhiều địa chỉ IP. Nhiều trang web có thể dưới cùng một tên máy chủ. Một trang web có thể được trải rộng trên nhiều tên máy chủ.

Nếu họ không, làm thế nào để gọi địa chỉ IP của máy chủ biết tôi muốn trang web nào nếu có nhiều trên cùng một máy chủ?

Ngày xưa (HTTP 1.0 trở về trước), mỗi tên máy chủ mà máy chủ muốn xử lý khác nhau phải có địa chỉ IP riêng. Điều này khá lãng phí.

HTTP 1.1 đã thêm Host"tiêu đề làm trường bắt buộc trong yêu cầu HTTP (IIRC một số nhà cung cấp trước đây đã hỗ trợ đây là tiện ích mở rộng). Điều này cho máy chủ biết tên máy chủ nào đã được yêu cầu và do đó cho phép nó phục vụ nội dung khác nhau cho các tên máy chủ khác nhau trên cùng Địa chỉ IP. Hỗ trợ cho HTTP 1.1 trong các máy khách hiện có mặt khắp nơi.

Thật không may, SSL (TLS sau này) đã thêm một nếp nhăn. Việc thiết lập phiên SSL / TLS yêu cầu máy chủ xuất trình chứng chỉ cho máy khách bao gồm tên máy chủ được yêu cầu, nhưng yêu cầu HTTP không đến cho đến khi phiên SSL / TLS được thiết lập.

Có thể có một chứng chỉ bao gồm nhiều tên máy chủ thông qua việc sử dụng SubjectAltNametrường hoặc sử dụng ký tự đại diện trong CommonNametrường. Tuy nhiên, điều này đặt ra những thách thức hành chính, đặc biệt là nếu các tên máy chủ liên quan thuộc các tên miền có quyền sở hữu khác nhau.

Vì vậy, TLS đã giới thiệu phần mở rộng "chỉ định tên máy chủ" (SNI). Với tiện ích mở rộng này, máy khách sẽ gửi tên máy chủ được yêu cầu đến máy chủ trong quy trình bắt tay TLS. Sau đó, máy chủ có thể xuất trình chứng chỉ phù hợp. Thật không may, trong khi các phiên bản hiện tại của tất cả các triển khai SSL / TLS chính hỗ trợ SNI, thì phải mất một thời gian dài để các phiên bản cũ không sử dụng được.


Bạn đã quên đề cập rằng TCP có thể lắng nghe trên nhiều cổng, chạy các máy chủ khác nhau trên mỗi ...
Toby Speight

Có, nhưng bạn không có portnumbers trong dns và bạn không thể mong đợi joe.p.user sẽ truy cập our.fabulous.site:81 Bên cạnh đó, một số tường lửa chặn truy cập vào các portnumbers không chuẩn.
Lenne

3

Câu trả lời phức tạp hơn một chút so với một số câu trả lời đã được đưa ra. Khi bạn thực hiện tra cứu DNS, bạn PHẢI lấy địa chỉ IP ( Abản ghi cho IPv4, AAAAcho IPv6). Bạn phải có khả năng mở một ổ cắm qua TCP / IP để liên lạc hoặc toàn bộ điều này không thành công. Địa chỉ đó có thể đại diện cho một máy chủ hoặc nó có thể đại diện cho một bộ cân bằng tải. Nó thậm chí có thể đại diện cho một proxy. Ví dụ: nếu máy chủ đứng sau CloudFlare, thì địa chỉ bạn nhận được là của máy chủ CloudFlare. Máy chủ thực sự là một nơi khác. Điều này cho phép máy chủ tránh các vấn đề như các cuộc tấn công từ chối dịch vụ.

Lưu trữ ảo là những gì bạn đang hỏi về (một số câu hỏi khác liên quan đến vấn đề này, nhưng không có chi tiết nào). Lưu trữ ảo nhận yêu cầu web và xem tên máy chủ (tức là domain.com) để xác định trang web nào sẽ phục vụ. Vì vậy, trong máy chủ web Apache HTTP, bạn sẽ có một cấu hình như thế này

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

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

Điều này được đơn giản hóa ví dụ. Vì vậy, chúng tôi đang bảo Apache nghe trên cổng 80 của bất kỳ IP nào (trong máy ảo hiện đại lưu trữ IP của máy của bạn có thể khác với IP trực tiếp của nó). Sau đó chúng tôi nói với nó rằng đây là domain.comtrang web và thư mục mà trang web đó sống theo. Sau đó, chúng ta có thể lặp lại khối này nhiều lần để bảo Apache xử lý các trang web khác nhau. Mỗi máy chủ web hỗ trợ loại hệ thống này.

Một cách khác để xử lý việc này là yêu cầu máy chủ web chuyển tất cả lưu lượng truy cập web sang một tập lệnh lập trình duy nhất (ví dụ: PHP, ASP.NET, v.v.) và sau đó tập lệnh đơn lẻ đó sẽ xác định trang web và trang nào sẽ hiển thị.


1

Sử dụng DNS, bạn có thể gán bao nhiêu tên cho một địa chỉ IP riêng lẻ như bạn muốn ( ví dụ trong tệp máy chủ của bạn, bạn có thể chỉ cần tách từng tên bằng khoảng trắng chẳng hạn). Sử dụng máy chủ DNS, bạn cũng có thể gán nhiều địa chỉ IP cho một tên . Nó không giới hạn trong mối quan hệ một đối một.

Một máy chủ web biết trang web nào sẽ phục vụ bằng cách kiểm tra URL được yêu cầu. Nó xem xét tên miền nào được yêu cầu, cổng được yêu cầu và giao thức nào được sử dụng. Điều này không liên quan gì đến DNS và được xử lý bởi giao thức HTTP.


0

Máy chủ web có khái niệm về bộ chứa máy chủ ( ví dụ, đây là tài liệu cho Tomcat). Nhiều thùng chứa máy chủ có thể được cấu hình cho cùng một địa chỉ hộp / ip, phục vụ nhiều tên miền. Các container có các thư mục làm việc độc lập, các lĩnh vực xác thực, các thư mục nhật ký và những thứ tương tự.

Máy chủ tìm thấy bộ chứa có liên quan cho yêu cầu mới mua tên miền là một phần của yêu cầu HTTP này.

Các trường hợp máy chủ web hoàn toàn khác nhau có thể chia sẻ cùng một địa chỉ IP nếu chúng chạy trên các cổng khác nhau. Điều này chủ yếu được sử dụng trong các môi trường phát triển và thử nghiệm khác nhau, nơi tên miền có thể không có sẵn, vì máy chủ sản xuất không thể chạy trên cổng tùy ý.

Cuối cùng, ngay cả khi địa chỉ IP duy nhất được yêu cầu cho một trang web, một hộp máy chủ thường có nhiều bộ điều hợp mạng để được cấu hình để sử dụng nhiều địa chỉ IP.


0

Địa chỉ IP máy chủ của bạn có thể chứa nhiều tên miền khác nhau cùng một lúc.

Khi bạn truy cập trang web, trình duyệt của bạn sẽ gửi yêu cầu HTTP có tên miền trong đó và máy chủ có thể tìm thấy dữ liệu trang web nào sẽ gửi lại cho bạn sau đó.

Nó được gọi là máy chủ ảo, đơn giản như vậy :)

Hãy xem ở đây để biết thêm thông tin về DNS và máy chủ ảo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.