🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

รู้จัก Apache Virtual Host: จัดการหลายโดเมนได้อย่างง่ายดาย

ในบทความที่แล้ว เราได้เรียนรู้เกี่ยวกับการตั้งค่าพื้นฐานของไฟล์ `httpd.conf` ซึ่งเป็นหัวใจสำคัญของ Apache กันไปแล้ว ตอนนี้คุณน่าจะสามารถเผยแพร่เว็บไซต์หนึ่งเว็บของตัวเองได้อย่างมั่นใจ แต่ถ้าคุณคิดว่า "นอกจาก `example.com` แล้ว อยากจะรันเว็บไซต์อื่นอย่าง `example.org` หรือ `blog.example.com` บนเซิร์ฟเวอร์เดียวกันด้วย!" จะต้องทำอย่างไร?

คำตอบคือฟังก์ชันที่เราจะแนะนำในวันนี้ นั่นคือ Virtual Host (เวอร์ชวลโฮสต์) ฟังก์ชันนี้ช่วยให้คุณสามารถใช้งานเว็บไซต์ที่แตกต่างกันหลายเว็บตามแต่ละโดเมนบนเซิร์ฟเวอร์เดียว (IP Address เดียว) ได้ ราวกับว่ามีเซิร์ฟเวอร์หลายเครื่อง

ในบทความนี้ เราจะอธิบายกลไกของ Virtual Host โดยเปรียบเทียบกับห้องในอพาร์ตเมนต์เพื่อให้เข้าใจง่าย และจะแนะนำขั้นตอนการทำให้โดเมนที่แตกต่างกัน 2 โดเมนทำงานบนเครื่อง local ของคุณ พร้อมโค้ดที่สามารถคัดลอกไปใช้ได้ทันที เมื่ออ่านบทความนี้จบ การจัดการหลายเว็บไซต์ก็จะไม่ใช่เรื่องน่ากลัวอีกต่อไป!


มาทำความเข้าใจกลไกของ Virtual Host กันเถอะ

วิธีที่ง่ายที่สุดในการทำความเข้าใจ Virtual Host คือการเปรียบเทียบเซิร์ฟเวอร์กับอพาร์ตเมนต์หนึ่งหลัง

เมื่อผู้เยี่ยมชม (เบราว์เซอร์) มาถึงอพาร์ตเมนต์ (IP Address ของเซิร์ฟเวอร์) แล้วแจ้งว่า "มาหาคุณสมชาย (`example.com`)" บริษัทจัดการอพาร์ตเมนต์ (Apache) ก็จะนำทางผู้เยี่ยมชมไปยังห้องของคุณสมชาย (เว็บไซต์ `example.com`) หากแจ้งว่า "มาหาคุณสมศรี (`example.org`)" ก็จะนำทางไปยังห้องของคุณสมศรี

กลไกที่ดู "ป้ายชื่อ (ชื่อโดเมน)" ของผู้เยี่ยมชมเพื่อสลับปลายทางนี้เรียกว่า Name-based Virtual Host ซึ่งเป็นวิธีที่นิยมใช้กันมากที่สุดในปัจจุบัน และในบทความนี้เราจะใช้แนวทางนี้ในการตั้งค่า


ขั้นตอนที่ 1: การเตรียมตัวสำหรับการตั้งค่า Virtual Host

ก่อนที่จะเริ่มเขียนไฟล์ตั้งค่าจริงๆ เราต้องเตรียมการบางอย่างก่อน

1-1. เปิดใช้งานไฟล์ตั้งค่าสำหรับ Virtual Host

ใน Apache เพื่อให้ไฟล์ตั้งค่าหลักอย่าง `httpd.conf` สะอาดเรียบร้อย จึงแนะนำให้เขียนการตั้งค่า Virtual Host แยกไว้ในไฟล์อื่น ก่อนอื่นให้เปิดไฟล์ `httpd.conf` แล้วมองหาบรรทัดต่อไปนี้ หากมีเครื่องหมาย `#` นำหน้าอยู่ (ซึ่งเป็นการคอมเมนต์ไว้) ให้ลบ `#` ออกเพื่อเปิดใช้งานบรรทัดนี้

# ในไฟล์ httpd.conf ให้ลบคอมเมนต์ (ลบ #) ที่บรรทัดนี้
Include conf/extra/httpd-vhosts.conf

บรรทัดนี้จะทำให้ Apache อ่านไฟล์ `conf/extra/httpd-vhosts.conf` และนำการตั้งค่า Virtual Host ที่เขียนไว้ในนั้นไปใช้งาน


