host หลาย ๆ domain ไว้ที่ web server เครื่องเดียว ด้วย nginx

Prawit Tangmanopeanchai
3 min readSep 21, 2019

--

ตั้งใจจะทำ load balance web server โดยให้มีการทำ offload ssl ที่ตัว load balance ด้วย แต่ขออนุญาตทำเป็น 3 ตอน แต่ละตอนจะได้ไม่ยาวจนเกินไป

ในตอนนี้จะเป็นการทำให้ web server 1 เครื่องมีได้หลาย ๆ domain ก่อน

โดยก่อนอื่นก็ต้องทำการติดตั้งเจ้า nginx ลงไปก่อน (ตัวอย่างนี้ใช้เครื่องเป็น linux Ubuntu 18.04 LTS จาก google cloud platform) ด้วยคำสั่ง

sudo apt install nginx

แล้วก็ตอบ “Y” แล้วเคาะปุ่ม Enter เป็นอันว่าติดตั้งเสร็จเรียบร้อย ก็ตรวจสอบด้วยคำสั่ง “netstat -ntl” ก็จะเห็นว่ามี port 80 (web server) ขึ้นมาเป็น status “LISTEN” เพื่อรอให้บริการแล้ว

ลองใช้งาน web server ด้วยคำสั่ง “curl localhost” จะได้ผลลัพธ์ดังนี้

หรือถ้าไม่ชอบ text mode ก็นำหมายเลข ip ไปเปิดที่ internet browser ก็ได้

จากนี้เราจะให้เครื่องนี้ทำหน้าที่เป็น web server ให้กับอีก 2 domain name คือ webserver1.dyndns-home.com กับ webserver2.dyndns-home.com

จะเห็นว่าทั้ง 2 domain มีหมายเลข ip address เป็นตัวเดียวกัน คือ 34.87.33.237 โดยเราจะเก็บ file index.html ของ 2 domain นี้เอาไว้ใน directory ตามนี้

index.html ของ webserver1.dyndns-home.com จะไว้ใน directory /var/www/webserver1 ส่วนของ webserver2.dyndns.com ก็จะไว้ที่ /var/www/webserver2 โดยใน file index.html จะใส่เป็นชื่อ domain name เอาไว้

ถึงตอนนี้เราก็มีชื่อ domain name แล้ว รวมไปถึง home directory ที่ใช้สำหรับเก็บ content ของแต่ละ domain name และ file index.html

คราวนี้ก็ถึงเวลาต้องแก้ไข config file ของ nginx แล้ว
config file ของ nginx จะชื่อ “default” อยู่ใน /etc/nginx/sites-available

ในฐานะที่เป็น admin ที่ดีก็อย่าลืม backup config เดิมเก็บเอาไว้ก่อนนะครับ เผื่อพลาดจะได้เอากลับมาแก้ใหม่ได้

การเพิ่ม domain ให้ nginx รู้จักให้เพิ่มตามนี้เข้าไป

server {
listen 80;
root /var/www/webserver1;
index index.html index.htm;
server_name webserver1.dyndns-home.com;
}

root คือบอกว่า home directory ของ domain นี้อยู่ที่ไหน
index คือบอกว่า default file เวลาเปิด web เข้ามา domain นี้ให้อ่าน file ชื่ออะไร
server_name คือบอกว่า domain name ตาม section นี้มีชื่อว่าอะไร เราก็ทำให้ครบทั้ง 2 domain name

จาก config นี้จะเห็นว่ามี domain อยู่ทั้งหมด 3 domain ที่ให้บริการอยู่ที่ port 80 เหมือนกันทั้ง 3 domain โดยหาเรียกไปที่ ip address ของเครื่องก็จะไปอ่านที่ default_server ซึ่งจะอยู่ที่ /var/www/html

หากเรียกไปที่ webserver1.dyndns-home.com ก็จะไปเรียกที่ /var/www/webserver1

และหากเรียกไปที่ webserver2.dyndns-home.com ก็จะไปเรียกที่ /var/www/webserver2

จากนั้นก็ทำการ save

ถึงตอนนี้ตัว nginx เองจะยังไม่รู้จัก 2 domain ที่เพิ่งเพิ่มเข้าไป จนกว่าเราจะทำการ restart server ของ nginx หรือ reload service

แต่อย่าเพิ่งใจร้อน….. หากทำการ restart หรือ reload ตอนนี้ หากสิ่งที่เราแก้ไขไปใน config file มีข้อผิดพลาดจะให้ให้ web เรา start ไม่ขึ้น หากเป็นเครื่อง production จะงานเข้าได้ ดังนั้นก่อนที่จะทำการ restart หรือ reload เราควรทำการตรวจสอบ config ที่เราแก้ไขก่อนว่าถูกต้องหรือไม่ ด้วยคำสั่ง

sudo nginx -t

คำสั่งนี้ตัว nginx จะทำการตรวจสอบ config file ทุกตัวใน /etc/nginx/sites-available ว่ามี file ไหน config ผิดบ้างหรือไม่

เมื่อทุกอย่างพร้อมแล้วก็ทำการ restart หรือ reload ได้เลย (ในที่นี้เลือกใช้วิธี reload เพราะไม่อยากให้ service down)

sudo service nginx reload

ถึงคราวทดสอบ

หากเราเรียกไปที่ ip ของเครื่อง web server เราก็จะได้ default page ออกมา

ลองเรียก webserver1.dyndns-home.com บ้าง

จากนั้นก็เรียก webserver2.dyndns-home.com

เห็นไม๊ว่ามีเครื่องเดียวก็สามารถมีหลาย ๆ domain ได้ ง่ายนิดเดียว….

จริง ๆ ก็สามารถทำได้ด้วยวิธีอื่นเหมือนกัน เช่นสร้าง config file ต่างหากสำหรับแต่ละ domain name ก็ได้ ซึ่งวิธีนี้จะปลอดภัยกว่าด้วย เพราะการแก้ไข config ของแต่ละ domain ก็จะไม่มีผลกระทบกับ domain อื่น แต่พอดีวันนี้อยากลองวิธีนี้ 😆

--

--

Prawit Tangmanopeanchai
Prawit Tangmanopeanchai

Written by Prawit Tangmanopeanchai

Head of Cloud Implementation Unit at gosoft (Thailand)

No responses yet