Caddyfile Generator: สร้าง Caddy config ระดับ production ได้ในไม่กี่วินาที
Caddyfile Generator สร้าง Caddyfile ที่พร้อมใช้งานสำหรับ reverse proxy, static site, PHP-FPM และ load balancing พร้อม automatic HTTPS, gzip, HSTS และ WebSocket คู่มือนี้อธิบายว่าแต่ละบรรทัดที่ได้มาทำงานอย่างไร
Table of Contents
Caddyfile Generator: สร้าง Caddy config ระดับ production ได้ในไม่กี่วินาที
Caddy ให้คำสัญญาที่เว็บเซิร์ฟเวอร์ตัวอื่นแทบไม่กล้าพูดตาม: ชี้มันไปที่เว็บของคุณแล้ว HTTPS เกิดขึ้นเอง ทั้งการออกและต่ออายุใบรับรองผ่าน ACME, HTTP/2 และ HTTP/3 เปิดให้ใช้เป็นค่าเริ่มต้น และไฟล์ config ที่สั้นเป็น "บรรทัด" ไม่ใช่ "หน้า" สิ่งที่เหลืออยุ่ขวางอยู่ก็คือตัว Caddyfile เอง ถ้ายังจำ directive ไม่ได้ซะที การเดินจาก "แอปผมรันอยู่พอร์ต 8080" ไปเป็น "โดเมนผมเสิร์ฟแอปนี้แบบปลอดภัยแล้ว" หมายความว่าต้องไปคุ้ยเอกสาร Caddyfile Generator ตัดขั้นตอนนั้นทิ้ง: เลือก preset — reverse proxy, static site, PHP-FPM หรือ load balancer — กด toggle ที่ต้องใช้ แล้วคัดลอกไฟล์ตั้งต้นที่ใช้งานได้จริงออกไป
พรีวิวของเครื่องมือเขียนตัวเองใหม่ทุกครั้งที่เปลี่ยนค่า คุณจะเห็นชัดเลยว่าแต่ละ toggle เพิ่มบรรทัดไหนเข้ามา พอใจเมื่อไรคัดลอกผลลัพธ์ หรือดาวน์โหลดเป็นไฟล์ชื่อ Caddyfile ทุกอย่างรันแบบ client-side 100% ไม่มีอะไรออกจากเบราว์เซอร์ของคุณ
ทำไมต้องใช้ Caddyfile Generator?
- HTTPS เป็นค่าเริ่มต้น ไม่ใช่พิธีกรรม — เปิด automatic HTTPS ไว้ Caddy จะออกและต่ออายุใบรับรองเองทั้งหมด
- สี่ preset ครอบคลุมงานที่เจอบ่อย — reverse proxy, static site, PHP-FPM และ load balancing คือรูปแบบที่งานขนาดเล็กเกือบทุกงานใช้จริง
- มี header สำหรับ hardening ให้ก่อนเสมอ — ทุกไฟล์ที่ได้มาใส่ X-Content-Type-Options, X-Frame-Options และ Referrer-Policy ให้โดยไม่ต้องขอ
- แต่ละ toggle แปลงเป็น directive จริง — gzip/zstd, HSTS และ WebSocket เพิ่มบล็อกที่มองเห็นได้ในพรีวิว ไม่มีอะไรเป็นเวทมนตร์
- เป็นส่วนตัวและทันที — ทุกอย่างประกอบกันในเบราว์เซอร์ ฟรี และไม่จำกัดจำนวนครั้ง
ฟีเจอร์หลัก
| ฟีเจอร์ | สิ่งที่ทำ |
|---|---|
| Config presets | reverse proxy, static site, PHP-FPM และ load balancing |
| Site address | โดเมนที่ Caddy เสิร์ฟและดูแลความปลอดภัยให้ |
| Backend servers | เพิ่ม upstream แบบ host:port ได้ไม่จำกัด ผ่าน http หรือ https |
| Load-balancing policy | round_robin, least_conn, random, ip_hash หรือ header |
| Automatic HTTPS | เสิร์ฟเว็บบนพอร์ต 443 พร้อมออกใบรับรองผ่าน ACME |
| gzip และ zstd | เพิ่ม directive encode เพื่อบีบอัด response |
| HSTS | เพิ่ม header Strict-Transport-Security อายุหนึ่งปี |
| WebSocket support | เพิ่ม matcher สำหรับ upgrade ให้ traffic WS proxy ได้ถูกต้อง |
- ผลลัพธ์คัดลอกหรือดาวน์โหลดได้ทันที — คัดลอกจากพรีวิว หรือดาวน์โหลดเป็นไฟล์ชื่อ Caddyfile
- รู้จักที่อยู่ภายในเครื่อง — ใส่ localhost หรือ 127.0.0.1 ผลลัพธ์จะเปลี่ยนเป็น plain HTTP ให้เอง ตรงกับพฤติกรรมของ Caddy จริง
วิธีใช้งาน Caddyfile Generator
- เปิดเครื่องมือ ที่ /th/tools/caddyfile-generator โหลดทันทีและไม่ส่ง config ของคุณไปที่ใด
- เลือก preset — reverse proxy กับ load balancer จะมีช่องกรอก backend ส่วน static site กับ PHP-FPM จะมีช่อง document root แทน
- กรอกรายละเอียด — site address ตามด้วย backend, document root หรือพอร์ต PHP-FPM แล้วแต่ preset ที่เลือก
- กด toggle ที่ต้องใช้ — automatic HTTPS, gzip/zstd, HSTS และ WebSocket แล้วดูแต่ละอันเพิ่มบรรทัดเข้าพรีวิวสด ๆ
- คัดลอกหรือดาวน์โหลด Caddyfile วางไว้ที่ /etc/caddy/Caddyfile บนเซิร์ฟเวอร์ แล้ว reload Caddy
แต่ละบรรทัดในไฟล์ที่ได้มาหมายความว่าอะไร
Site address block ทำหน้าที่อะไร
บรรทัดแรกของบล็อกคือ site address: example.com { token เดียวบอก Caddy ว่าจะจับ hostname ไหน ฟังพอร์ตใด และเมื่อเปิด automatic HTTPS ไว้ จะเอาชื่อไหนไปขึ้นกับใบรับรอง โดเมนสาธารณะจะถูกเขียนไว้เปล่า ๆ เพื่อให้ Caddy เสิร์ฟ HTTPS บนพอร์ต 443 ส่วน localhost หรือ IP จะกลายเป็น http://localhost เพราะ ACME ออกใบรับรองให้ชื่อภายในเครื่องไม่ได้
directive reverse_proxy
reverse_proxy http://127.0.0.1:8080 คือเรื่องทั้งเรื่องของ reverse proxy ใน Caddy: ไม่ต้องประกาศ upstream แยก ไม่ต้องจัดการ proxy header ด้วยมือ http เหมาะกับแอปที่รันอยู่เครื่องเดียวกัน ส่วน https จะบังคับให้ Caddy เชื่อมต่อไปยัง upstream นั้นผ่าน TLS
บล็อก fastcgi ของ PHP-FPM
preset PHP-FPM ส่งออก php_fastcgi 127.0.0.1:9000 ตามด้วย file_server แม้ชื่อจะดูเป็น directive พื้นฐาน แต่ php_fastcgi แผ่ออกเป็น matcher, rewrite สำหรับไฟล์ index และคำสั่ง reverse_proxy ที่ใช้ transport แบบ FastCGI ชี้ไปที่พอร์ต PHP-FPM ของคุณ
Load balancing ด้วย lb_policy
เลือก preset load balancer พร้อม backend ตั้งแต่สองตัว บรรทัด proxy จะเพิ่มชื่อ policy และรายการปลายทาง:
reverse_proxy round_robin {
to http://127.0.0.1:8080
to http://127.0.0.1:8081
}
policy เป็นตัวกำหนดการกระจาย request: round_robin วนตามลำดับ, least_conn เลือกตัวที่ว่างที่สุด, random สุ่ม, ip_hash ตรึง client เดิมไว้กับ backend เดิมสำหรับ sticky session และ header จะจัดเส้นทางตาม request header
แต่ละ toggle เพิ่มอะไรลงในไฟล์
- Automatic HTTPS — คงรูปแบบโดเมนเปล่าไว้ Caddy จะฟังบนพอร์ต 443 และทำ ACME handshake เพื่อขอใบรับรองที่เบราว์เซอร์เชื่อถือ ถ้าปิด ที่อยู่จะเป็น http:// และเสิร์ฟ plain HTTP แทน
- gzip และ zstd — เพิ่ม encode zstd gzip เพียง directive เดียวที่บีบอัด response โดยเลือก zstd ก่อนแล้ว fallback ไป gzip
- HSTS — เพิ่ม header Strict-Transport-Security "max-age=31536000; includeSubDomains" บอกเบราว์เซอร์ให้ปฏิเสธ plain HTTP กับโดเมนคุณเป็นเวลาหนึ่งปี และจะเขียนออกมาเฉพาะเมื่อเปิด HTTPS อยู่เท่านั้น
- WebSocket support — เพิ่ม matcher ที่จำแนก header Connection และ Upgrade พร้อม route reverse_proxy เฉพาะสำหรับ request พวกนั้น ซึ่งเป็นจุดที่สาย proxy ทั่วไปพลาดบ่อยที่สุด
Caddyfile ตัวอย่างพร้อมคำอธิบาย
# Generated with OnlineToolsForge - Caddyfile Generator
example.com {
root * /var/www/html
encode zstd gzip
header Strict-Transport-Security "max-age=31536000; includeSubDomains"
reverse_proxy http://127.0.0.1:8080
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy strict-origin-when-cross-origin
}
# TLS certificates are provisioned automatically via ACME
}
อ่านจากบนลงล่าง: site block กำหนดขอบเขตทุกอย่างไว้ที่โดเมนของคุณ root ชี้ตำแหน่งไฟล์ encode บีบอัด response header HSTS ตรึงผู้ใช้ไว้กับ HTTPS reverse_proxy ส่ง request ต่อไปยังแอป และ header block ปิดท้ายด้วย header สำหรับ hardening
กรณีใช้งานจริง
Self-host โปรเจกต์เล็กของตัวเอง
มีแอปรันที่ localhost:8080 กับโดเมนชี้ไปที่ VPS ราคาถูกหลังเดียว เลือก preset reverse proxy กรอกโดเมนกับ backend เปิด automatic HTTPS เอาไว้ แล้วคุณจะได้ TLS, การบีบอัด และ header ที่เนียนตาครบภายในไม่ถึงนาที
คอยหน้า Docker container
container เปลี่ยนพอร์ตและถูกเพิ่มบ่อย เติมพอร์ตที่ publish แต่ละตัวเป็น upstream สลับไป least_conn ถ้ามี container เร็วไม่เท่ากัน แล้ว generate ไฟล์ใหม่ทุกครั้งที่ stack เปลี่ยน
เปลี่ยนเซิร์ฟเวอร์ Apache เก่า
เซิร์ฟเวอร์เก่าที่รัน Apache พร้อม virtual host เป็นกองและ mod_rewrite ไม่รู้จบคือ migration ที่รอวันเกิด ย้ายทีละเว็บ: generate บล็อกแบบ static หรือ PHP-FPM ให้แต่ละโดเมน เทียบพฤติกรรม แล้วค่อยสลับ Apache to Nginx Converter ช่วยแปล rewrite rule ที่ยุ่ง ๆ ระหว่างทางได้
แอป WebSocket ในโฮมแล็บ
Home Assistant, ntfy และ code-server ล้วนพึ่ง WebSocket ที่มักพังลึกลับเมื่ออยู่หลัง proxy ที่ตั้งผิด เปิด toggle WebSocket reload รอบเดียว แล้วหน้า live view ก็ใช้ได้โดยไม่ต้องเดากันกับ 502
แนวทางปฏิบัติที่ดีที่สุด
- รัน caddy validate ก่อน reload ทุกครั้ง — caddy validate --config /etc/caddy/Caddyfile จับพิมพ์ผิดก่อนที่มันจะกลายเป็นเว็บล่ม
- ปล่อยพอร์ต 80 กับ 443 ให้ว่าง — ACME challenge ต้องใช้ทั้งคู่ ปิดเว็บเซิร์ฟเวอร์ตัวอื่นก่อน
- จัด DNS ให้เรียบร้อยก่อนสตาร์ตครั้งแรก — record A หรือ AAAA ต้องชี้มาที่เซิร์ฟเวอร์ก่อน Caddy ขอใบรับรอง
- ทดสอบ route WebSocket หลังแก้ทุกครั้ง — การสลับลำดับ directive อาจบัง matcher ของ upgrade ลองเปิดหน้า live view ยืนยันว่ายังเชื่อมต่อได้
- สำรอง Caddyfile ไว้เสมอ — ไฟล์เล็กพอจะ commit เก็บไว้ข้างแอปใน private repository
- reload แทนการ restart — caddy reload ใช้ config ใหม่แบบ zero downtime
สร้าง Caddyfile ของคุณในไม่กี่วินาที
ไม่ต้องไปคุ้ยเอกสารอีกต่อไป เปิด Caddyfile Generator เลือก preset กด toggle ที่ต้องใช้ แล้วคัดลอก config แนว production ที่มี HTTPS, การบีบอัด และ hardening มาให้ตั้งแต่ต้น — ฟรี และทำทั้งหมดในเบราว์เซอร์ของคุณ
เครื่องมือที่เกี่ยวข้องที่คุณอาจสนใจ:
- Redirect Map Generator — สร้างและตรวจ redirect map แบบกลุ่มสำหรับงาน migration
- .htaccess Generator — ประกอบ directive ของ Apache แบบภาพ เมื่อโปรเจกต์ยังรันบน Apache
- Apache to Nginx Converter — แปล rewrite rule ของ Apache เป็น config ยุคใหม่
config ที่ดีต้องสั้น อ่านรู้เรื่อง และมี version — generate ฉบับแรกที่นี่ แล้วปรับให้เป็นของคุณ
คำถามที่พบบ่อย
ถ: ต้องติดตั้ง Caddy ก่อนถึงจะใช้เครื่องมือนี้ได้ไหม?
ตอบ: ไม่ต้อง เครื่องมือรันในเบราว์เซอร์ทั้งหมด ค่อยต้องมี Caddy บนเซิร์ฟเวอร์ตอนนำไฟล์ที่ได้ไปใช้งานจริงเท่านั้น
ถ: ทำไม localhost ถึงโดนใส่ http:// นำหน้าในผลลัพธ์?
ตอบ: หน่วยออกใบรับรองไม่ออกใบรับรองให้ชื่อภายในเครื่อง Caddy จึงเสิร์ฟชื่อพวกนี้ด้วย plain HTTP ตามค่าเริ่มต้น เครื่องมือทำตามพฤติกรรมเดียวกัน: โดเมนสาธารณะเขียนเปล่าไว้เพื่อ automatic HTTPS ส่วน localhost กับ 127.0.0.1 ได้ http://
ถ: เปิด HSTS ทันทีเลยปลอดภัยไหม?
ตอบ: ถือว่าเป็นคำมั่นที่ถอนคืนยาก เบราว์เซอร์จดจำ header นี้ครบตาม max-age ถ้าวันหนึ่ง HTTPS พัง ผู้ใช้ที่จดไว้แล้วจะเข้าเว็บไม่ได้ ทดสอบด้วย max-age สั้น ๆ ก่อนแล้วค่อยเพิ่ม
ถ: ข้อมูลที่พิมพ์ลงไปถูกส่งออกจากเบราว์เซอร์ไหม?
ตอบ: ไม่ ทุกอย่างถูกประกอบเป็น Caddyfile ในเครื่องของคุณ — เครื่องมือนี้เป็น client-side 100%