1-2. สร้างไดเรกทอรีและไฟล์สำหรับแต่ละเว็บไซต์

ต่อไป เราจะสร้างโฟลเดอร์สำหรับ 2 เว็บไซต์ คือ `example.com` และ `example.org` รวมถึงไฟล์ HTML ที่จะเป็นหน้าแรกของแต่ละเว็บ ในตัวอย่างนี้ เราจะสร้างโฟลเดอร์เฉพาะในตำแหน่งอื่นที่ไม่ใช่ `htdocs` เพื่อให้ง่ายต่อการจัดการข้อมูลเว็บไซต์

  1. สร้างโฟลเดอร์สำหรับแต่ละเว็บไซต์ในตำแหน่งที่คุณต้องการบนเซิร์ฟเวอร์ (เช่น /Users/YourName/Sites หรือ C:\Users\YourName\Sites)
    • sites/example.com/public_html
    • sites/example.org/public_html
  2. ภายในโฟลเดอร์ `public_html` ของแต่ละเว็บ ให้สร้างไฟล์ `index.html` ง่ายๆ เพื่อให้รู้ว่ากำลังแสดงผลเว็บไซต์ใดอยู่

เนื้อหาของ `sites/example.com/public_html/index.html`:

<!DOCTYPE html>
<html>
<head><title>ยินดีต้อนรับ!</title></head>
<body><h1>นี่คือหน้าของ example.com</h1></body>
</html>

เนื้อหาของ `sites/example.org/public_html/index.html`:

<!DOCTYPE html>
<html>
<head><title>ยินดีต้อนรับ!</title></head>
<body><h1>นี่คือหน้าของ example.org</h1></body>
</html>

ขั้นตอนที่ 2: ตั้งค่า Virtual Host (ในไฟล์ httpd-vhosts.conf)

เมื่อเตรียมการเสร็จแล้ว ก็ถึงเวลาแก้ไขไฟล์ `conf/extra/httpd-vhosts.conf` กันแล้ว เราจะเขียน "ข้อมูลห้อง" ของแต่ละเว็บไซต์ลงในไฟล์นี้

เริ่มจากการตั้งค่าของ `example.com` ให้เพิ่มบล็อกโค้ดต่อไปนี้ลงใน `httpd-vhosts.conf` (คุณสามารถลบหรือคอมเมนต์ตัวอย่างเดิมที่มีอยู่แล้วได้)

<VirtualHost *:80>
    # ชื่อโดเมนหลักของ Virtual Host นี้
    ServerName example.com
    # สามารถระบุชื่ออื่นได้ เช่น แบบมี www
    ServerAlias www.example.com
    # ตำแหน่งที่เก็บไฟล์ของเว็บนี้ (พาธของโฟลเดอร์ที่สร้างไว้ก่อนหน้า)
    DocumentRoot "/Users/YourName/Sites/example.com/public_html"
    # Error Log เฉพาะสำหรับเว็บนี้
    ErrorLog "/Users/YourName/Sites/example.com/error_log"
    # Access Log เฉพาะสำหรับเว็บนี้
    CustomLog "/Users/YourName/Sites/example.com/access_log" common
    # การตั้งค่าสิทธิ์การเข้าถึงไดเรกทอรี
    <Directory "/Users/YourName/Sites/example.com/public_html">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

※ โปรดเปลี่ยนพาธต่างๆ เช่น `DocumentRoot` ให้ตรงกับสภาพแวดล้อมของคุณ


ต่อไป ให้เพิ่มการตั้งค่าของ `example.org` ด้วย โดยเขียนไว้ใต้บล็อกโค้ดก่อนหน้านี้ในลักษณะเดียวกัน

<VirtualHost *:80>
    ServerName example.org
    DocumentRoot "/Users/YourName/Sites/example.org/public_html"
    ErrorLog "/Users/YourName/Sites/example.org/error_log"
    CustomLog "/Users/YourName/Sites/example.org/access_log" common
    <Directory "/Users/YourName/Sites/example.org/public_html">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

ขั้นตอนที่ 3: การทดสอบบนเครื่อง Local (ด้วยไฟล์ hosts)

ตอนนี้การตั้งค่า Apache เสร็จเรียบร้อยแล้ว แต่ถ้าลองเข้า `example.com` ตอนนี้เลย ก็จะยังไม่เชื่อมต่อมาที่คอมพิวเตอร์ของคุณ เพื่อทดสอบสิ่งนี้บนเครื่อง local เราต้องแก้ไขไฟล์ `hosts` บนคอมพิวเตอร์ของคุณเพื่อบังคับให้ `example.com` ชี้มาที่คอมพิวเตอร์เครื่องนี้ (`127.0.0.1`)

