กลับไปหน้าบทความ
#Nginx#Web Performance#Security#HTTP/2#SSL

ตั้งค่า Nginx ให้เว็บเร็วและปลอดภัยขึ้นได้จริงใน 10 นาที

หลายเว็บไซต์ช้าทั้งที่ใช้โฮสต์แรง เพราะการตั้งค่า Nginx ยังไม่เหมาะสม บทความนี้สรุปแนวทางสำคัญที่ช่วยเพิ่มความเร็ว ความเสถียร และความปลอดภัยได้ภายในเวลาไม่นาน

20 มกราคม 2569อ่านประมาณ 2 นาที

แชร์บทความ

ตั้งค่า Nginx ให้เว็บเร็วและปลอดภัยขึ้นได้จริงใน 10 นาที

ตั้งค่า Nginx ให้เว็บเร็วและปลอดภัยขึ้นได้จริงใน 10 นาที

หลายครั้งที่เว็บไซต์โหลดช้า ทั้งที่ใช้เซิร์ฟเวอร์สเปกดีหรือโฮสต์มีประสิทธิภาพสูง ปัญหาไม่ได้อยู่ที่เครื่องเสมอไป แต่อยู่ที่การตั้งค่าเว็บเซิร์ฟเวอร์อย่าง Nginx ซึ่งมีผลโดยตรงต่อความเร็วในการส่งไฟล์ การแคช การเข้ารหัส และการป้องกันทราฟฟิกผิดปกติ

บทความนี้จะพาไล่เรียงแนวทางสำคัญที่ควรทำ หากต้องการให้เว็บตอบสนองเร็วขึ้น ปลอดภัยขึ้น และรองรับผู้ใช้จริงได้ดีขึ้น โดยไม่ต้องเริ่มจากการปรับระบบที่ซับซ้อนมากเกินไป

ก่อนเริ่มแก้ไขค่า Nginx

ไฟล์หลักของ Nginx มักอยู่ที่ /etc/nginx/nginx.conf และไฟล์ของแต่ละเว็บไซต์มักอยู่ใน /etc/nginx/sites-available/your-site

ทุกครั้งหลังแก้ไขคอนฟิก ควรตรวจสอบก่อนว่าไม่มี syntax error ด้วยคำสั่ง:

nginx -t

หากผลตรวจสอบผ่าน จึงค่อย reload เพื่อให้ค่าใหม่มีผล:

systemctl reload nginx

การทำตามขั้นตอนนี้ช่วยลดความเสี่ยงที่เว็บจะล่มจากการตั้งค่าผิดพลาด

1) เปิดการบีบอัดด้วย gzip และ brotli

หนึ่งในวิธีที่เห็นผลเร็วที่สุดคือการเปิดการบีบอัดไฟล์ก่อนส่งไปยังเบราว์เซอร์ โดยเฉพาะไฟล์ประเภท HTML, CSS, JavaScript, JSON และ SVG เพราะไฟล์เหล่านี้ลดขนาดลงได้มากเมื่อบีบอัด

gzip: จุดเริ่มต้นที่ควรเปิดทันที

gzip ใช้งานได้แทบทุกระบบและรองรับกว้าง เหมาะสำหรับการเริ่มต้นปรับความเร็วเว็บแบบง่ายที่สุด

สิ่งที่มักพลาดคือเปิด gzip แล้วลืมกำหนด types ให้ครอบคลุม ทำให้ไฟล์บางชนิดอย่าง JSON ไม่ถูกบีบอัดตามที่ควรจะเป็น

ในทางกลับกัน ไฟล์ที่ถูกบีบอัดมาแล้ว เช่น jpg, png, mp4 หรือ zip ไม่ควรนำมาบีบอัดซ้ำ เพราะแทบไม่ช่วยลดขนาดและอาจเพิ่มภาระเซิร์ฟเวอร์โดยไม่จำเป็น

brotli: ถ้ารองรับ ควรพิจารณาเพิ่ม

หากระบบรองรับ brotli จะช่วยลดขนาดไฟล์ได้ดีกว่า gzip ในหลายกรณี แต่ต้องมีโมดูล ngx_brotli ซึ่งบางดิสโทรมีแพ็กเกจพร้อมใช้งาน ขณะที่บางระบบอาจต้องคอมไพล์เพิ่มเอง

แนวคิดที่เหมาะสมคือให้เบราว์เซอร์ที่รองรับรับไฟล์แบบ brotli ส่วนที่ไม่รองรับก็ fallback เป็น gzip เพื่อให้ครอบคลุมผู้ใช้ทุกกลุ่ม

2) เปิดแคชสำหรับไฟล์ static ให้ตอบสนองไวขึ้น

การแคชไฟล์ static เช่น รูปภาพ ฟอนต์ CSS และ JavaScript เป็นวิธีที่ช่วยลดเวลาโหลดได้อย่างชัดเจน โดยเฉพาะผู้ใช้ที่กลับมาใช้งานเว็บไซต์ซ้ำ

