ตั้งค่า VPS Ubuntu สำหรับเว็บไซต์ HTTPS แรก
ตั้งค่า VPS Ubuntu 24.04 LTS เครื่องใหม่เพื่อเผยแพร่เว็บไซต์สแตติกผ่าน Nginx และ HTTPS เริ่มจาก SSH key และบัญชีผู้ดูแลแยก จากนั้นตรวจ DNS ใบรับรอง และการกลับมาทำงานหลังรีบูต ขั้นตอนนี้ไม่ติดตั้งฐานข้อมูลหรือ runtime ของแอป
VPSuntu · อัปเดต · อ่านประมาณ 6 นาที
เนื้อหาในคู่มือนี้
เตรียมเครื่องใหม่ โดเมน และ console
ใช้ VPS ใหม่ที่ยังไม่มีเว็บสำคัญ มี public IPv4, SSH พอร์ต 22 และบัญชีเริ่มต้นที่ใช้ sudo ได้ พร้อมโดเมนที่คุณควบคุม สร้างคีย์ในหัวข้อถัดไปก่อนสร้างเครื่อง คำสั่งฝั่งคอมพิวเตอร์ใช้ Bash บน Linux, macOS หรือ WSL ส่วนคำสั่งเซิร์ฟเวอร์รันภายใน SSH
แทน 203.0.113.10 ด้วย IP จริง และ app.example.com ด้วย hostname ของคุณ ตัวอย่างใช้บัญชีเริ่มต้น ubuntu หากผู้ให้บริการใช้ชื่ออื่นต้องเปลี่ยน เปิด recovery console ก่อนแก้การเข้าถึง และหยุดหาก path ตัวอย่างเป็นของงานเดิม อิมเมจ Oracle Ubuntu ต้องข้ามชุด UFW ตามคำอธิบายด้านล่าง
สร้างคีย์ก่อนสร้าง VPS
บนคอมพิวเตอร์ เลือก passphrase และใช้ชื่อไฟล์ใหม่หากมี ubuntu_vps อยู่แล้ว เปลี่ยนชื่อให้ตรงกันตลอดทุกขั้นตอน
mkdir -p ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/ubuntu_vps
cat ~/.ssh/ubuntu_vps.pubสร้าง Ubuntu 24.04 VPS โดยใส่ public key จากไฟล์ .pub ในช่อง SSH key ของผู้ให้บริการ เก็บ private key ไว้บนคอมพิวเตอร์ คู่มือนี้ใช้เส้นทางเครื่องใหม่ หากมีเครื่องเดิมและไม่มีสิทธิ์เข้า ให้ใช้ recovery ของผู้ให้บริการก่อน
ใน recovery console ที่เชื่อถือได้ ตรวจ fingerprint ของ host key ชนิดเดียวกับที่ SSH แจ้ง เช่น Ed25519
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pubบนคอมพิวเตอร์ เชื่อมต่อใหม่และเปรียบเทียบ fingerprint ก่อนตอบรับ
ssh -i ~/.ssh/ubuntu_vps ubuntu@203.0.113.10จากอีกเทอร์มินัลบนคอมพิวเตอร์ ส่ง public key สำหรับผู้ดูแลที่กำลังจะสร้าง
scp -i ~/.ssh/ubuntu_vps ~/.ssh/ubuntu_vps.pub ubuntu@203.0.113.10:ubuntu-vps-admin.pubสร้างผู้ดูแลและทดสอบบัญชีแยก
บนเซิร์ฟเวอร์ ตรวจ getent passwd deploy ก่อน ถ้ามีบัญชีนี้แล้ว ให้ใช้ชื่อที่ยังไม่ถูกใช้และเปลี่ยนชื่อ path และกลุ่มทุกจุด เพื่อไม่เขียนทับคีย์ของคนอื่น ตรวจระบบ ทบทวนอัปเดต และตั้งรหัสผ่านที่แข็งแรงสำหรับ sudo ของบัญชีใหม่
cat /etc/os-release
free -h
df -h /
sudo apt update
sudo apt upgrade
sudo adduser deploy
sudo usermod -aG sudo deploy
sudo install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
sudo install -m 600 -o deploy -g deploy ~/ubuntu-vps-admin.pub /home/deploy/.ssh/authorized_keysจากเทอร์มินัลใหม่บนคอมพิวเตอร์ เชื่อมต่อเป็นผู้ดูแล
ssh -i ~/.ssh/ubuntu_vps deploy@203.0.113.10ภายใน session ใหม่นี้ ทดสอบ sudo ควรแสดง root เมื่อใส่รหัสผ่านของ deploy ถูกต้อง เก็บช่องทางเข้าเดิมไว้ และทำขั้นตอนต่อไปใน session ผู้ดูแลนี้
sudo whoamiติดตั้ง Nginx และเลือกวิธีไฟร์วอลล์ให้ตรงอิมเมจ
บนเซิร์ฟเวอร์ ติดตั้งและเปิด Nginx โดยรักษา session SSH และ recovery console ไว้
sudo apt install nginx
sudo systemctl enable --now nginxในไฟร์วอลล์ของผู้ให้บริการ อนุญาต TCP 22 จากตำแหน่งดูแลระบบ และ TCP 80/443 สำหรับผู้ชมเว็บ ถ้าใช้ SSH พอร์ตอื่นต้องรักษากฎพอร์ตนั้นไว้ กฎเครือข่ายไม่ได้เปิดพอร์ตที่ guest firewall ยังบล็อกอยู่
สำหรับ Oracle Cloud Ubuntu: ข้ามคำสั่ง UFW ทั้งชุดด้านล่าง รักษากฎ iptables เดิม โดยเฉพาะ iSCSI สำหรับ boot/block volume ใช้ OCI security lists หรือ NSG ร่วมกับ guest rules ตามเอกสารเพื่อเปิด HTTP/HTTPS อย่าล้างกฎหรือเปลี่ยนแพ็กเกจไฟร์วอลล์ของอิมเมจ
สำหรับ Ubuntu ใหม่ที่ผู้ให้บริการรองรับ UFW: ใช้ชุดนี้เฉพาะเมื่อไม่มีระบบไฟร์วอลล์ที่ต้องจัดการด้วยวิธีอื่น อนุญาตพอร์ต SSH จริงก่อน enable ตัวอย่างใช้พอร์ต 22
sudo apt install ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verboseหลังปรับทั้งสองทาง ให้ทดสอบการเข้า SSH ใหม่ session เก่าที่ไม่หลุดยังไม่ใช่การทดสอบ ต้องผ่าน HTTP จากภายนอกในหัวข้อถัดไปก่อนขอใบรับรอง
สร้างเว็บแยกใน Nginx
คำสั่งบนเซิร์ฟเวอร์สร้าง document root และ config ใหม่ เปลี่ยน hostname ภายในบล็อก แต่คงเครื่องหมายคำพูดรอบ EOF เพื่อไม่ให้ shell ขยายตัวแปร Nginx เช่น $uri หน้า HTML ตัวอย่างคงข้อความภาษาอังกฤษไว้เพื่อเทียบผลกับต้นฉบับ
sudo install -d -m 755 /var/www/first-site
printf '%s\n' '<!doctype html><html lang="en"><title>First deployment</title><h1>Ubuntu VPS is serving this page</h1></html>' | sudo tee /var/www/first-site/index.html
sudo tee /etc/nginx/sites-available/first-site >/dev/null <<'EOF'
server {
listen 80;
listen [::]:80;
server_name app.example.com;
root /var/www/first-site;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/first-site /etc/nginx/sites-enabled/first-site
sudo nginx -treload เฉพาะเมื่อ nginx -t ผ่าน
sudo systemctl reload nginxบนคอมพิวเตอร์ ตรวจ hostname ที่ IP นี้ก่อนแก้ DNS ผลควรเป็นหัวข้อ Ubuntu VPS is serving this page ไม่ใช่หน้าเริ่มต้น Nginx
curl --resolve app.example.com:80:203.0.113.10 http://app.example.com/ตั้ง DNS และออกใบรับรอง HTTPS
สร้าง DNS A ชี้ hostname ไป IPv4 ของ VPS ใส่ AAAA เฉพาะเมื่อ IPv6 ใช้งานได้จริง เพราะค่าเก่าอาจส่งการตรวจใบรับรองไปผิดเครื่อง ตัวอย่างนี้ใช้ DNS ตรงไป VPS โดยไม่มี proxy
บนคอมพิวเตอร์ ขอ http://app.example.com/ โดยไม่ใช้ --resolve และรอจนได้หน้าเว็บของคุณ จากนั้นรันบนเซิร์ฟเวอร์ แพ็กเกจ Certbot ต้องใช้ Ubuntu Universe ถ้าหาแพ็กเกจไม่พบให้แก้ก่อนดำเนินต่อ
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com --redirect
sudo nginx -t
sudo certbot renew --dry-run
systemctl list-timers --all certbot.timerตอบอีเมลและเงื่อนไข Certbot จะปรับ config และเปลี่ยน HTTP ไป HTTPS ตรวจ timer ต่ออายุ หากไม่ทำงานให้เปิดด้วย sudo systemctl enable --now certbot.timer และคงพอร์ต 80 ให้เข้าถึงได้สำหรับการตรวจและต่ออายุ
ตรวจจากภายนอกและหลังรีบูต
บนคอมพิวเตอร์ ตรวจ redirect, certificate และเนื้อหา HTTP ควรส่งต่อไป HTTPS ส่วน HTTPS ต้องผ่านการตรวจใบรับรอง อย่าเติม -k เพราะจะซ่อนข้อผิดพลาด
curl -I http://app.example.com/
curl -I https://app.example.com/
curl -fsS https://app.example.com/ขณะที่ยังเป็นเครื่องทดลอง รัน sudo reboot บนเซิร์ฟเวอร์ จากนั้นเข้าเป็น deploy ตรวจ systemctl is-active nginx และเรียก HTTPS ภายนอกซ้ำ การรีบูตตัด SSH ตามปกติ ถ้าเครื่องไม่กลับมาให้ใช้ console
แก้จุดที่ล้มเหลวและเตรียมกู้คืน
บนหน้าจอขนาดเล็ก เลื่อนตารางด้านข้างเพื่อดูทุกคอลัมน์
| อาการ | ตรวจอะไร |
|---|---|
| SSH timeout | IP, ไฟร์วอลล์ทั้งสองชั้น และ console |
| คีย์ถูกปฏิเสธ | ชื่อบัญชี private key และสิทธิ์ authorized_keys |
| เห็นหน้า Nginx เริ่มต้น | DNS, server_name และ enabled site |
| ใบรับรองไม่ผ่าน | A/AAAA สาธารณะและพอร์ต 80 |
| Nginx ไม่ทำงานหลังแก้ | nginx -t และ journal ของ Nginx |
ใช้การวิเคราะห์ข้อผิดพลาด SSHก่อนแก้การเข้าถึง เก็บไฟล์เว็บ config, DNS และวิธีสร้างเครื่องไว้นอก VPS แล้วฝึกกู้คืนไฟล์โดยไม่เขียนทับเว็บเดิม
การคืนบริการทั้งหมดต้องรวม assets, certificates และส่วนประกอบอื่นด้วย ตั้งแจ้งเตือนการเข้าถึงและวันหมดอายุใบรับรอง การตรวจผ่านครั้งเดียวไม่เฝ้าดูวันพรุ่งนี้ ฐานข้อมูลและ runtime ที่เพิ่มภายหลังต้องมี service config และวิธีสำรองเฉพาะ
คำถามที่พบบ่อย
ใช้กับเว็บไซต์ที่มีอยู่แล้วได้เลยไหม?
ควรใช้เครื่องทดลองแยกก่อน คำสั่งสร้างไฟล์ เปิดไฟร์วอลล์ และให้ Certbot แก้ Nginx ระบบที่ใช้งานจริงต้องตรวจไซต์ กฎ และการกู้คืนเดิม
คู่มือนี้ติดตั้ง WordPress หรือ Node.js ไหม?
ยังไม่ติดตั้ง ผลลัพธ์คือเว็บสแตติก HTTPS จากนั้นจึงเพิ่ม runtime และทดสอบ startup, health check และข้อมูล