คอนฟิกหลายชื่อเว็บไซต์บนเว็บเซิร์ฟเวอร์เครื่องเดียวด้วย Apache VirtualHost

วิธีการหนึ่งสำหรับคนที่ต้องการมีเว็บไซต์บนอินเตอร์เน็ตเป็นของตัวเอง คือใช้บริการ Web Hosting

เคยสงสัยไหมว่า ผู้ให้บริการต้องมีเซิร์ฟเวอร์กี่เครื่อง เพื่อจะรองรับเว็บไซต์หรือโดเมนเนมของลูกค้าจำนวนมากได้

โดยทั่วไป ผู้ให้บริการ Web Hosting อาจมีเซิร์ฟเวอร์เพียงไม่กี่เครื่องเท่านั้น โดยแต่ละเครื่องสามารถคอนฟิกเพื่อให้รองรับจำนวนเว็บไซต์ได้เป็นหลักร้อย หลักพัน หรือเคยได้ยินมาว่าบางที่ ที่ค่าบริการถูกมากๆ มีจำนวนเว็บไซต์ต่อเครื่องถึงหลักหมื่นเลยทีเดียว

วิธีการที่คอนฟิกเว็บเซิร์ฟเวอร์เพื่อให้สามารถรองรับได้หลายเว็บไซต์หรือโดเมน โดยพื้นฐานแล้วก็คือการใช้ VirtualHost นั่นเอง

บทความนี้จะอธิบายวิธีการคอนฟิก Apache VirtualHost บน Fedora 16

ระบบทดสอบ

  • Fedora 16
  • IP Address: 192.168.5.16

ในที่นี้สมมติว่าเราแก้ไข DNS (หรืออาจแก้ไฟล์ host บนเครื่อง Client) โดยเพิ่มชื่อ 3 เว็บไซต์ ให้ชี้มายัง IP 192.168.5.16

  • web1.example.com
  • web2.example.com
  • web3.example.com

ติดตั้งไฟล์ rpm ของ Apache

ใช้คำสั่ง rpm เพื่อตรวจสอบเวอร์ชั่นที่ติดตั้ง

[root@fc16-64a ~]# rpm -qa | grep httpd
httpd-tools-2.2.21-1.fc16.x86_64
httpd-2.2.21-1.fc16.x86_64

โดยดีฟอลต์การติดตั้งไฟล์ rpm ของ Apache บนลีนุกซ์ ตระกูล RedHat, CentOS, หรือ Fedora จะรองรับแค่ชื่อเว็บไซต์เดียวเท่านั้น

การคอนฟิก VirtualHost บนเว็บเซิร์ฟเวอร์

เริ่มต้น ถ้าต้องการเปิดคุณสมบัติ VirtualHost ต้องแก้ไขคอนฟิกไฟล์ httpd.conf โดยเอาเครื่องหมาย ‘#’ (comment) หน้าออปชั่น NameVirtualHost ออก

วิธีการคอนฟิก VirtualHost ในที่นี้จะอ้างอิงตามชื่อเว็บไซต์ที่เรียกเข้ามา เช่น ถ้า Browser (client)

  • ใช้ชื่อ “ServerName” web1.example.com เข้ามา เราต้องการให้เข้าไปอ่านไฟล์เว็บในไดเร็คทอรี “DocumentRoot” /var/www/html/web1.example.com
  • แต่ถ้าใช้ชื่อ web2.example.com ให้อ่านไฟล์ใน /var/www/html/web2.example.com
  • และถ้าใช้ชื่อ web3.example.com ให้ไปอ่านไฟล์จาก /var/www/html/web3.example.com
  • แต่ถ้าใช้ชื่ออื่นๆ หรือใช้ IP Address ของเซิร์ฟเวอร์ ให้อ่านไฟล์ใน /var/www/html/default

ตัวอย่างไฟล์คอนฟิก httpd.conf ที่แก้ไข

[root@fc16-64a ~]# cat /etc/httpd/conf/httpd.conf
...
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
<VirtualHost *:80>
 ServerName 192.168.5.16
 DocumentRoot /var/www/html/default
 ErrorLog logs/default-error_log
 CustomLog logs/default-access_log common
</VirtualHost>
<VirtualHost *:80>
 ServerName web1.example.com
 DocumentRoot /var/www/html/web1.example.com
 ErrorLog logs/web1.example.com-error_log
 CustomLog logs/web1.example.com-access_log common
</VirtualHost>
<VirtualHost *:80>
 ServerName web2.example.com
 DocumentRoot /var/www/html/web2.example.com
 ErrorLog logs/web2.example.com-error_log
 CustomLog logs/web2.example.com-access_log common
