Apache HTTP Server #1 - Virtual Host: Làm sao một server có thể host hàng nghìn website?
- Apache HTTP Server #1 - Virtual Host: Làm sao một server có thể host hàng nghìn website?
- Apache HTTP Server #2 - Module: Bí mật giúp Apache tồn tại hơn 30 năm mà không cần viết lại từ đầu
1. Câu hỏi mở đầu
Có một điều khá thú vị.
Chúng ta đều biết một VPS hoàn toàn có thể chạy nhiều website cùng lúc.
Ví dụ:
example.com
blog.example.com
api.example.com
Thậm chí trên các dịch vụ shared hosting như Hostinger, một máy chủ còn phục vụ website của hàng trăm, hàng nghìn khách hàng khác nhau.
Nhưng câu hỏi ở đây là:
Apache làm thế nào để biết request này thuộc về website nào?
2. Một server, nhiều thư mục, nhiều website
Giả sử server của bạn có cấu trúc như sau:
/var/www/
├── app1/
├── app2/
└── app3/
Trong đó:
example.com->/var/www/app1blog.example.com->/var/www/app2api.example.com->/var/www/app3
Nếu người dùng mở:
https://blog.example.com
Apache phải biết rằng website cần phục vụ nằm trong:
/var/www/app2
chứ không phải app1 hay app3.
Nó làm điều đó bằng Virtual Host.
3. Browser đã gửi sẵn câu trả lời
Mỗi HTTP request đều mang theo một header rất quan trọng:
GET / HTTP/1.1
Host: blog.example.com
Đây chính là manh mối để Apache lựa chọn website.
Nếu request chứa:
Host: example.com
Apache sẽ phục vụ:
/var/www/app1
Nếu request chứa:
Host: blog.example.com
Apache sẽ chuyển sang:
/var/www/app2
Nếu request chứa:
Host: api.example.com
Apache sẽ phục vụ:
/var/www/app3
Toàn bộ quá trình này diễn ra trước khi request được chuyển tới PHP, Laravel hay Spring Boot.
4. Virtual Host thực chất là gì?
Nếu bỏ qua cú pháp cấu hình, Virtual Host có thể hiểu đơn giản là một bảng ánh xạ:
Host Header
|
v
Virtual Host
|
v
Document Root
Hay nói cách khác:
example.com
|
v
/var/www/app1
blog.example.com
|
v
/var/www/app2
api.example.com
|
v
/var/www/app3
5. Cấu hình của Apache
Ví dụ:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/app1
</VirtualHost>
<VirtualHost *:80>
ServerName blog.example.com
DocumentRoot /var/www/app2
</VirtualHost>
Khi Apache nhận được:
Host: blog.example.com
nó sẽ tìm Virtual Host có ServerName tương ứng và phục vụ nội dung trong:
/var/www/app2
Đó là toàn bộ nguyên lý.
6. Hóa ra mình đã dùng nó từ lâu
Hồi còn deploy website PHP lên Hostinger, nhiều người chỉ upload source code rồi trỏ domain.
Lúc đó có thể không hề biết rằng phía sau, Apache đã tạo Virtual Host cho từng domain để biết website nào cần được phục vụ.
Đến khi chuyển sang dùng VPS và đọc cấu hình Apache, mới nhận ra đây là một trong những khái niệm nền tảng nhất của web server.
Chúng ta chỉ nhìn thấy:
https://example.com
Nhưng phía sau, Apache phải trả lời câu hỏi đầu tiên:
Request này thuộc về website nào?
Và Virtual Host chính là câu trả lời.
7. Kết luận
Virtual Host là cơ chế giúp Apache ánh xạ:
- domain trong
Hostheader - sang đúng website
- và đúng
DocumentRoot
Nếu không có Virtual Host, một server sẽ không thể phục vụ gọn gàng hàng trăm hay hàng nghìn website khác nhau trên cùng một máy chủ.