ตำแหน่งของไฟล์ `hosts`:

เปิดไฟล์นี้ด้วยสิทธิ์ผู้ดูแลระบบ (administrator) แล้วเพิ่มบรรทัดต่อไปนี้ต่อท้ายไฟล์

127.0.0.1   example.com
127.0.0.1   www.example.com
127.0.0.1   example.org

ขั้นตอนที่ 4: รีสตาร์ทและตรวจสอบ Apache

การตั้งค่าทั้งหมดเสร็จสิ้นแล้ว! สุดท้าย ให้ตรวจสอบว่าการตั้งค่า Apache ไม่มีข้อผิดพลาด (syntax check) และหากไม่มีปัญหา ให้รีสตาร์ทเซิร์ฟเวอร์

# ตรวจสอบ Syntax (ถ้าไม่มีข้อผิดพลาดขึ้นก็ OK)
httpd -t

# รีสตาร์ท Apache (กรณี Windows)
httpd.exe -k restart

# รีสตาร์ท Apache (กรณี macOS Homebrew)
brew services restart httpd

# รีสตาร์ท Apache (กรณี Linux)
sudo systemctl restart apache2 # หรือ httpd

หลังจากรีสตาร์ท ลองเข้า `http://example.com` และ `http://example.org` ผ่านเบราว์เซอร์ดู หากแสดงผลเป็น "นี่คือหน้าของ example.com" และ "นี่คือหน้าของ example.org" ตามลำดับ ก็ถือว่าประสบความสำเร็จอย่างงดงาม!


ตัวอย่างประยุกต์: การใช้งาน Subdomain

Virtual Host ยังสามารถใช้กับการจัดการ Subdomain (เช่น `blog.example.com`) ได้อีกด้วย วิธีการตั้งค่าเหมือนเดิมทุกประการ เพียงแค่เพิ่มบล็อก `<VirtualHost>` ใหม่เข้าไปใน `httpd-vhosts.conf`

<VirtualHost *:80>
    ServerName blog.example.com
    DocumentRoot "/Users/YourName/Sites/blog.example.com/public_html"
    # ... เขียนการตั้งค่า Log และ Directory ในลักษณะเดียวกัน ...
</VirtualHost>

แน่นอนว่าหลังจากนี้ อย่าลืมเพิ่ม `127.0.0.1 blog.example.com` ในไฟล์ `hosts` และรีสตาร์ท Apache ด้วยนะครับ


สรุป

เยี่ยมมาก! ครั้งนี้เราได้เรียนรู้เกี่ยวกับฟังก์ชัน Virtual Host ของ Apache ที่ช่วยให้สามารถจัดการหลายโดเมนบนเซิร์ฟเวอร์เดียวได้ ตั้งแต่กลไกการทำงานไปจนถึงวิธีการตั้งค่าอย่างละเอียด หวังว่าการเปรียบเทียบกับอพาร์ตเมนต์จะช่วยให้คุณเห็นภาพความสัมพันธ์ระหว่างเซิร์ฟเวอร์และโดเมนได้ชัดเจนขึ้น

เมื่อคุณเชี่ยวชาญการใช้ Virtual Host แล้ว คุณจะสามารถจัดการโปรเจกต์ต่างๆ ที่มีวัตถุประสงค์ต่างกันได้อย่างมีประสิทธิภาพ ไม่ว่าจะเป็นเว็บไซต์ส่วนตัว, เว็บไซต์ portfolio, หรือเว็บไซต์โปรเจกต์ที่กำลังพัฒนา ทักษะการจัดการเซิร์ฟเวอร์ของคุณได้เลเวลอัปขึ้นอีกขั้นแล้ว!

เอาล่ะ เมื่อคุณสามารถ "แบ่งห้อง" บนเซิร์ฟเวอร์ได้แล้ว ต่อไปคุณอาจจะอยากเรียนรู้วิธีการตั้งค่า "การตกแต่งภายใน" และ "กฎระเบียบ" ของแต่ละห้องให้ละเอียดขึ้นใช่ไหม? หัวข้อถัดไปคือคู่มือฉบับสมบูรณ์ของไฟล์วิเศษที่ช่วยให้ควบคุมสิ่งต่างๆ ในระดับไดเรกทอรีได้ นั่นคือ `.htaccess` รอติดตามชมได้เลย!

คู่มือ .htaccess ฉบับสมบูรณ์: วิธีใช้ Redirect, URL Rewriting และการจำกัดการเข้าถึง