การตั้งค่า HTTPS บน Nginx ด้วย Certbot บน Ubuntu Server 26.04

การตั้งค่า HTTPS บน Nginx ด้วย Certbot บน Ubuntu Server 26.04

เวลาเปิดเว็บไซต์แล้วเห็นคำว่า Not Secure บน Browser นั่นคือสัญญาณว่าเว็บไซต์ยังไม่ได้ใช้งาน HTTPS หรือยังไม่มี SSL/TLS Certificate ที่ถูกต้อง ในงานจริงไม่ว่าจะเป็นเว็บองค์กร เว็บโรงเรียน ระบบภายใน หรือ API Server การเปิดใช้งาน HTTPS ถือเป็นพื้นฐานด้านความปลอดภัยที่ควรทำตั้งแต่วันแรก

บทความนี้จะพา Hands-on การตั้งค่า HTTPS บน Nginx โดยใช้ Certbot เพื่อขอ SSL/TLS Certificate จาก Let’s Encrypt และตั้งค่าให้เว็บไซต์เปลี่ยนจาก http:// เป็น https:// อย่างถูกต้อง

อ้างอิงแนวทางจากเอกสาร Ubuntu Server ที่แนะนำการติดตั้ง Nginx ด้วย apt และตรวจสอบบริการผ่าน systemctl รวมถึงเอกสาร Certbot ที่ระบุว่า Nginx plugin สามารถขอ Certificate และติดตั้งเข้ากับ Nginx ได้อัตโนมัติ


เป้าหมายของบทความนี้

หลังทำตามบทความนี้ ผู้อ่านจะสามารถทำสิ่งต่อไปนี้ได้

  • ติดตั้ง Nginx บน Ubuntu Server

  • สร้าง Virtual Host สำหรับเว็บไซต์

  • เปิด Firewall เฉพาะพอร์ตที่จำเป็น

  • ใช้ Certbot ขอ SSL/TLS Certificate

  • Redirect จาก HTTP ไป HTTPS

  • ตรวจสอบ Certificate และ Auto Renew

  • แก้ปัญหาเบื้องต้นเมื่อ HTTPS ใช้งานไม่ได้


สภาพแวดล้อมที่ใช้ทดสอบ

บทความนี้ทดสอบบนสภาพแวดล้อมดังนี้

  • OS: Ubuntu Server 26.04 LTS

  • Web Server: Nginx

  • SSL/TLS Certificate: Let’s Encrypt

  • Tool: Certbot

  • Domain ตัวอย่าง: example.com

ในการใช้งานจริง ให้เปลี่ยน example.com เป็นชื่อโดเมนของท่าน เช่น www.sysadmin.in.th

ตรวจสอบเวอร์ชันระบบและ Nginx ได้ด้วยคำสั่ง

# ตรวจสอบเวอร์ชัน Ubuntu
lsb_release -a

# ตรวจสอบเวอร์ชัน Nginx
nginx -v

พื้นฐานที่จำเป็นก่อนเริ่ม

ก่อนตั้งค่า HTTPS ควรเตรียมสิ่งต่อไปนี้ให้พร้อม

  1. มี Ubuntu Server ที่เชื่อมต่อ Internet ได้

  2. มี Domain Name จริง เช่น example.com

  3. DNS A Record ชี้มายัง Public IP ของ Server แล้ว

  4. เปิดพอร์ต 80/tcp และ 443/tcp

  5. มีสิทธิ์ใช้งานคำสั่ง sudo

ตรวจสอบ IP ของ Server

# แสดง Public IP ของ Server
curl -4 ifconfig.me

ตรวจสอบว่า DNS ชี้มาถูก IP หรือไม่

# ตรวจสอบว่า domain ชี้มาที่ IP ใด
dig example.com +short

หากผลลัพธ์จาก dig ไม่ตรงกับ Public IP ของ Server ให้แก้ไข DNS ก่อน ไม่เช่นนั้น Certbot จะไม่สามารถยืนยันความเป็นเจ้าของโดเมนได้


ขั้นตอนที่ 1: ติดตั้ง Nginx

เริ่มจากอัปเดต Package Index และติดตั้ง Nginx

# อัปเดตรายการ package
sudo apt update

# ติดตั้ง Nginx
sudo apt install nginx -y

