ตัวสร้างไฟล์ config ของ Nginx

สร้างคอนฟิก Nginx

การเขียนไฟล์ config ของ Nginx ตั้งแต่ศูนย์ หมายถึงต้องจำทุกบรรทัด proxy_set_header ทุกชนิด MIME ที่ gzip ต้องบีบอัด และความต่างเล็ก ๆ ระหว่าง try_files $uri/ /index.php?$args กับเวอร์ชันที่ทำให้การกำหนดเส้นทางพังโดยไม่รู้ตัว ตัวสร้างนี้จะถามชื่อโดเมน, upstream, ตัวจัดการ PHP และพาธของไฟล์ SSL จากนั้นจึงสร้าง server block ที่มีค่าเริ่มต้นเหมาะสมสำหรับ TLS, HTTP/2, การแคชไฟล์สแตติก และการบีบอัดข้อมูล

วิธีสร้าง server block ของคุณ

  1. 1

    เลือกค่าที่ตั้งไว้ล่วงหน้า

    เว็บไซต์สแตติก, PHP-FPM (Laravel หรือ WordPress), reverse proxy สำหรับ Node.js หรือการเปลี่ยนเส้นทางแบบ 301 ธรรมดา

  2. 2

    กรอกชื่อโดเมน

    ใส่รายการ server_name ให้ครบ โดยทั่วไปคือทั้งแบบที่มี www และแบบที่ไม่มี www

  3. 3

    ตั้งค่ารายละเอียด SSL

    ชี้ไปยังไฟล์ fullchain และ privkey ของคุณ หรือข้ามขั้นตอนนี้หากใช้ HTTP อย่างเดียว

  4. 4

    ปรับค่า upstream

    พอร์ต, พาธของ socket หรือ URL ของ backend สำหรับกรณีที่ใช้ proxy_pass

  5. 5

    คัดลอกแล้วนำไปใช้

    วางผลลัพธ์ไว้ใน /etc/nginx/sites-available จากนั้นรัน nginx -t แล้วสั่งรีโหลด Nginx

server block ที่ดีมีหน้าตาอย่างไร

virtual host ของ Nginx ในปัจจุบันมักประกอบด้วยส่วนเหล่านี้:

ส่วนประกอบ หน้าที่
listen 443 ssl http2 รับการเชื่อมต่อ HTTPS โดยเปิดใช้งาน HTTP/2
ssl_certificate + ssl_certificate_key ชี้ไปยังไฟล์ใบรับรองและคีย์ของ TLS
ssl_protocols TLSv1.2 TLSv1.3 ตัด TLS เวอร์ชันเก่าออก
gzip on + รายการชนิดไฟล์ บีบอัดข้อความ/HTML/JSON/JS/CSS ขณะส่งข้อมูล
ส่วนหัว expires สำหรับไฟล์สแตติก ลดจำนวนคำขอซ้ำจากผู้ที่กลับมาเยี่ยมชม
try_files ส่งต่อไปยัง front controller (PHP, Laravel ฯลฯ)
HSTS + ส่วนหัวด้านความปลอดภัย บังคับให้เบราว์เซอร์ใช้ TLS เสมอ

พื้นฐานของ reverse proxy

สำหรับแอป Node.js, Python และ Ruby ที่ทำงานอยู่หลัง Nginx:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

การลืม X-Forwarded-For คือสาเหตุคลาสสิกที่ทำให้ log ของแอปไม่เห็น IP จริงของผู้ใช้

ข้อผิดพลาดที่พบบ่อย

  • ไม่มี server block สำรองสำหรับ server_name หากไม่มีชื่อใดตรงกัน Nginx จะใช้ server block แรกเป็นค่าเริ่มต้น ควรเพิ่ม block server_name _ ที่รับทุกกรณีและตอบกลับด้วยรหัส 444 เพื่อป้องกันการโจมตีผ่านส่วนหัว Host
  • ลำดับใบรับรองผิด ไฟล์ ssl_certificate ต้องเป็นสายใบรับรองแบบเต็ม (fullchain: ใบรับรองของเว็บไซต์ + ใบรับรองตัวกลาง) ไม่ใช่ใบรับรองของเว็บไซต์เพียงใบเดียว
  • แคชนานเกินไป การส่ง expires 1y ให้กับ /index.html จะทำให้การดีพลอยครั้งต่อไปไม่มีผล ควรใส่เลขเวอร์ชันใน URL ของไฟล์สแตติกแทน
  • รีโหลดโดยไม่ทดสอบก่อน ให้รัน nginx -t ก่อน systemctl reload nginx ทุกครั้ง เพราะไวยากรณ์ผิดเพียงจุดเดียวก็ทำให้เว็บไซต์ล่มได้

