วิธีตั้งค่า Virtual Host และ Subdomain ผ่าน Apache และ Nginx ตั้งแต่พื้นฐาน

โดย วุฒิชัย ศรีวิชัย · 26 กรกฎาคม 2569
ภาพประกอบเรื่อง วิธีตั้งค่า Virtual Host และ Subdomain ผ่าน Apache และ Nginx ตั้งแต่พื้นฐาน
วิธีตั้งค่า Virtual Host และ Subdomain ผ่าน Apache และ Nginx ตั้งแต่พื้นฐาน

Virtual Host คืออะไร และเราควรใช้มันไหม

ถ้าคุณเป็นเจ้าของเซิร์ฟเวอร์แล้ว คำว่า Virtual Host คงไม่ใช่เรื่องแปลกใจ แต่ถ้ายังไม่เข้าใจลึก ฉันจะอธิบายเรื่องนี้ให้เข้าใจก่อน

Virtual Host หมายถึง การจัดการโดเมนหลายตัวบนเซิร์ฟเวอร์ตัวเดียว โดยไม่ต้องมีไอพีแอดเดรสแยกกันสำหรับแต่ละโดเมน ซึ่งช่วยประหยัดต้นทุนระยะยาวได้มากพอสมควร ตัวอย่างเช่น คุณอาจต้องการใช้เซิร์ฟเวอร์ตัวเดียวรองรับ example.com, blog.example.com และ shop.example.com ทั้งหมดด้วยไอพีเดียวกัน

Subdomain นั่นต่างหากจากเรื่องที่พูดถึง มันคือการสร้างโดเมนรองขึ้นมาจากโดเมนหลัก เช่น api.example.com หรือ admin.example.com ซึ่งจะตรงกับเนื้อหาหรือหน้าเว็บที่แตกต่างกันไป

ความแตกต่างที่ควรรู้: Virtual Host เป็นการจัดการระดับเซิร์ฟเวอร์ (Apache/Nginx) ส่วน Subdomain เป็นการจัดการระดับ DNS แต่โดยปกติเวลาตั้งค่า มักทำพร้อมกันอยู่แล้ว

ตรวจสอบสิ่งที่เตรียมไว้ก่อนเริ่มต้น

ก่อนคุณจะลงมือตั้งค่า ให้ตรวจสอบสิ่งนี้ให้แน่นอน:

  • ระบบเซิร์ฟเวอร์ - คุณใช้ Apache หรือ Nginx หรือเซิร์ฟเวอร์ตัวอื่น
  • สิทธิ์แอดมิน - คุณต้องมี SSH access และสามารถใช้ sudo ได้
  • ชื่อโดเมน - ต้อง point ชี้ไปยัง IP ของเซิร์ฟเวอร์แล้ว
  • Document Root - รู้ว่าไฟล์เว็บของแต่ละโดเมนอยู่ที่ไหน (มักคือ /var/www/)
  • Backup ก่อนแก้ไข - สำคัญมากนี่ โปรดสำรองไฟล์คอนฟิก

ปัญหาที่พบบ่อยที่สุด: ลืมเอา Backup ไว้ แล้วเซิร์ฟเวอร์พังหนักในระหว่างการปรับปรุง

ตั้งค่า Virtual Host บน Apache

ขั้นตอนที่ 1: สร้าง Directory สำหรับเว็บไซต์

สมมติว่าเราจะสร้างเว็บไซต์สองตัว ให้ทำแบบนี้:

สำหรับโดเมนแรก (example.com)

  • สร้างโฟลเดอร์: /var/www/example.com/public_html
  • สร้างโฟลเดอร์: /var/www/example.com/logs

สำหรับโดเมนที่สอง (another.com)

  • สร้างโฟลเดอร์: /var/www/another.com/public_html
  • สร้างโฟลเดอร์: /var/www/another.com/logs

อย่าลืมตั้งค่าสิทธิ์ให้เหมาะสม:

sudo chown -R www-data:www-data /var/www/example.com

ขั้นตอนที่ 2: สร้าง Virtual Host Configuration

ไปที่ /etc/apache2/sites-available/ และสร้างไฟล์ใหม่ชื่อ example.com.conf

เปิดด้วย nano หรือ vim:

sudo nano /etc/apache2/sites-available/example.com.conf

แล้วเพิ่มเนื้อหาข้างล่างนี้:

<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin [email protected]
DocumentRoot /var/www/example.com/public_html
ErrorLog /var/www/example.com/logs/error.log
CustomLog /var/www/example.com/logs/access.log combined
</VirtualHost>

เรื่องที่ต้องระวัง: ตรวจสอบให้แน่ใจว่า DocumentRoot ถูกต้อง ผิดไปนิดเดียวเว็บก็ไม่ขึ้น

