การสร้าง virtualhost บน Apache2 web server (2.4.x ขึ้นไป)

ขอเล่าเรื่องการสร้าง virtualhost บน Apache2 web server (2.4.x ขึ้นไป) อย่างง่ายๆ แต่ก็เป็นผลมาจากการเปลี่ยนจาก ubuntu 12.04 server ไปเป็น ubuntu 14.04 server เมื่อเร็วๆนี้

Apache 2.4.x เช่น 2.4.7 ที่มาพร้อม ubuntu 14.04 server จะมีการจัดการเรื่อง Document root ที่แตกต่างจากเวอร์ชั่นที่ต่ำกว่า เช่น Document root จะอยู่ที่ /var/www/html แทนที่จะเป็น /var/www เหมือนเดิม ดังนั้นเมื่อทำ virtualhost จึงต้องมีการวางไดเรกทอรีไว้ที่ /var/www และทำ virtualhost เช่น www.example.com และชี้ documentroot ที่ /var/www/www.example.com

มาดูกันครับว่าจะต้องทำอย่างไรบ้าง เริ่มต้นที่หลังจากติดตั้ง ubuntu 14.04 เสร็จแล้ว พร้อมทั้งได้ติดตั้ง packages LAMP หากไม่แน่ใจก็ตรวจสอบด้วยคำสั่ง sudo tasksel
ในบทความมีการอ้างถึง editor ที่ใช้แก้ไขไฟล์ชื่อ vi หากไม่คุ้นเคยวิธีใช้ก็ให้เปลี่ยนเป็นคำว่า nano จะเป็น full screen editor ใช้ง่ายกว่า

ตรวจสอบว่าเรามีโดเมนเนมแล้ว (check domain name)
mama@ubuntu:$ host www.example.com
www.example.com is an alias for iserver.example.com.
iserver.example.com has address 10.0.100.9

เข้าไปที่ไดเรกทอรี
mama@ubuntu:$ cd /var/www/

สร้างไดเรกทอรีชื่อ www.example.com
mama@ubuntu:/var/www$ sudo mkdir www.example.com

สร้างไฟล์ตัวอย่างของเว็บไซต์
mama@ubuntu:/var/www$ sudo vi www.example.com/index.php
มีข้อความเพียง 1 บรรทัด
<?php echo “WWW Hello, world!”; ?>

ใช้คำสั่งแสดงรายการ จะเห็น
mama@ubuntu:/var/www$ ls www.example.com/
index.php

ใช้คำสั่งแสดงข้อมูลในไฟล์ จะเห็น
mama@ubuntu:/var/www$ cat www.example.com/index.php
<?php echo “WWW Hello, world!”; ?>

เข้าไปไดเรกทอรีสำหรับจัดการ config site
mama@ubuntu:/var/www/html$ cd /etc/apache2/sites-available

ใช้คำสั่งแสดงรายการ จะเห็น
mama@ubuntu:/etc/apache2/sites-available$ ls
000-default.conf  default-ssl.conf

สร้างไฟล์สำหรับ config virtual host ชื่อมี .conf ต่อท้ายด้วย
mama@ubuntu:/etc/apache2/sites-available$ sudo cp 000-default.conf www.example.com.conf

แก้ไขไฟล์ www.example.com.conf
mama@ubuntu:/etc/apache2/sites-available$ sudo vi www.example.com.conf
แก้ไขเฉพาะบรรทัดข้างล่างนี้
NameVirtualHost www.example.com:80
<VirtualHost www.example.com:80>
ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/www.example.com

สั่งให้ apache2 รับ site ใหม่
mama@ubuntu:/etc/apache2/sites-available$ sudo a2ensite www.example.com

สั่ง reload apache2
mama@ubuntu:/etc/apache2/sites-available$ sudo service apache2 reload

ทดสอบ www.example.com ด้วยคำสั่ง w3m
mama@ubuntu:/etc/apache2/sites-available$ w3m http://www.example.com
จะเห็นหน้าเว็บเพจ
WWW Hello, world!
กด Ctrl+c เลิกดู

หากทำอีก site ชื่อ iserver.example.com ก็เลียนแบบด้านบน และเมื่อทดสอบด้วยคำสั่ง w3m
mama@ubuntu:/etc/apache2/sites-available$ w3m http://iserver.example.com
ก็จะได้เช่นเดียวกัน (ควรใส่ข้อความให้เกิดความแตกต่าง)
ISERVER Hello, world!

ต่อไปคุณต้องคิดต่อเองว่าถ้าต้องใช้ https ด้วยหรือไม่ ถ้าต้องการ จะใช้ self-signed certificate ที่ apache2 ให้มา หรือว่า จะซื้อ trusted root certificate ที่มีขายในอินเทอร์เน็ต

เริ่มต้นตรวจสอบ จะพบว่า https ยังใช้งานไม่ได้ ควรที่จะเกิด error ไม่สามารถเข้าถึงได้ เพราะเรายังไม่ได้ enable https บน www.example.com
จะเห็นแบบนี้
mama@ubuntu:/etc/apache2/sites-available$ w3m https://www.example.com
w3m: Can’t load https://www.example.com.

เราสามารถ enable https โดยใช้คำสั่ง
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo service apache2 reload

w3m https://www.example.com
ก็ควรที่จะเชื่อมต่อไปยัง web server ได้ โดยที่จะยังมีคำเตือนในเรื่อง certificate ที่ไม่ถูกต้อง เนื่องจากเป็น self-signed certificate แต่จะเข้าไปยังเว็บเพจได้
จะเห็นแบบนี้
Apache2 Ubuntu Default Page
It work!

ต่อไปก็จะทำให้ใช้ https ได้แบบใช้ self-signed certificate
ให้ copy ไฟล์ www.example.com.cof เป็นอีกไฟล์ให้มีชื่อ ssl ด้วยเพื่อให้จำง่าย
mama@ubuntu:/etc/apache2/sites-available$ sudo cp www.example.com.conf www.example.com-ssl.conf

แก้ไขไฟล์ www.example.com-ssl.conf
mama@ubuntu:/etc/apache2/sites-available$ sudo vi www.example.com-ssl.conf
แก้ไขสองบรรทัดแรกจาก
NameVirtualHost www.example.com:80
<VirtualHost www.example.com:80>
เป็น
NameVirtualHost www.example.com:443
<VirtualHost www.example.com:443>
และเพิ่ม
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
ก่อนบรรทัด
</VirtualHost>
หลังจากนั้น save file

และใช้คำสั่งเพื่อให้ apache2 รับ site ใหม่
sudo a2ensite www.example.com-ssl

สั่ง reload apache2
sudo service apache2 reload

หลังจากนั้นเราก็จะสามารถเข้าถึง URL https://www.example.com ได้อย่างถูกต้อง