วิธีตั้งค่า 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 ตอนเกือบปิดคืนเข้าด้วย ทำตอนคนเยอะเพื่อได้ช่วยเหลือได้ทันทีถ้าเกิดปัญหา
แสดงความคิดเห็น