Author Topic: Chia host trên máy chủ Apache  (Read 20466 times)

Ácman

  • PHP Intermediate
  • *
  • Posts: 401
  • If it's worth having, it's worth fighting for
    • View Profile
Chia host trên máy chủ Apache
« on: March 16, 2007, 04:32:02 AM »
Điều này có nghĩa là có thể lưu trữ và phục vụ nhiều site - host (VD: www.phpvn.org, www.apachevn.org,...) trên 1 máy chủ mà không cần phải có máy chủ riêng cho từng site. Chức năng này trong Apache được gọi là "Virtual Hosts" - host ảo.

Có 2 loại host ảo: IP-based và non-IP-based. IP-based virtual host là loại "cổ điển", trong đó mỗi 1 host ảo trên máy chủ sẽ có 1 địa chỉ IP riêng, nghĩa là máy chủ có nhiều địa chỉ IP. Nhưng địa chỉ IP cũng là 1 tài nguyên, nên sẽ kinh tế hơn nếu có thể sử dụng cùng 1 địa chỉ IP cho nhiều host. Đó là đặc điểm của loại host ảo thứ 2: non-IP-based virtual host hay name virtual host. Với loại này, khi máy chủ nhận được 1 kết nối, nó sẽ không biết sử dụng host nào (vì nhiều tên host cùng có chung 1 địa chỉ IP). Vì vậy với giao thức HTTP/1.1 mới, trình duyệt web sẽ phải gửi thêm đến máy chủ thông tin về tên host trong header Host. Với các trình duyệt cũ, nó sẽ không gửi header Host đến máy chủ. Apache cũng có cách thức để giải quyết vấn đề tương thích này nhưng tôi sẽ không đề cập ở đây.

Để tạo nhiều host trên 1 máy chủ, dù là theo kiểu gì thì đầu tiên bao giờ cũng phải đăng ký tất cả các tên host vào hệ thống tên miền DNS. DNS là 1 hệ thống mà mọi máy tính khi kêt nối với Internet đều phải sử dụng để trình duyệt web có thể dịch ra địa chỉ IP từ dòng URL chứa tên host mà người dùng nhập vào khung address. Tiếp đó Apache phải được cấu hình để nó có thể đáp ứng yêu cầu của máy khách theo các cách khác nhau tuỳ thuộc vào host ảo nào mà yêu cầu đó hướng tới.

Để minh hoạ, ta hãy lấy 1 VD. Giả sử bạn có 1 máy chủ với 3 IP: 10.1.2.3, 10.1.2.4, 10.1.2.5, và cần tạo 4 host (site): www.linuxvn.org, www.apachevn.org, www.mysqlvn.org, www.phpvn.org, trong đó linuxvn và apachevn dùng 2 địa chỉ IP riêng là 10.1.2.3 và 10.1.2.4 (IP-based virtual host), còn mysqlvn và phpvn dùng chung 1 IP 10.1.2.5 (name virtual host).

Vì có 4 site nên bạn phải tạo 4 thư mục riêng cho từng site, VD:

Quote
C:/www/www.linuxvn.org
C:/www/www.apachevn.org
C:/www/www.mysqlvn.org
C:/www/www.phpvn.org

Trong mỗi thư mục cần tạo các thư mục chính quan trọng cho site, gồm: htdocs (lưu trữ site), logs (lưu trữ các file log), v.v... Cần tạo thư mục nào cũng như tên của chúng là tuỳ thuộc vào bạn. Dĩ nhiên thư mục để lưu trữ site là không thể thiếu.

Bước tiếp theo là cấu hình Apache. Mở file httpd.conf (nằm trong thư mục conf trong thư mục cài đặt Apache) và thêm vào đó các khối <VirtualHost>. Bạn có thể thêm bao nhiêu khối <VirtualHost> tuỳ thích.

Quote
<VirtualHost 10.1.2.3>
DocumentRoot "C:/www/www.linuxvn.org"
ServerName  www.linuxvn.org
</VirtualHost>

