วิธีการหนึ่งสำหรับคนที่ต้องการมีเว็บไซต์บนอินเตอร์เน็ตเป็นของตัวเอง คือใช้บริการ 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 ระบุไว้
ข้อมูลอ้างอิง