หลังติดตั้งแล้ว ตรวจสอบสถานะของ Nginx

# ตรวจสอบว่า Nginx ทำงานอยู่หรือไม่
sudo systemctl status nginx

หากทำงานปกติควรเห็นสถานะประมาณนี้

Active: active (running)

เปิด Browser แล้วเข้าไปที่

http://YOUR_SERVER_IP

ถ้าเห็นหน้า Welcome to nginx แสดงว่า Nginx พร้อมใช้งานแล้ว

แนะนำ Screenshot:
จับภาพหน้า Welcome to nginx เพื่อใช้ประกอบบทความช่วง “ติดตั้งสำเร็จ”


ขั้นตอนที่ 2: ตั้งค่า Firewall

ถ้าใช้ UFW ให้ตรวจสอบสถานะก่อน

# ตรวจสอบสถานะ Firewall
sudo ufw status

อนุญาตทราฟฟิก HTTP และ HTTPS

# เปิดใช้งานโปรไฟล์ Nginx Full ซึ่งครอบคลุมพอร์ต 80 และ 443
sudo ufw allow 'Nginx Full'

# ตรวจสอบสถานะอีกครั้ง
sudo ufw status

ตัวอย่างผลลัพธ์ที่ควรเห็น

Nginx Full                 ALLOW       Anywhere
Nginx Full (v6)            ALLOW       Anywhere (v6)

⚠️ ข้อควรระวัง:
ไม่แนะนำให้ปิด Firewall ทั้งระบบเพื่อแก้ปัญหา HTTPS เพราะจะเพิ่มความเสี่ยงด้านความปลอดภัย ควรเปิดเฉพาะพอร์ตที่จำเป็น เช่น 22, 80, 443


ขั้นตอนที่ 3: สร้างโฟลเดอร์เว็บไซต์

สมมติว่าเราจะสร้างเว็บไซต์สำหรับโดเมน example.com

# สร้างโฟลเดอร์สำหรับเก็บไฟล์เว็บไซต์
sudo mkdir -p /var/www/example.com/html

# กำหนด owner ให้ผู้ใช้ปัจจุบันจัดการไฟล์ได้
sudo chown -R $USER:$USER /var/www/example.com/html

# กำหนด permission พื้นฐาน
sudo chmod -R 755 /var/www/example.com

สร้างไฟล์หน้าเว็บทดสอบ

# สร้างไฟล์ index.html
nano /var/www/example.com/html/index.html

ใส่เนื้อหาตัวอย่าง

<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <title>Nginx HTTPS Test</title>
</head>
<body>
    <h1>HTTPS บน Nginx พร้อมใช้งานแล้ว</h1>
    <p>ทดสอบบน Ubuntu Server 26.04</p>
</body>
</html>

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

สร้างไฟล์ Configuration สำหรับเว็บไซต์

# สร้างไฟล์ server block
sudo nano /etc/nginx/sites-available/example.com

ใส่ค่าเบื้องต้นสำหรับ HTTP ก่อน

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

เปิดใช้งาน Server Block ด้วย Symbolic Link

# เปิดใช้งาน site
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# ตรวจสอบ syntax ของ Nginx
sudo nginx -t

# reload nginx โดยไม่หยุด service
sudo systemctl reload nginx

ทดสอบเข้าเว็บด้วย HTTP

http://example.com

หากแสดงหน้าเว็บที่สร้างไว้ แปลว่า Virtual Host ทำงานถูกต้อง

แนะนำ Screenshot:
จับภาพหน้าเว็บทดสอบผ่าน http://example.com ก่อนเปิด HTTPS


ขั้นตอนที่ 5: ติดตั้ง Certbot

Certbot แนะนำวิธีติดตั้งผ่าน Snap สำหรับระบบ Linux สมัยใหม่ และระบุว่า Snap ช่วยให้ได้ Certbot รุ่นใหม่พร้อมระบบต่ออายุ Certificate ที่ตั้งค่าไว้ล่วงหน้า

ติดตั้ง Snap และ Certbot

# ติดตั้ง snapd หากยังไม่มี
sudo apt install snapd -y

# อัปเดต core snap
sudo snap install core
sudo snap refresh core

# ติดตั้ง certbot
sudo snap install --classic certbot