<VirtualHost 10.1.2.4>
DocumentRoot "C:/www/www.apachevn.org"
ServerName  www.apachevn.org
</VirtualHost>

Như vậy ta đã tạo 2 host ảo với 2 địa chỉ IP khác nhau. Nếu trong file httpd.conf không khai báo khối <VirtualHost> nào, Apache chỉ có 1 host duy nhất, tạm gọi là main server. Cần thêm vào các khối <VirtualHost> các chỉ thị (directive) để cấu hình cho host đó. Như ở trên ta dùng 2 chỉ thị là DocumentRoot và ServerName để xác định đường dẫn đến thư mục lưu trữ site và tên host. Các chỉ thị thường được khai báo trong <VirtualHost> bao gồm: DocumentRoot, ServerName, ErrorLog và TransferLog. Một số chỉ thị không được phép đặt trong <VirtualHost> bao gồm: BindAddress, StartSevers, Listen, Group và User. Cấu hình của từng host sẽ được thừa kế từ cấu hình của main server, trừ các phần được thiết lập bởi các chỉ thị trong <VirtualHost>.

Khi một yêu cầu từ máy khách được gửi đến, Apache sẽ sử dụng thông tin về địa chỉ IP và cổng trong lời yêu cầu để tìm ra cấu hình host ảo phù hợp. VD: khi bạn gõ trong khung address của trình duyệt yêu cầu: http://www.linuxvn.org/, máy chủ Apache sẽ dùng địa chỉ 10.1.2.3 và cổng 80 (cổng mặc định nếu ta không khai báo trong lời yêu cầu) để xác định cần cấu hình máy chủ theo host www.linuxvn.org (như vậy nó sẽ phải cung cấp cho máy khách các trang web từ thư mục C:/www/www.linuxvn.org/htdocs) . Nếu không thấy host ảo nào phù hợp, nó sẽ sử dụng cấu hình của main server.

Tiếp tục, để tạo 2 host ảo còn lại dùng chung địa chỉ IP, cách làm cũng giống như trên. Chỉ khác ở chỗ, để báo cho Apache biết địa chỉ IP này được dùng cho các name virtual host cần thêm vào file httpd.conf như sau:

Quote
NameVirtualHost 10.1.2.5
 
<VirtualHost 10.1.2.5>
DocumentRoot "C:/www/www.mysqlvn.org"
ServerName  www.mysqlvn.org
</VirtualHost>

<VirtualHost 10.1.2.5>
DocumentRoot "C:/www/www.phpvn.org"
ServerName  www.phpvn.org
</VirtualHost>

Tất cả đã xong. Chỉ còn 1 việc là restart Apache.

Tại các dòng VirtualHost và NameVirtualHost có thể thay địa chỉ IP bằng dấu * để tham chiếu tới tất cả các địa chỉ IP của máy chủ. VD nếu máy chủ của bạn chỉ có 1 địa chỉ IP và muốn chia ra rất nhiều host thì chỉ cần thêm vào dòng NameVirtualHost * và các khối <VirtualHost *>.

hanam1605

  • PHP Starter
  • *
  • Posts: 5
    • View Profile
    • Email
Re: Chia host trên máy chủ Apache
« Reply #1 on: April 24, 2008, 04:33:20 PM »
Anh Ácman cho em hỏi cái này với lúc đầu em tạo 1 webserver local thoi em chay cái Forum thì Ok rồi em làm thêm cái website leech file(2 con này nằm chung 1 Ip ) nhung khi em gõ http://10.133.1.100 thì nó ra cái forum của em em gõ http://10.133.1.100/rapidleech thì nó báo lỗi
Code: [Select]
Not Found

The requested URL /rapidleech was not found on this server.
Anh Ácman chỉ em với nhé

Ácman

  • PHP Intermediate
  • *
  • Posts: 401
  • If it's worth having, it's worth fighting for
    • View Profile