ขั้นตอนที่ 3: เปิดใช้งาน Virtual Host

ทำการเปิดใช้งานไฟล์ configuration ด้วยคำสั่ง:

sudo a2ensite example.com.conf

จากนั้นทดสอบไวยากรณ์ของ Apache ว่าถูกต้องหรือไม่:

sudo apache2ctl configtest

ถ้าออกมาว่า "Syntax OK" แสดงว่าสำเร็จ ถ้าไม่ก็ต้องกลับไปตรวจสอบไฟล์

สุดท้ายรีสตาร์ท Apache:

sudo systemctl restart apache2

ขั้นตอนที่ 4: สร้าง Virtual Host เพิ่มเติม

ทำซ้ำเหมือนเดิมสำหรับ another.com ด้วย แค่เปลี่ยนชื่อไฟล์และ Path ให้ตรงกัน

sudo nano /etc/apache2/sites-available/another.com.conf

เพิ่มเนื้อหา แล้วเปิดใช้งาน:

sudo a2ensite another.com.conf
sudo apache2ctl configtest
sudo systemctl restart apache2

ตั้งค่า Virtual Host บน Nginx

ถ้าเซิร์ฟเวอร์ของคุณใช้ Nginx วิธีการจะต่างไปบ้าง Nginx ใช้คำศัพท์ว่า Server Block แทน Virtual Host แต่ทำงานเหมือนกัน

ขั้นตอนที่ 1: เตรียมโฟลเดอร์เหมือนเดิม

สร้าง Directory และ log เหมือนที่ทำกับ Apache

sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/example.com/logs

ขั้นตอนที่ 2: สร้าง Server Block Configuration

ไปที่ /etc/nginx/sites-available/ และสร้างไฟล์ใหม่:

sudo nano /etc/nginx/sites-available/example.com

เพิ่มเนื้อหาข้างล่าง:

server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public_html;
index index.html index.php;
access_log /var/www/example.com/logs/access.log;
error_log /var/www/example.com/logs/error.log;
}

ขั้นตอนที่ 3: เปิดใช้งาน Server Block

สร้าง Symbolic Link:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

ทดสอบไวยากรณ์:

sudo nginx -t

ถ้าออกมาว่า "syntax is ok" ก็รีสตาร์ท Nginx:

sudo systemctl restart nginx

ความแตกต่างสำคัญระหว่าง Apache กับ Nginx

Apache จะประมวลผล .htaccess และ Modules ไดนามิก ขณะที่ Nginx ไม่มีลักษณะนี้ ถ้าคุณใช้ PHP ต้องตั้งค่า PHP-FPM แยกต่างหาก บน Apache บางเวอร์ชันอาจใช้ mod_php ได้เลย

ตั้งค่า Subdomain (ไม่ว่าจะ Apache หรือ Nginx)

Subdomain เหมือนกับ Virtual Host ทั่วไป แค่ชื่อต่างกัน เช่น:

สำหรับ Apache:

<VirtualHost *:80>
ServerName api.example.com
ServerAlias www.api.example.com
DocumentRoot /var/www/api.example.com/public_html
</VirtualHost>

สำหรับ Nginx:

server {
listen 80;
server_name api.example.com www.api.example.com;
root /var/www/api.example.com/public_html;
}

ประเด็นสำคัญ: Subdomain ต้อง point ชี้ไปยัง IP ของเซิร์ฟเวอร์ผ่าน DNS ก่อน ซึ่งทำได้โดยการเพิ่ม A Record หรือ CNAME Record ในทะเบียน DNS ของโดเมน

ปัญหาที่พบบ่อยและวิธีแก้ไข

ปัญหา: "403 Forbidden"

สาเหตุ: สิทธิ์ไฟล์ไม่ถูกต้อง หรือ DocumentRoot ไม่มี index file