แนวทางที่ได้ผลดีที่สุดคือใช้การตั้งชื่อไฟล์แบบมี hash เช่น app.8f3a1.css เพราะทำให้สามารถตั้ง cache ได้นานโดยไม่เสี่ยงที่ผู้ใช้จะติดไฟล์เวอร์ชันเก่า

ควรตั้งค่าอย่างไร

  • แยก location สำหรับไฟล์ static ให้ชัดเจน
  • ตั้ง expires เป็น 30 วัน หรือ 365 วันตามความเหมาะสม
  • กำหนด Cache-Control: public, max-age=...
  • ใช้ชื่อไฟล์แบบ versioned หรือมี hash จากกระบวนการ build

หากไฟล์ยังไม่ได้ทำ versioning ไม่ควรตั้งเวลาแคชนานเกินไป เพราะอาจทำให้ผู้ใช้ได้รับไฟล์เก่าค้างอยู่ในเบราว์เซอร์

3) เปิด HTTP/2 และวางแผนสำหรับ HTTP/3

HTTP/2: ควรเปิดใช้งานทันที

HTTP/2 ช่วยลด overhead จากการเปิดหลาย connection และรองรับการโหลดหลายไฟล์พร้อมกันได้มีประสิทธิภาพกว่าเดิม ผู้ใช้บนมือถือหรือเครือข่ายที่ไม่นิ่งมักรู้สึกถึงความแตกต่างได้ชัด

ในการใช้งานจริง มักเปิดผ่านการตั้งค่าใน server block เช่นการใช้ listen 443 ssl http2

HTTP/3: เป็นเป้าหมายถัดไป

HTTP/3 หรือ QUIC ช่วยปรับปรุงประสบการณ์ใช้งานบนเครือข่ายที่ไม่เสถียร และลดปัญหา head-of-line blocking ในบางสถานการณ์ได้ดี แต่การเปิดใช้งานยังต้องดูทั้งเวอร์ชันของ Nginx การ build และความพร้อมของระบบร่วมด้วย

กลยุทธ์ที่เหมาะคือเปิด HTTP/2 ให้สมบูรณ์ก่อน แล้วค่อยวางแผน HTTP/3 ในเฟสถัดไป

4) ตั้ง rate limit เพื่อกันทราฟฟิกผิดปกติ

เว็บไซต์จำนวนมากไม่ได้ช้าจากผู้ใช้จริง แต่ช้าจากการถูกยิงคำขอถี่เกินไป ไม่ว่าจะเป็นการ brute force หน้า login, การยิง API รัว ๆ หรือการสแกน path แปลก ๆ โดยบอทอัตโนมัติ

rate limit จึงเป็นเครื่องมือที่ช่วยลดความเสียหายได้ในระดับหนึ่ง แม้จะไม่ใช่คำตอบสุดท้ายสำหรับทุกการโจมตี เพราะผู้ไม่หวังดีอาจใช้ botnet กระจายหลาย IP ได้

แนวทางที่ควรใช้

  • สร้าง zone ใน http block
  • ใช้กับ path ที่มีความเสี่ยง เช่น /login หรือ /api
  • ตั้ง burst ให้เหมาะกับพฤติกรรมผู้ใช้จริง
  • พิจารณาการใช้ nodelay หรือไม่ใช้ ตามลักษณะระบบ

หัวใจสำคัญคืออย่าตั้งลิมิตเข้มเกินไปจนกระทบผู้ใช้จริง โดยเฉพาะระบบที่มีการกดซ้ำเร็วตามธรรมชาติ

5) ตั้งค่า SSL/TLS ให้ปลอดภัยและลื่นไหล

เรื่องความปลอดภัยไม่ควรถูกมองว่าเป็นภาระต่อประสิทธิภาพ เพราะหากตั้งอย่างเหมาะสม ทั้งสองเรื่องสามารถไปด้วยกันได้

แนวทางที่นิยมและทำได้เร็วคือใช้ Let’s Encrypt ร่วมกับ certbot เพื่อออกและต่ออายุใบรับรองอัตโนมัติ

3 เรื่องที่ควรโฟกัส

  1. เปิดใช้งาน TLSv1.2 และ TLSv1.3
  2. ตั้ง session cache เพื่อลดต้นทุนการจับมือซ้ำ
  3. เปิด OCSP stapling หากใบรับรองรองรับ

นอกจากนี้ ใน server block ควรตั้ง redirect จากพอร์ต 80 ไป 443 ให้ครบถ้วน และเพิ่ม header พื้นฐานด้านความปลอดภัย เช่น:

  • X-Content-Type-Options: nosniff
  • Referrer-Policy
  • HSTS โดยเริ่มจากค่าสั้น ๆ ก่อน และยังไม่ต้องรวม subdomain หากยังไม่พร้อม

6) ปรับค่าพื้นฐานอื่น ๆ ที่ช่วยเรื่องประสิทธิภาพ