Re: Chia host trên máy chủ Apache
« Reply #2 on: April 24, 2008, 09:49:43 PM »
Nghĩa là Document root của cậu ko chứa thư mục rapidleech, vậy thôi ;D. Nói cách khác là thư mục chứa rapidleech ko phải là Document root ;D. Cậu tạo web server thì phải biết cái này: http://10.133.1.100/rapidleech trỏ đến đâu trong server chứ! Mặt khác, server của cậu chỉ có 1 IP, mà cậu lại gõ thẳng IP vào address bar thì web server biết tìm đến host nào đây (forum hay rapidleech?), vì nó cần có cả thông số host name nữa. Cho nên nó sẽ tìm đến virtual host đầu tiên trong httpd.conf.

Nếu cậu muốn nghịch trò này trên máy cục bộ (ko phải trong mạng LAN), thì trước hết cậu phải làm như bài của anh cmxq, VD thêm vào file hosts:

127.0.0.1 forumcuata.hehe
127.0.0.1 leechcuata.hoho

Tiếp đó, mở httpd.conf và thêm vào các virtual host (giả dụ forum của cậu chứa trong C:/www/forum, còn leech chứa trong C:/www/rapidleech):

NameVirtualHost *
 
<VirtualHost *>
DocumentRoot "C:/www/forum"
ServerName forumcuata.hehe
</VirtualHost>

<VirtualHost *>
DocumentRoot "C:/www/rapidleech"
ServerName  leechcuata.hoho
</VirtualHost>

Restart Apache. Giờ cậu gõ vào trình duyệt http://forumcuata.hehe, nó sẽ lôi thằng forum ra. Còn http://leechcuata.hoho sẽ lôi thằng rapidleech ra.

Nếu cậu muốn dùng trò này cho mạng LAN thì cậu phải chịu khó sửa lại file hosts cho... tất cả các máy trong mạng ;D, và phải thay 127.0.0.1 bằng IP máy của cậu trong mạng LAN:

10.133.1.100 forumcuata.hehe
10.133.1.100 leechcuata.hoho

Sau khi hoàn thành đại nghiệp này xong thì mọi máy trong mạng LAN đều có thể truy cập đến forum hoặc leech của cậu theo domain "đểu" mà cậu tạo ;D

PS: coi chừng cậu có thể trở thành "ác quỉ", hoặc "sát thủ" mà nạn nhân là người sử dụng máy tính có file hosts bị sửa đổi ;D.
« Last Edit: April 24, 2008, 10:19:34 PM by Ácman »

hanam1605

  • PHP Starter
  • *
  • Posts: 5
    • View Profile
    • Email
Re: Chia host trên máy chủ Apache
« Reply #3 on: April 25, 2008, 08:01:23 AM »
Thanks anh ácma nhé em ko thay file host tren từng máy làm gì em dựng thêm con DNS nữa là dc

vnfisher

  • PHP Starter
  • *
  • Posts: 3
    • View Profile
    • Ohay Group!
    • Email
Re: Chia host trên máy chủ Apache
« Reply #4 on: April 30, 2008, 05:52:43 AM »
Bác có vẻ hiểu rất rõ về Apache, vậy cho em hỏi chút, có cách nào chia sẻ tên miền (Cho phép người dùng tạo Subdomain) trên Host chạy Apache không?

cmxq

  • Administrator
  • PHP Intermediate
  • *****
  • Posts: 1339
    • View Profile
    • Email
Re: Chia host trên máy chủ Apache
« Reply #5 on: April 30, 2008, 07:59:36 AM »
Việc quản lý subdomain là do máy chủ DNS quyết định, Apache không thể tạo được subdomain. Tuy nhiên, bằng một vài tiểu xảo thì bạn cũng có thể làm được điều này:
- Bước 1: Trên máy chủ DNS, tạo ra một bản ghi dạng wildcard (bản ghi *.tenmien.com), trỏ bản ghi host này sang IP của máy chủ chạy Apache.
- Bước 2: Cấu hình Apache để tạo ra một host mới (như trên)
- Bước 3: Trong chương trình xử lý (PHP), bạn cần phải detect xem người sử dụng đang dùng tên miền nào. Vì subdomain * là subdomain đặc biệt nên người sử dụng gõ bất kỳ cái gì kèm theo .tenmien.com thì nó đều trỏ đến host. Vấn đề còn lại là sử dụng CSDL để xác lập các subdomain do người sử dụng đăng ký.