แนวทางแก้ไข:

  • ตรวจสอบสิทธิ์โฟลเดอร์: sudo chmod 755 /var/www/example.com/public_html
  • ตรวจสอบสิทธิ์ไฟล์: sudo chmod 644 /var/www/example.com/public_html/*
  • สร้าง index.html เพื่อทดสอบ

ปัญหา: "404 Not Found" หรือเว็บไม่ขึ้น

สาเหตุ: DocumentRoot ไม่ถูกต้อง หรือชื่อไฟล์ Configuration ผิด

แนวทางแก้ไข:

  • ตรวจสอบ DocumentRoot ว่า Path ถูกต้อง
  • ตรวจสอบว่า index file มีอยู่จริง
  • ดูที่ error log: sudo tail -f /var/www/example.com/logs/error.log

ปัญหา: Subdomain ไม่ทำงาน

สาเหตุ: DNS ยังไม่ชี้ไปที่เซิร์ฟเวอร์ หรือ Configuration ยังไม่บันทึก

แนวทางแก้ไข:

  • ตรวจสอบ DNS record ว่า point ไปยังเซิร์ฟเวอร์แล้วหรือไม่ โดยใช้ nslookup หรือ dig
  • รอ 24-48 ชั่วโมงให้ DNS Propagate
  • ตรวจสอบ Configuration ของเซิร์ฟเวอร์ว่าถูกต้อง

ปัญหา: Nginx ไม่ Load Configuration ใหม่

สาเหตุ: File ยังไม่ถูก Enable หรือ Nginx ยังไม่ Reload

แนวทางแก้ไข:

  • ตรวจสอบว่ามี Symbolic Link ใน sites-enabled หรือไม่
  • ทำการ test: sudo nginx -t
  • Reload Nginx: sudo systemctl reload nginx (restart ถ้า reload ไม่ได้)

เคล็ดลับการดูแลระบบที่ควรรู้

1. เก็บ Backup ของ Configuration

ก่อนแก้ไขไฟล์สำคัญ ให้ backup ไว้เสมอ:

sudo cp /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/example.com.conf.bak

2. ใช้ Version Control

ถ้าคุณจัดการเซิร์ฟเวอร์มากกว่าหนึ่งตัว ลองใช้ Git หรือระบบ Version Control อื่นๆ เพื่อติดตามการเปลี่ยนแปลง

3. ตรวจสอบ Error Log อย่างสม่ำเสมอ

ปัญหาส่วนใหญ่จะบันทึกอยู่ใน error log ดูแบบนี้:

sudo tail -50 /var/log/apache2/error.log
sudo tail -50 /var/log/nginx/error.log

4. ใช้ Monitoring Tools

ติดตั้ง Monitoring Tools เช่น htop หรือ New Relic เพื่อจับปัญหาได้เร็วขึ้น

5. ตั้งค่า SSL/HTTPS

อย่าลืมว่า HTTP ไม่ปลอดภัย ใช้ SSL Certificate (เช่น Let's Encrypt ที่ฟรี) เพื่อเปลี่ยนเป็น HTTPS แล้ว Redirect HTTP ไปที่ HTTPS

การทดสอบว่า Virtual Host ทำงานถูกต้อง

วิธีที่ 1: ใช้ Browser

เพียงเข้าไปที่เว็บไซต์ผ่าน browser ดูว่าขึ้นหน้าเว็บถูกต้องหรือไม่

วิธีที่ 2: ใช้ curl

curl -H "Host: example.com" http://your-server-ip

วิธีนี้มีประโยชน์ถ้า DNS ยังไม่ Update เพราะมันจะ Request ตรงไปยัง IP โดยตั้งค่า Host Header ให้เป็นชื่อโดเมนที่ต้องการ

วิธีที่ 3: ตรวจสอบ Process

sudo netstat -tulpn | grep apache2
sudo netstat -tulpn | grep nginx

ดูว่า Port 80 และ 443 ยังเปิดอยู่หรือไม่

สรุปคำเตือนที่สำคัญ

ขั้นตอนการตั้งค่า Virtual Host และ Subdomain ไม่ยากนัก แต่ความผิดพลาดเล็กน้อยอาจทำให้เซิร์ฟเวอร์ขัดข้อง หลัก ระวังสิ่งต่อไปนี้:

  • ลืม Backup - ทำให้กลับไม่ได้เมื่อเกิดปัญหา
  • Path ไม่ตรงกัน - DocumentRoot หรือ Root ผิดไป
  • สิทธิ์ไฟล์ผิด - เซิร์ฟเวอร์เข้าไม่ได้โฟลเดอร์
  • DNS ยังไม่ Update - รอบรรด Subdomain บ่อยครั้ง
  • ไม่ Check ไวยากรณ์ - Config มีข้อผิดพลาดเล็กน้อยทำให้เซิร์ฟเวอร์ดับ
  • ไม่ดู Error Log - นอนแบบไม่รู้ว่าเป็นไรเมื่อมีปัญหา

ทำให้ดี ทดสอบบ่อย และอย่าตั้งค่าบนเซิร์ฟเวอร์ Production ตอนเกือบปิดคืนเข้าด้วย ทำตอนคนเยอะเพื่อได้ช่วยเหลือได้ทันทีถ้าเกิดปัญหา

แสดงความคิดเห็น

ร่วมแสดงความคิดเห็นได้ที่ด้านล่าง — เราอ่านทุกความเห็น