นอกจากเรื่องบีบอัด แคช และโปรโตคอลแล้ว ยังมีค่าพื้นฐานบางอย่างที่ช่วยให้ Nginx ส่งไฟล์ได้มีประสิทธิภาพขึ้น เช่น

  • sendfile on เพื่อช่วยส่งไฟล์ได้เร็วขึ้น
  • tcp_nopush on เพื่อช่วยจัดการการส่งข้อมูลขนาดใหญ่
  • keepalive_timeout ที่เหมาะสม ไม่สั้นเกินไปจนเสียเวลา handshake ซ้ำ และไม่ยาวเกินไปจนกินทรัพยากร

ค่าพวกนี้อาจไม่หวือหวา แต่ส่งผลต่อประสบการณ์ใช้งานจริง โดยเฉพาะเว็บที่มีทราฟฟิกต่อเนื่อง

7) ทดสอบหลังตั้งค่าให้รู้ว่าดีขึ้นจริง

การปรับคอนฟิกจะมีความหมายก็ต่อเมื่อวัดผลได้ ควรตรวจสอบหลังตั้งค่าเสมอว่าระบบทำงานตามที่ต้องการ

รายการที่ควรเช็ก

  • ตรวจสอบ response headers ว่ามี content-encoding: gzip หรือ br
  • เช็ก cache-control และ expires ของไฟล์ static
  • ดูว่าเปิด HTTP/2 แล้วจริงผ่าน DevTools หรือ curl -I
  • ตรวจสอบคุณภาพ SSL ด้วยบริการทดสอบภายนอก เช่น SSL Labs

การทดสอบเหล่านี้ช่วยยืนยันได้ว่าไม่ได้เพียงแค่ “ตั้งไว้” แต่ได้ผลจริงในมุมของผู้ใช้ปลายทาง

8) ทริคที่คุ้มค่ามากแต่คนมักมองข้าม

หลายระบบปรับ Nginx แล้วแต่ยังหาไม่เจอว่าคอขวดอยู่ตรงไหน วิธีที่ช่วยได้มากคือการทำ log ให้ตอบคำถามเชิงปฏิบัติการได้ดีขึ้น

ตัวอย่างที่ควรพิจารณา:

  • เปิด log แยกสำหรับกรณี rate limit หรือ HTTP 429 เพื่อดูพฤติกรรมบอท
  • เก็บ $request_time และ $upstream_response_time ใน access log เพื่อแยกว่าเว็บช้าเพราะ Nginx หรือ backend
  • วิเคราะห์ให้ชัดว่าปัญหาอยู่ที่ Nginx, upstream application หรือฐานข้อมูล

สิ่งสำคัญคือต้องไม่เข้าใจผิดว่าการบีบอัดหรือแคชจะแก้ทุกปัญหา หาก backend ช้าอยู่แล้ว การแก้ที่ Nginx อย่างเดียวอาจช่วยได้เพียงบางส่วน

แนวทางสรุปสำหรับการลงมือภายใน 10 นาที

หากมีเวลาจำกัดและต้องเลือกทำเฉพาะสิ่งที่เห็นผลเร็วที่สุด ลำดับที่ควรทำคือ:

  1. เปิด gzip และกำหนด types ให้ครบ
  2. หากระบบพร้อม ค่อยเพิ่ม brotli
  3. ตั้ง cache สำหรับไฟล์ static โดยคิดเรื่อง versioning ให้ดี
  4. เปิด HTTP/2 ทันที
  5. วางแผน HTTP/3 เป็นระยะถัดไป
  6. ใส่ rate limit เฉพาะจุดเสี่ยง เช่น login และ API
  7. ใช้ TLS 1.2/1.3 พร้อมคอนฟิกที่ทันสมัย

สรุป

Nginx เป็นจุดสำคัญที่ส่งผลทั้งต่อความเร็ว ความเสถียร และความปลอดภัยของเว็บไซต์อย่างมาก ต่อให้ใช้โฮสต์แรงเพียงใด หากคอนฟิกยังไม่เหมาะสม ผู้ใช้ก็ยังสัมผัสได้ว่าเว็บช้าและไม่น่าเชื่อถือ

การเริ่มจากเรื่องพื้นฐานอย่างการเปิด gzip, ทำแคชไฟล์ static, ใช้ HTTP/2, ตั้ง rate limit และปรับ SSL/TLS ให้ถูกต้อง สามารถลดเวลาโหลดหน้าเว็บลงได้อย่างชัดเจน และช่วยให้ระบบทนต่อการใช้งานจริงหรือทราฟฟิกผิดปกติได้ดีขึ้นในเวลาอันสั้น

เมื่อทำครบตามแนวทางเหล่านี้ เว็บไซต์จะไม่เพียง “เร็วขึ้น” แต่ยัง “พร้อมใช้งานจริง” มากขึ้นในมุมของทั้งผู้ใช้และผู้ดูแลระบบ