Hãy bấm LIKE nếu bạn thích bài viết này

phpKungFu

  • For a better united PHP community in Vietnam
  • Administrator
  • PHP Intermediate
  • *****
  • Posts: 426
  • Flattern the world
    • View Profile
    • Flexica Solutions
Re: Chia host trên máy chủ Apache
« Reply #6 on: April 30, 2008, 09:04:59 AM »
"Có vẻ" là thế nào nhỉ  :-[ :-[
>>>>> Cộng đồng PHP mới <<<<<
Nhận ngay FREE hosting khi gia nhập
http://www.phpatwork.com
---------------------------------------------
Flexica Solutions
http://www.webflexica.com

Baby

  • PHP Starter
  • *
  • Posts: 10
    • Yahoo Instant Messenger - minhhoang1004
    • View Profile
    • TDY NHT
Re: Chia host trên máy chủ Apache
« Reply #7 on: June 04, 2008, 11:07:41 AM »
Anh Ácman cho em hỏi cái này với lúc đầu em tạo 1 webserver local thoi em chay cái Forum thì Ok rồi em làm thêm cái website leech file(2 con này nằm chung 1 Ip ) nhung khi em gõ http://10.133.1.100 thì nó ra cái forum của em em gõ http://10.133.1.100/rapidleech thì nó báo lỗi
Code: [Select]
Not Found

The requested URL /rapidleech was not found on this server.
Anh Ácman chỉ em với nhé
Đêm lang thang ngồi buồn, định làm cho xong cái trang thông tin mà không tập trung được, thôi thì tổng hợp cái bài ni cho nó có ích, chứ lang thang net lắm mà không mần chi cũng vô bổ!

Với những bạn yêu lập trình web, chắc không lạ gì với Apache... bài viết này (đúng ra là bài dịch và tổng hợp lại) hướng dẫn bạn tạo dịch vụ vhost trong windows nghịch localhost cho vui nhà vui cửa ...
Bắt đầu nhá!

Công việc đầu tiên là tìm file httpd.conf trong thư mục conf của apache, bỏ dấu # trước dòng lệnh :
(dòng 460):
#Virtual hosts
#Include conf/extra/httpd-vhosts.conf
mục đích của việc này là thêm nội dung thiết lập trong file config httpd-vhosts.conf ở thư mục extra vào config của apache server.

tạo một thư mục bạn muốn chứa các virtual host - C:\vhosts chẳng hạn .
Mở file hosts trong thư mục C:\WINDOWS\system32\drivers\etc\ bằng Notepad hoặc chương trình khác (chú ý với win vista thì chương trình soạn thảo phải chạy với quyền admin(run as an administrator). Bạn sẽ thấy:
127.0.0.1 localhost
Cho trỏ chuột vào cuối dòng đó, enter để xuống dòng mới và thêm vhost của bạn. Ví dụ bạn tạo một vhost nội dung chứa trong C:\vhosts\nguoihatinh và khi truy cập bằng trìnhduyeetjj thì chỉ cần gõ http://nguoihatinh ...Câu lệnh để thêm sẽ là:
127.0.0.1 nguoihatinh

Lưu lại kết quả và thoát ra ngoài trình soạn thảo.

Lưu lại kết quả httpd.conf và thoát khỏi trình soạn thảo.
mở file httpd-vhosts.conf trong thư mực \conf\extra của Apache bằng trình soạn thảo (notepad hoặc chương trình khác). Bạn sẽ thấy nội dung tòn bộ. Di chuột đến chỗ trống hàng 15 và chèn nội dung sau:
<Directory C:/vhosts>
Order Deny,Allow
Allow from all
</Directory>
Đoạn code này thiết lập quyền truy cập đúng cho thư mục chứa site mà bạn muốn xem như là một vhost. Nếu bạn chọn một vị trí khác làm thư mục top-level, hãy thay thế đường dẫn C:/vhosts cho phù hợp.

Ngay khi tất cả virtual hosts của bạn được chứa trong thư mục con của thư mục top-level , các câu lệnh trên thiết lập quyền truy cập hợp lí cho tất cả thư mục đó. Tuy nhiên, nếu muốn tạo thêm thư mục top-level khác, hãy thêm tiếp đoạn code như trên vào dưới nó với đường dẫn phù hợp. Ví dụ: tạo thêm thư mục top-level khác là C:\www chẳng hạn:
<Directory C:/www>
Order Deny,Allow
Allow from all
</Directory>
Các dòng lệnh bạn thấy từ dòng 27 đến 42 định nghĩa một virtual hosts. Nó bao gồm tất cả các câu lệnh có thể sử dụng nhưng tối thiểu cần có hai cái là DocumentRoot và ServerName.

Khi bạn bật chức năng virtual hosting, Apache sẽ khóa server root chính, vì vậy định nghĩa đầu tiên phải là giới thiệu lại original server root. Sau đó bạn add thêm mỗi virtual host mới với một cặp <VirtualHost> tags, sử dụng đường dẫn tới nơi chứa các files của web làm giá trị cho DocumentRoot, và tên của virtual host cho ServerName. Again, use forward slashes, and if the path contains any spaces, enclose the whole path in quotes. Với ví dụ của ta, dòng lệnh để thêm vào như sau:
<VirtualHost *:80>
DocumentRoot c:/htdocs
ServerName localhost
</VirtualHost>
<VirtualHost *:80>
DocumentRoot c:/vhosts/nguoihatinh
ServerName nguoihatinh
</VirtualHost>

Cặp thẻ <VirtualHost> thứ nhất để định nghĩa lại cho Document root... Cặp thứ 2 để định nghĩa virtual host...
Lưu lại các sửa đổi httpd-vhosts.conf, và khởi động lại Apache. Truy cập virtaul host vừa tạo qua trình duyệt web:
http://nguoihatinh hoặc truy cập dưới dạng http://localhost/nguoihatinh/. Bạn sẽ nhận được kết quả mong muốn ... Khi cần thêm vhost khác, bạn cứ thao tác lại như trên với các giá trị đường dẫn phù hợp...

Mặc định bảo mật trong Apache, với các dòng ệnh như trên, nếu trong vhost của bạn( thư mục nguoihatinh đó) chưa chứa file index thì bạn sẽ nhận thông báo:
Forbidden
You don't have permission to access /index.php on this server.
Để khắc phục điều này, tức là kể cả không có file index, bạn vẫn muốn truy cập thư mục thì thêm dòng lệnh sau vào đoạn mã thiết lập quyền truy cập:
Options Indexes MultiViews

thành ra:
<Directory C:/vhosts>
Options Indexes MultiViews
Order Deny,Allow
Allow from all
</Directory>
Hãy thử làm nhà cung cấp hosting trên local đi nhé ... Nhiều điều thú vị lắm...
               (NguoiHaTinh.Net)
Bâng khuâng đứng giữa hai dòng nước
Chọn một dòng hay để nước trôi?
http://thoidauyeu.net hay http://nguoihatinh.net ?

minhtribt

  • PHP Starter
  • *
  • Posts: 2
    • View Profile
    • Email
Re: Chia host trên máy chủ Apache
« Reply #8 on: May 07, 2011, 02:19:00 PM »
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot c:/htdocs
ServerName localhost
</VirtualHost>
<VirtualHost *:90>
DocumentRoot c:/vhosts/nguoihatinh
ServerName nguoihatinh
</VirtualHost>

Apache chấp nhận như vầy ko các bác ?
Nếu Server root listen port 80 mà vào đây NameVirtualHost *:90 thì khi vào thẻ <VirtualHost *??> thì port nó vẫn là 90 đúng ko ?