# สร้าง symbolic link เพื่อเรียก certbot ได้สะดวก
sudo ln -s /snap/bin/certbot /usr/bin/certbot

ตรวจสอบเวอร์ชัน

# ตรวจสอบเวอร์ชัน Certbot
certbot --version

ขั้นตอนที่ 6: ขอ SSL/TLS Certificate ด้วย Certbot

ใช้ Certbot ร่วมกับ Nginx Plugin

# ขอ SSL Certificate และให้ Certbot ปรับค่า Nginx ให้อัตโนมัติ
sudo certbot --nginx -d example.com -d www.example.com

Certbot จะถามข้อมูลบางอย่าง เช่น

  • Email สำหรับแจ้งเตือนวันหมดอายุ

  • ยอมรับ Terms of Service

  • ต้องการ redirect HTTP ไป HTTPS หรือไม่

ให้เลือก Redirect เพื่อให้ผู้ใช้ที่เข้า http:// ถูกส่งไป https:// โดยอัตโนมัติ

เมื่อสำเร็จ จะเห็นข้อความประมาณนี้

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem

Certbot จะเก็บ Certificate ไว้ใน /etc/letsencrypt/live/ และสามารถติดตั้งเข้ากับ Nginx ได้อัตโนมัติ ตามเอกสาร Certbot


ขั้นตอนที่ 7: ตรวจสอบไฟล์ Nginx หลังติดตั้ง HTTPS

หลังจาก Certbot ทำงานสำเร็จ ลองเปิดไฟล์เดิมอีกครั้ง

# เปิดไฟล์ config เพื่อตรวจสอบ
sudo nano /etc/nginx/sites-available/example.com

โดยทั่วไป Certbot จะเพิ่มส่วน HTTPS ให้ เช่น

server {
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}

หลักการสำคัญของ Nginx HTTPS คือใน server block ต้องมี listen 443 ssl; และระบุตำแหน่ง ssl_certificate กับ ssl_certificate_key ให้ถูกต้อง ตามเอกสาร Nginx


ขั้นตอนที่ 8: ทดสอบ HTTPS

ตรวจสอบ syntax ของ Nginx

# ตรวจสอบ configuration
sudo nginx -t

Reload Nginx

# reload nginx
sudo systemctl reload nginx

เปิด Browser แล้วเข้า

https://example.com

ควรเห็นรูปกุญแจหรือสัญลักษณ์ว่าเว็บไซต์ปลอดภัย

ตรวจสอบด้วย curl

# ตรวจสอบ HTTP header
curl -I https://example.com

หากเปิด redirect แล้ว ทดลองเรียก HTTP

# ตรวจสอบว่า HTTP redirect ไป HTTPS หรือไม่
curl -I http://example.com

ควรพบสถานะประมาณนี้

HTTP/1.1 301 Moved Permanently
Location: https://example.com/

แนะนำ Screenshot:
จับภาพ Browser ที่แสดงรูปกุญแจ HTTPS และหน้าเว็บที่เปิดผ่าน https://example.com


ขั้นตอนที่ 9: ตรวจสอบ Auto Renew

Let’s Encrypt Certificate มีอายุจำกัด จึงต้องมีระบบต่ออายุอัตโนมัติ Certbot ที่ติดตั้งผ่าน Snap จะตั้งค่าการต่ออายุไว้ให้แล้ว

ทดสอบการต่ออายุแบบจำลอง

# ทดสอบ renew โดยยังไม่ต่ออายุจริง
sudo certbot renew --dry-run

หากสำเร็จจะเห็นข้อความประมาณนี้

Congratulations, all simulated renewals succeeded

ตรวจสอบ Timer ของ Snap Certbot

# ตรวจสอบ systemd timer ที่เกี่ยวข้องกับ snap certbot
systemctl list-timers | grep certbot

ขั้นตอนที่ 10: เพิ่ม Security Header เบื้องต้น

สามารถเพิ่ม Security Header ใน HTTPS Server Block ได้ เช่น

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # ป้องกันการฝังเว็บใน iframe จาก domain อื่น
    add_header X-Frame-Options "SAMEORIGIN" always;

    # ลดความเสี่ยง MIME sniffing
    add_header X-Content-Type-Options "nosniff" always;

    # ควบคุมข้อมูล referrer ที่ส่งออกไป
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    location / {
        try_files $uri $uri/ =404;
    }
}