คำถามที่พบบ่อย

HTTP/2 เสถียรแล้วและรองรับอย่างทั่วถึงใน Nginx 1.25 ขึ้นไป ส่วน HTTP/3 (QUIC) มีให้ใช้ใน Nginx 1.25 ขึ้นไปแต่ยังเป็นฟีเจอร์ทดลอง สำหรับการตั้งค่าใช้งานจริงในตอนนี้ ให้เปิด HTTP/2 ไว้ และจะเพิ่ม HTTP/3 ด้วยไดเรกทิฟ http3 และ quic ก็ได้ตามต้องการ

ตามธรรมเนียมจะเก็บสายใบรับรองสาธารณะไว้ใน /etc/ssl/certs/ และเก็บคีย์ส่วนตัวไว้ใน /etc/ssl/private/ ส่วน Let’s Encrypt จะเก็บทุกอย่างไว้ใต้ /etc/letsencrypt/live/domain/ ให้ใช้พาธตามที่เครื่องมือต่ออายุใบรับรองของคุณกำหนด

จำเป็นสำหรับเว็บไซต์ส่วนใหญ่ ให้เพิ่ม server block แยกต่างหากบนพอร์ต 80 ที่ตอบกลับด้วย 301 https://$host$request_uri เมื่อใช้ร่วมกับ HSTS แล้ว block HTTP นี้แทบจะไม่ถูกเรียกอีกเลยหลังคำขอแรก

รัน sudo nginx -t เพื่อตรวจไฟล์ config โดยไม่ต้องรีโหลด ถ้าขึ้นข้อความ “syntax is ok” และ “test is successful” จึงค่อยรีโหลดด้วย sudo systemctl reload nginx อย่าใช้ restart ในระบบที่ใช้งานจริงเด็ดขาด เพราะการรีโหลดจะไม่ทำให้บริการหยุดชะงัก

เครื่องมือที่เกี่ยวข้อง

ตารางอ้างอิง ASCII

ตาราง ASCII ครบตั้งแต่ 0 ถึง 127 พร้อมค่าเลขฐานสิบ ฐานสิบหก ฐานแปด ฐานสอง และรูปแบบการอ้างอิงอักขระแบบตัวเลขของ HTML รวม NUL, LF และ DEL

อ้างอิงตัวอักษร HTML

รายการที่สามารถค้นหาได้ขององค์ประกอบ HTML พร้อมรหัสชื่อและรหัสตัวเลข รวมถึงฟังก์ชันสำเนาด้วยคลิกเดียวสำหรับตัวอักษรพิเศษและสัญลักษณ์ต่างๆ

ตารางอ้างอิงแป้นพิมพ์ลัด

ค้นหาแป้นพิมพ์ลัดเริ่มต้นตามเอกสารของ VS Code, Chrome และ Bash ที่ใช้ GNU Readline บน macOS, Windows และ Linux

ตัวตรวจสอบอีเมล

ตรวจสอบที่อยู่อีเมล: ตรวจไวยากรณ์ RFC 5322 ค้นหา MX เรกคอร์ดแบบเรียลไทม์ พร้อมรายละเอียดส่วนท้องถิ่น โดเมน และความยาว ไม่มีการส่งอีเมลใด ๆ

เครื่องมือสร้าง EditorConfig

สร้างไฟล์ .editorconfig ด้วยกฎสไตล์และขนาดการเยื้อง การจบบรรทัด ชุดอักขระ และช่องว่างของคุณ เพื่อให้การจัดรูปแบบสอดคล้องกันในทุก IDE และโปรแกรมแก้ไข

ตัวลดรูปพีชคณิตบูลีน

ประเมินนิพจน์บูลีนสำหรับทุกชุดอินพุตและดูตารางค่าความจริงที่สมบูรณ์ รองรับตัวแปรสูงสุดห้าตัวและตัวดำเนินการ &, |, !, ^

เครื่องมือนี้มีให้บริการในภาษาอื่น