Nginx เป็นเว็บเซิร์ฟเวอร์ที่มีประสิทธิภาพสูง และยืดหยุ่นในการจัดการหลายเว็บไซต์บนเซิร์ฟเวอร์เดียวกัน ด้วยระบบ Server Blocks ที่ทรงพลัง คุณสามารถโฮสต์เว็บไซต์หลายโดเมนได้พร้อมกัน โดยแต่ละโดเมนมีการตั้งค่า SSL certificate, document root, และ logging ที่แตกต่างกัน บทความนี้จะแนะนำวิธีการสร้าง Multi-domain Setup บน Nginx อย่างเป็นระบบและ best practices ในการจัดการเพื่อให้ได้ประสิทธิภาพสูงสุด
ความเข้าใจพื้นฐานเกี่ยวกับ Server Block ใน Nginx
Server Block ในเซิร์ฟเวอร์ Nginx เป็นส่วนของการตั้งค่า (configuration) ที่ใช้สำหรับกำหนดวิธีการจัดการคำขอ HTTP ที่เข้ามาสำหรับโดเมนหนึ่งๆ แต่ละ Server Block สามารถทำหน้าที่เป็น virtual host ได้ คล้ายกับการสร้างเซิร์ฟเวอร์แบบ virtual ภายในเซิร์ฟเวอร์เดียว
ความแตกต่างหลักระหว่าง Nginx และ Apache คือ Nginx ใช้ Server Blocks แทน Virtual Hosts โดยแนวคิดที่ว่าคุณสามารถสร้าง “เซิร์ฟเวอร์เสมือน” (Virtual Server) ได้หลายตัวบนเซิร์ฟเวอร์เดียว เมื่อมีการเข้าถึงเว็บไซต์ Nginx จะตรวจสอบ Server Host header ของคำขอ และเลือกการตั้งค่าที่สอดคล้องกัน
วิธีการสร้าง Server Blocks สำหรับโดเมนแต่ละตัว
วิธีที่ดีที่สุดในการจัดการหลายโดเมนบน Nginx คือการสร้าง Server Block แยกต่างหากสำหรับแต่ละโดเมน โครงสร้างนี้ช่วยให้จัดการและดูแลรักษาได้ง่าย และลดความเสี่ยงในการเกิดข้อผิดพลาด
ขั้นแรก ให้สร้างไดเรกทอรี่เพื่อเก็บไฟล์การตั้งค่า Server Blocks ของแต่ละโดเมน
sudo mkdir -p /etc/nginx/sites-available
sudo mkdir -p /etc/nginx/sites-enabled
จากนั้น สร้างไฟล์การตั้งค่าสำหรับโดเมนแรก เช่น example1.com
sudo nano /etc/nginx/sites-available/example1.com
ใส่เนื้อหาต่อไปนี้ลงในไฟล์การตั้งค่า:
server {
listen 80;
listen [::]:80;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}
สำหรับโดเมนที่สอง เช่น example2.com ให้สร้างไฟล์คล้ายกัน:
server {
listen 80;
listen [::]:80;
server_name example2.com www.example2.com;
root /var/www/example2.com/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}
หลังจากสร้างไฟล์การตั้งค่าแล้ว ให้เปิดใช้งานด้วยการสร้าง symbolic link จากไดเรกทอรี่ sites-available ไปยัง sites-enabled
sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/
การใช้ Shared Server Block สำหรับหลายโดเมน
ในบางกรณี คุณอาจต้องการให้หลายโดเมนชี้ไปยังเนื้อหาเดียวกัน ตัวอย่างเช่น เมื่อ example1.com และ example1.co.th ต้องการให้เสิร์ฟเนื้อหาเดียวกัน คุณสามารถสร้าง Server Block เดียวที่จัดการได้หลายชื่อโดเมน
server {
listen 80;
listen [::]:80;
server_name example1.com www.example1.com example1.co.th www.example1.co.th;
root /var/www/example1.com/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}
การตั้งค่านี้มีประโยชน์เมื่อต้องการจัดการหลายชื่อโดเมนเดียวกันโดยไม่ต้องสร้าง Server Block หลาย ตัว แต่หากต้องการ document root หรือการตั้งค่าแตกต่างกันสำหรับแต่ละโดเมน ให้สร้าง Server Block แยกต่างหากแทน
Document Root ที่แตกต่างกันสำหรับแต่ละโดเมน
เมื่อจัดการหลายเว็บไซต์บนเซิร์ฟเวอร์เดียว การมี document root ที่แยกต่างหากสำหรับแต่ละโดเมนจะช่วยให้การจัดการไฟล์และการป้องกันความปลอดภัยดีขึ้น
ขั้นแรก ให้สร้างโครงสร้างไดเรกทอรี่:
sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example1.com/logs
sudo mkdir -p /var/www/example2.com/html
sudo mkdir -p /var/www/example2.com/logs
จากนั้น ตั้งค่าสิทธิ์ (permissions) ให้ถูกต้อง:
sudo chown -R www-data:www-data /var/www/example1.com
sudo chown -R www-data:www-data /var/www/example2.com
sudo chmod -R 755 /var/www/example1.com
sudo chmod -R 755 /var/www/example2.com
ตอนนี้ คุณได้ document root ที่แยกต่างหากสำหรับแต่ละโดเมนแล้ว ในไฟล์การตั้งค่า Server Block ให้ชี้ไปยังไดเรกทอรี่ที่ถูกต้องด้วยคำสั่ง root
การตั้งค่า SSL Certificates สำหรับหลายโดเมน
ในยุคปัจจุบัน HTTPS จำเป็นอย่างยิ่งสำหรับเว็บไซต์ทั้งหมด Nginx รองรับ Server Name Indication (SNI) ซึ่งช่วยให้สามารถให้บริการหลาย SSL certificates บนที่อยู่ IP เดียวได้
ขั้นแรก ให้สร้าง SSL certificate สำหรับแต่ละโดเมน ด้วยการใช้ Let’s Encrypt ซึ่งเป็น Certificate Authority ฟรีที่เชื่อถือได้
sudo certbot certonly --standalone -d example1.com -d www.example1.com
sudo certbot certonly --standalone -d example2.com -d www.example2.com
หลังจากสร้าง SSL certificates แล้ว ให้อัปเดตไฟล์การตั้งค่า Server Block เพื่อรวม HTTPS:
server {
listen 80;
listen [::]:80;
server_name example1.com www.example1.com;
# Redirect HTTP to HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html index.htm index.nginx-debian.html;
ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
try_files $uri $uri/ =404;
}
}
Let’s Encrypt สำหรับหลายโดเมน
Let’s Encrypt ช่วยให้คุณสามารถสร้าง SSL certificates ฟรีสำหรับหลายโดเมนด้วย wildcard certificate หรือ multi-domain certificate ได้
สำหรับ wildcard certificate ที่ครอบคลุมโดเมนทั้งหมด:
sudo certbot certonly --dns-cloudflare -d example1.com -d *.example1.com
หากต้องการอัปเดต certificates โดยอัตโนมัติ ให้ตั้งค่า cron job:
0 12 * * * /usr/bin/certbot renew --quiet
การตั้งค่า Default Server Block
เมื่อมีหลาย Server Blocks บน Nginx คุณควรตั้งค่า default server block เพื่อจัดการคำขอที่ไม่ตรงกับโดเมนใดๆ
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444; # Close connection
}
การตั้งค่า default_server นี้จะปฏิเสธคำขอทั้งหมดที่ไม่ตรงกับชื่อโดเมนที่กำหนดไว้ในไฟล์การตั้งค่า
การจัดการโดเมนที่ไม่รู้จัก
หากต้องการให้ Nginx แสดงหน้า error page เมื่อมีการเข้าถึงโดเมนที่ไม่รู้จัก ให้ตั้งค่าดังนี้:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
error_page 404 /404.html;
location = /404.html {
internal;
}
}
Domain-Specific Logging
สำหรับแต่ละโดเมน คุณควรเก็บ logs แยกต่างหากเพื่อที่จะสามารถติดตามและวิเคราะห์ traffic ของแต่ละเว็บไซต์ได้
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
access_log /var/www/example1.com/logs/access.log;
error_log /var/www/example1.com/logs/error.log;
# ... rest of configuration
}
การตั้งค่า PHP Versions ที่แตกต่างกันต่อโดเมน
เมื่อต้องการใช้ PHP versions ที่แตกต่างกันสำหรับแต่ละเว็บไซต์ คุณสามารถใช้ PHP-FPM (FastCGI Process Manager) ได้
# สำหรับ example1.com ที่ใช้ PHP 7.4
server {
listen 443 ssl http2;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# สำหรับ example2.com ที่ใช้ PHP 8.1
server {
listen 443 ssl http2;
server_name example2.com www.example2.com;
root /var/www/example2.com/html;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
การ Redirect ระหว่างโดเมน
บางครั้งคุณอาจต้องการให้โดเมนหนึ่งเปลี่ยนเส้นทาง (redirect) ไปยังโดเมนอื่น ตัวอย่างเช่น การเปลี่ยนโดเมนจาก example1.co.th ไปยัง example1.com
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example1.co.th www.example1.co.th;
ssl_certificate /etc/letsencrypt/live/example1.co.th/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.co.th/privkey.pem;
return 301 https://example1.com$request_uri;
}
การตั้งค่านี้จะทำให้ทุกคำขอไปยัง example1.co.th เปลี่ยนเส้นทางไปยัง example1.com โดยรักษา path และ query string
Performance Considerations สำหรับ Multi-Domain Setup
เมื่อจัดการหลายโดเมนบนเซิร์ฟเวอร์เดียว จำเป็นต้องให้ความสำคัญกับประสิทธิภาพ (performance)
1. Caching Strategy — ใช้ Nginx caching เพื่อลดภาระการประมวลผลต่อการขอ
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
server {
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_cache my_cache;
proxy_cache_valid 200 10m;
}
}
2. Gzip Compression — เปิดใช้งาน gzip compression เพื่อลดขนาดไฟล์ที่ส่ง
gzip on;
gzip_vary on;
gzip_types text/plain text/css text/javascript application/json application/javascript;
gzip_min_length 1024;
3. Connection Timeouts — ตั้งค่าเวลา timeout ที่เหมาะสม
keepalive_timeout 65;
client_max_body_size 100M;
client_body_timeout 30s;
client_header_timeout 30s;
การจัดองค์กรไฟล์ Configuration
การจัดการไฟล์การตั้งค่าอย่างเป็นระบบจะช่วยให้ง่ายต่อการดูแลรักษาและป้องกันข้อผิดพลาด
โครงสร้างที่แนะนำ:
/etc/nginx/
├── nginx.conf (main configuration)
├── conf.d/
│ ├── gzip.conf
│ ├── ssl.conf
│ └── cache.conf
├── sites-available/
│ ├── example1.com
│ ├── example2.com
│ └── default
└── sites-enabled/ (symlinks to sites-available)
ในไฟล์ nginx.conf ให้ include ไฟล์การตั้งค่าต่างๆ:
http {
# ... basic settings ...
# Include configuration files
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Best Practices สำหรับ Multi-Domain Setup
1. ใช้ Separate Server Blocks — แม้ว่าจะเป็นไปได้ที่จะใช้ shared server block สำหรับหลายโดเมน แต่การใช้ separate server blocks จะให้ความยืดหยุ่นและง่ายต่อการดูแลรักษามากขึ้น
2. ตรวจสอบการตั้งค่า — เสมอที่เมื่อแก้ไขไฟล์การตั้งค่าให้ใช้คำสั่ง nginx -t เพื่อตรวจสอบวากการตั้งค่าถูกต้องหรือไม่ก่อนการ reload
sudo nginx -t
sudo systemctl reload nginx
3. ตั้งค่า SEO Headers — สำหรับแต่ละเว็บไซต์ ให้ตั้งค่า headers ที่จำเป็นสำหรับ SEO
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
4. Backup Configuration Files — ทำสำเนา (backup) ไฟล์การตั้งค่าแต่ละครั้งที่ทำการแก้ไข
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
5. ใช้ HTTPS ทั้งหมด — ให้ใช้ HTTPS สำหรับทุกเว็บไซต์ และ redirect HTTP ไปยัง HTTPS เสมอ
6. ตั้งค่า Rate Limiting — ป้องกัน DDoS attacks โดยการตั้งค่า rate limiting
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
}
}
สรุป
การตั้งค่า Multi-domain Setup บน Nginx เป็นวิธีที่มีประสิทธิภาพสำหรับการจัดการหลายเว็บไซต์บนเซิร์ฟเวอร์เดียว ด้วยการใช้ Server Blocks ที่ถูกต้อง คุณสามารถมี document root, SSL certificates, logging, และ PHP versions ที่แตกต่างกันสำหรับแต่ละโดเมนได้
สิ่งสำคัญที่ต้องจำไว้คือ:
- สร้าง Server Blocks แยกต่างหากสำหรับแต่ละโดเมน
- ใช้ document roots ที่แตกต่างกัน
- ตั้งค่า SSL certificates ด้วย Let’s Encrypt
- จัดการ logging ของแต่ละโดเมนแยกต่างหาก
- ใช้ PHP-FPM เมื่อต้องใช้ PHP versions ที่แตกต่างกัน
- ตรวจสอบการตั้งค่าเสมอก่อนการ reload
- ปฏิบัติตามหลัก best practices เพื่อความปลอดภัยและประสิทธิภาพ
ด้วยการปฏิบัติตามขั้นตอนเหล่านี้ คุณจะสามารถจัดการหลายเว็บไซต์บน Nginx ได้อย่างมั่นใจและมีประสิทธิภาพสูง
แนะนำบริการ DE
หากคุณกำลังมองหาโซลูชันที่มั่นคงและประสิทธิภาพสูงสำหรับการจัดการหลายเว็บไซต์ Cloud VPS ของ DE เป็นตัวเลือกที่ดีเยี่ยม ด้วยเซิร์ฟเวอร์ที่อยู่ในไทย คุณจะได้ประสิทธิภาพสูง latency ต่ำ และการสนับสนุนจากทีม technical support ของเรา
สำหรับผู้ที่ต้องการ solution ที่ simplified และ fully managed นั่น Cloud Hosting ของ DE ก็เป็นตัวเลือกที่เหมาะสม เราจะจัดการ Nginx, SSL certificates, backups, และ monitoring ทั้งหมดให้คุณ ทำให้คุณมีเวลามากขึ้นเพื่อพัฒนาธุรกิจของคุณ
ติดต่อ DE วันนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการที่เราสามารถช่วยให้การจัดการเว็บไซต์ของคุณได้ง่ายขึ้น
คำถาม FAQ
Q: ความแตกต่างระหว่าง Server Block และ Virtual Host คืออะไร?
A: Server Block เป็นคำศัพท์ที่ใช้ใน Nginx ส่วน Virtual Host เป็นคำศัพท์ที่ใช้ใน Apache แต่หน้าที่มีความคล้ายคลึงกัน — ทั้งคู่ช่วยให้บนเซิร์ฟเวอร์เดียวสามารถโฮสต์หลายเว็บไซต์ได้
Q: ฉันต้องใช้ IP address ที่แตกต่างกันสำหรับแต่ละโดเมนหรือไม่?
A: ไม่จำเป็น Nginx รองรับ SNI (Server Name Indication) ซึ่งช่วยให้หลาย SSL certificates สามารถใช้ IP address เดียวได้
Q: จะตรวจสอบได้อย่างไรว่าการตั้งค่า Nginx ของฉันถูกต้องหรือไม่?
A: ใช้คำสั่ง sudo nginx -t เพื่อตรวจสอบการตั้งค่า
Q: ฉันสามารถใช้ wildcard certificate สำหรับหลายโดเมนได้หรือไม่?
A: Wildcard certificate จะทำงานได้กับ subdomains ของโดเมนเดียวเท่านั้น เช่น *.example.com จะครอบคลุม api.example.com, app.example.com แต่ไม่ครอบคลุม example2.com หากต้องการครอบคลุมหลายโดเมนที่แตกต่างกัน ให้ใช้ SAN (Subject Alternative Name) certificate

