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

ตั้งค่า 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 เรื่องที่ควรโฟกัส
- เปิดใช้งาน
TLSv1.2และTLSv1.3 - ตั้ง
session cacheเพื่อลดต้นทุนการจับมือซ้ำ - เปิด
OCSP staplingหากใบรับรองรองรับ
นอกจากนี้ ใน server block ควรตั้ง redirect จากพอร์ต 80 ไป 443 ให้ครบถ้วน และเพิ่ม header พื้นฐานด้านความปลอดภัย เช่น:
X-Content-Type-Options: nosniffReferrer-PolicyHSTSโดยเริ่มจากค่าสั้น ๆ ก่อน และยังไม่ต้องรวม 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 นาที
หากมีเวลาจำกัดและต้องเลือกทำเฉพาะสิ่งที่เห็นผลเร็วที่สุด ลำดับที่ควรทำคือ:
- เปิด gzip และกำหนด types ให้ครบ
- หากระบบพร้อม ค่อยเพิ่ม brotli
- ตั้ง cache สำหรับไฟล์ static โดยคิดเรื่อง versioning ให้ดี
- เปิด HTTP/2 ทันที
- วางแผน HTTP/3 เป็นระยะถัดไป
- ใส่ rate limit เฉพาะจุดเสี่ยง เช่น login และ API
- ใช้ TLS 1.2/1.3 พร้อมคอนฟิกที่ทันสมัย
สรุป
Nginx เป็นจุดสำคัญที่ส่งผลทั้งต่อความเร็ว ความเสถียร และความปลอดภัยของเว็บไซต์อย่างมาก ต่อให้ใช้โฮสต์แรงเพียงใด หากคอนฟิกยังไม่เหมาะสม ผู้ใช้ก็ยังสัมผัสได้ว่าเว็บช้าและไม่น่าเชื่อถือ
การเริ่มจากเรื่องพื้นฐานอย่างการเปิด gzip, ทำแคชไฟล์ static, ใช้ HTTP/2, ตั้ง rate limit และปรับ SSL/TLS ให้ถูกต้อง สามารถลดเวลาโหลดหน้าเว็บลงได้อย่างชัดเจน และช่วยให้ระบบทนต่อการใช้งานจริงหรือทราฟฟิกผิดปกติได้ดีขึ้นในเวลาอันสั้น
เมื่อทำครบตามแนวทางเหล่านี้ เว็บไซต์จะไม่เพียง “เร็วขึ้น” แต่ยัง “พร้อมใช้งานจริง” มากขึ้นในมุมของทั้งผู้ใช้และผู้ดูแลระบบ