</VirtualHost>
<VirtualHost *:80>
 ServerName web3.example.com
 DocumentRoot /var/www/html/web3.example.com
 ErrorLog logs/web3.example.com-error_log
 CustomLog logs/web3.example.com-access_log common
</VirtualHost>

 

สร้างไดเร็คทอรี DocumentRoot สำหรับเก็บไฟล์ของชื่อเว็บไซต์ต่างๆ

[root@fc16-64a ~]# mkdir /var/www/html/default
[root@fc16-64a ~]# mkdir /var/www/html/web1.example.com
[root@fc16-64a ~]# mkdir /var/www/html/web2.example.com
[root@fc16-64a ~]# mkdir /var/www/html/web3.example.com

สร้างไฟล์เว็บ index.html ของแต่ละเว็บไซต์

[root@fc16-64a ~]# echo "Hello, default web site" > /var/www/html/default/index.html
[root@fc16-64a ~]# echo "Hello, web1" > /var/www/html/web1.example.com/index.html
[root@fc16-64a ~]# echo "Hello, web2" > /var/www/html/web2.example.com/index.html
[root@fc16-64a ~]# echo "Hello, web3" > /var/www/html/web3.example.com/index.html

ใช้คำสั่ง service restart เพื่อรีสตาร์ตเซอร์วิส httpd ใหม่

[root@fc16-64a ~]# service httpd restart
Restarting httpd (via systemctl): [ OK ]

การคอนฟิก VirtualHost ในที่นี้จะแยก log file ทั้ง access_log และ error_log ตามชื่อเว็บไซต์ด้วย เพื่อสะดวกต่อการตรวจสอบและการทำรายงานการเข้าใช้

[root@fc16-64a httpd]# ls -l
total 4
-rw-r--r--. 1 root root 0 Mar 9 16:34 access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 default-access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 default-error_log
-rw-r--r--. 1 root root 458 Mar 9 16:35 error_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web1.example.com-access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web1.example.com-error_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web2.example.com-access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web2.example.com-error_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web3.example.com-access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web3.example.com-error_log

 

ทดสอบจาก Browser (client)

ใช้ Browser บนเครื่อง Client เปิดไปที่เว็บไซต์ http://web1.example.com

ผลที่ทดสอบ ก็เข้าไปอ่านไฟล์ใน /var/www/html/web1.example.com/index.html จริง

ลองดู log file ที่เกิดขึ้น จะเห็นว่าเกิด log เฉพาะในโดเมน web1.example.com เท่านั้น

[root@fc16-64a ~]# ls -l /var/log/httpd/
total 12
-rw-r--r--. 1 root root 0 Mar 9 16:34 access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 default-access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 default-error_log
-rw-r--r--. 1 root root 458 Mar 9 16:35 error_log
-rw-r--r--. 1 root root 222 Mar 9 16:36 web1.example.com-access_log
-rw-r--r--. 1 root root 234 Mar 9 16:36 web1.example.com-error_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web2.example.com-access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web2.example.com-error_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web3.example.com-access_log
-rw-r--r--. 1 root root 0 Mar 9 16:34 web3.example.com-error_log
[root@fc16-64a ~]# tail /var/log/httpd/web1.example.com-access_log
192.168.5.101 - - [09/Mar/2012:16:36:06 +0700] "GET / HTTP/1.1" 200 12
192.168.5.101 - - [09/Mar/2012:16:36:06 +0700] "GET /favicon.ico HTTP/1.1" 404 291
[root@fc16-64a ~]# tail /var/log/httpd/web1.example.com-error_log
[Fri Mar 09 16:36:06 2012] [error] [client 192.168.5.101] File does not exist: /var/www/html/web1.example.com/favicon.ico

 

ทดลองอีกครั้งด้วยชื่อเว็บ web2.example.com

 

log file ที่เกิดขึ้น ก็จะไปขึ้นในไฟล์ web2.example.com-access_log และ web2.example.com-error_log ที่คอนฟิกไว้
แต่ถ้าเข้าด้วย IP ของ Server หรือชื่อ ServerName อื่นๆ ที่ไม่ได้คอนฟิก VirtualHost ไว้ ผลที่ได้จะไปเรียก VirtualHost ที่คอนฟิกไว้บนสุด ในที่นี้คือ DocumentRoot /var/www/html/default

 

เพราะฉะนั้น ลำดับคอนฟิก VirtualHost ในไฟล์ httpd.conf จึงมีความสำคัญ ในกรณีที่ไม่มีชื่อ ServerName ระบุไว้

 

ข้อมูลอ้างอิง

 

 

 

 

 

Leave a Reply

Your email address will not be published.