จากนั้นทดสอบและ reload

# ตรวจสอบ syntax
sudo nginx -t

# reload nginx
sudo systemctl reload nginx

การเปิด HSTS แบบระมัดระวัง

HSTS ช่วยบังคับให้ Browser เข้าเว็บไซต์ผ่าน HTTPS เสมอ แต่ควรใช้เมื่อมั่นใจว่า HTTPS ทำงานสมบูรณ์แล้ว

# เปิด HSTS หลังจากมั่นใจว่า HTTPS พร้อมใช้งานจริง
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

⚠️ ข้อควรระวัง:
หากเปิด HSTS แล้ว Certificate มีปัญหา ผู้ใช้อาจเข้าเว็บไม่ได้จนกว่าปัญหาจะถูกแก้ไข ดังนั้นไม่ควรเปิดทันทีในระบบที่ยังทดสอบไม่ครบ


ปัญหาที่พบบ่อย

1. Certbot ขอ Certificate ไม่ผ่าน

ตรวจสอบว่า DNS ชี้มาถูก IP หรือไม่

dig example.com +short

ตรวจสอบว่า Port 80 เปิดหรือไม่

sudo ufw status

ตรวจสอบว่า Nginx ทำงานอยู่หรือไม่

sudo systemctl status nginx

2. Nginx Reload ไม่ผ่าน

ตรวจสอบ syntax

sudo nginx -t

ดู Log เพิ่มเติม

sudo journalctl -xeu nginx

หรือดู Error Log ของเว็บไซต์

sudo tail -f /var/log/nginx/example.com.error.log

3. เข้า HTTPS แล้วขึ้น Certificate ไม่ตรงชื่อเว็บ

สาเหตุที่พบบ่อยคือ

  • ขอ Certificate ผิดโดเมน

  • ลืมใส่ www

  • DNS ยังไม่ชี้มาที่ Server

  • มีหลาย Server Block ซ้อนกัน

ตรวจสอบ Server Block ทั้งหมด

# แสดงรายการไฟล์ site ที่เปิดใช้งาน
ls -l /etc/nginx/sites-enabled/

ตรวจสอบ configuration รวมของ Nginx

# แสดง config ทั้งหมด เหมาะสำหรับ debug
sudo nginx -T

4. เว็บเข้าได้เฉพาะ HTTP แต่ HTTPS เข้าไม่ได้

ตรวจสอบว่าเปิด Firewall สำหรับ HTTPS แล้วหรือยัง

sudo ufw allow 'Nginx Full'
sudo ufw status

ตรวจสอบว่า Nginx ฟังพอร์ต 443 หรือไม่

sudo ss -tulpn | grep ':443'

คำสั่งสรุปแบบรวบรัด

สำหรับผู้ที่ต้องการภาพรวม คำสั่งหลักมีดังนี้

# ติดตั้ง Nginx
sudo apt update
sudo apt install nginx -y

# เปิด Firewall สำหรับ HTTP/HTTPS
sudo ufw allow 'Nginx Full'

# ติดตั้ง Certbot ผ่าน Snap
sudo apt install snapd -y
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# ขอ Certificate สำหรับ Nginx
sudo certbot --nginx -d example.com -d www.example.com

# ทดสอบ Auto Renew
sudo certbot renew --dry-run

สรุป

การตั้งค่า HTTPS บน Nginx ด้วย Certbot บน Ubuntu Server 26.04 ไม่ซับซ้อน หากเตรียม DNS, Firewall และ Nginx Server Block ให้ถูกต้องก่อน ขั้นตอนสำคัญคือให้โดเมนชี้มายัง Server จริง เปิดพอร์ต 80 และ 443 จากนั้นใช้ certbot --nginx เพื่อขอ SSL/TLS Certificate และติดตั้งเข้ากับ Nginx โดยอัตโนมัติ

หลังติดตั้งแล้วควรตรวจสอบทั้ง Browser, curl, Nginx Log และ Auto Renew เพื่อให้มั่นใจว่าเว็บไซต์ปลอดภัยและ Certificate จะต่ออายุได้เองในระยะยาว



Write by Dr.Arnut Ruttanatirakul
SysAdmin Knowledge
https://www.sysadmin.in.th
July 3, 2026