Nginx

Buffer Settings ใน Nginx — ปรับแต่ง Buffer เพื่อประสิทธิภาพสูงสุด

Nginx เป็นเว็บเซิร์ฟเวอร์ที่มีประสิทธิภาพสูงและหนึ่งในคุณลักษณะสำคัญของมันคือการจัดการ Buffer อย่างมีประสิทธิภาพ Buffer Settings ใน Nginx มีบทบาทสำคัญต่อการประมวลผลคำขอ (requests) และการตอบสนอง (responses) ของเซิร์ฟเวอร์ การตั้งค่า buffer ที่เหมาะสมจะช่วยเพิ่มความเร็ว ลดการใช้หน่วยความจำ และป้องกันข้อผิดพลาดที่เกี่ยวข้องกับขนาดของไฟล์ที่อัปโหลด เนื้อหาบทความนี้จะอธิบายรายละเอียดเกี่ยวกับการตั้งค่า buffer ต่างๆ ในโปรแกรม Nginx และวิธีการปรับแต่งให้เหมาะสมกับการใช้งานของคุณ

Buffer คืออะไรและเหตุใดจึงสำคัญ

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

ในบริบทของ Nginx buffer มีความสำคัญสำหรับเหตุผลหลายประการ:

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

client_body_buffer_size — ขนาด Buffer สำหรับเนื้อหาของไคลเอนต์

client_body_buffer_size ควบคุมขนาดของ buffer ที่ใช้สำหรับอ่านเนื้อหาของคำขอจากไคลเอนต์ การตั้งค่านี้มีความสำคัญเมื่อคุณต้องการจัดการคำขอ POST ขนาดใหญ่ เช่น การอัปโหลดไฟล์

ค่าเริ่มต้น: 8k (8 กิโลไบต์)

ตัวอย่าง:

http {
    client_body_buffer_size 128k;
}

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

แนวทางการตั้งค่า: สำหรับแอปพลิเคชันทั่วไป ให้ตั้งค่าระหว่าง 64k ถึง 256k ขึ้นอยู่กับขนาดของคำขอที่ไคลเอนต์ส่งมา

client_header_buffer_size และ large_client_header_buffers

การตั้งค่าเหล่านี้ควบคุมขนาดของ buffer สำหรับการอ่านส่วนหัว (headers) ของคำขอจากไคลเอนต์

client_header_buffer_size ใช้สำหรับส่วนหัวปกติของคำขอ ค่าเริ่มต้นคือ 1k

http {
    client_header_buffer_size 2k;
}

large_client_header_buffers ใช้สำหรับส่วนหัวขนาดใหญ่ เช่น cookies ขนาดใหญ่หรือ URL ยาว ค่าเริ่มต้นคือ 4 ตัว ขนาด 8k

http {
    large_client_header_buffers 4 32k;
}

หากมี “upstream sent too big header while reading response header from upstream” หรือ “414 Request-URI Too Large” error คุณอาจต้องเพิ่มค่านี้

proxy_buffer_size และ proxy_buffers — ตั้งค่า Buffer สำหรับ Proxy

เมื่อ Nginx ทำหน้าที่เป็น reverse proxy คุณต้องตั้งค่า buffer สำหรับการสื่อสารระหว่าง Nginx กับแอปพลิเคชันแบคเอนด์

proxy_buffer_size ใช้สำหรับอ่านส่วนแรกของการตอบสนองจากเซิร์ฟเวอร์แบคเอนด์ โดยทั่วไปจะเก็บ response headers

http {
    proxy_buffer_size 4k;
}

proxy_buffers ควบคุมจำนวนและขนาดของ buffer สำหรับเก็บส่วนของ response body

http {
    proxy_buffers 8 4k;
}

ตัวอย่างด้านบนหมายความว่า “ใช้ 8 ตัว buffer ขนาด 4k แต่ละตัว” ดังนั้น buffer ทั้งหมดจะเป็น 32k

แนวทางการตั้งค่า: สำหรับเซิร์ฟเวอร์ที่มีการใช้งานหนัก ให้เพิ่ม proxy_buffers เป็น 16 8k หรือ 32 4k

proxy_busy_buffers_size และ proxy_temp_file_write_size

proxy_busy_buffers_size ใช้สำหรับกำหนดจำนวนไบต์ของ buffer ที่อาจ “busy” (ถูกใช้งาน) ในการส่งการตอบสนองไปยังไคลเอนต์ ในขณะที่ยังมีการอ่านข้อมูลจากแบคเอนด์อย่างต่อเนื่อง

http {
    proxy_busy_buffers_size 8k;
}

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

http {
    proxy_temp_file_write_size 16k;
}

fastcgi_buffer_size และ fastcgi_buffers — ตั้งค่า Buffer สำหรับ FastCGI

สำหรับแอปพลิเคชันที่ใช้ FastCGI (เช่น PHP-FPM) คุณต้องตั้งค่า FastCGI buffers

fastcgi_buffer_size ใช้สำหรับเก็บส่วนแรกของการตอบสนอง

http {
    fastcgi_buffer_size 32k;
}

fastcgi_buffers ใช้สำหรับเก็บเนื้อหาของการตอบสนอง

http {
    fastcgi_buffers 16 32k;
}

ค่าเหล่านี้มีความสำคัญเมื่อใช้ WordPress หรือแอปพลิเคชัน PHP อื่นๆ บนเซิร์ฟเวอร์ Nginx

output_buffers และ postpone_output

output_buffers ใช้สำหรับเก็บตัวกรองเอาต์พุต ค่าเริ่มต้นคือ 1 32k

http {
    output_buffers 2 32k;
}

postpone_output ใช้สำหรับการล่าช้าของการส่งข้อมูลไปยังไคลเอนต์ หากเซิร์ฟเวอร์ยังไม่ได้รับข้อมูลแบคเอนด์เพียงพอ ค่าเริ่มต้นคือ 1460 ไบต์

http {
    postpone_output 1460;
}

Buffer สำหรับการอัปโหลดไฟล์ (File Uploads)

หากเซิร์ฟเวอร์ของคุณต้องรองรับการอัปโหลดไฟล์ขนาดใหญ่ คุณต้องปรับแต่งการตั้งค่า buffer หลายตัว นอกจากนี้ยังต้องตั้งค่า client_max_body_size ซึ่งควบคุมขนาดสูงสุดของเนื้อหาของคำขอ

http {
    # ตั้งค่าขนาดสูงสุดของเนื้อหาคำขอ
    client_max_body_size 100m;

    # ตั้งค่า buffer size สำหรับเนื้อหา
    client_body_buffer_size 128k;

    # ตั้งค่า buffer สำหรับ proxy
    proxy_buffer_size 16k;
    proxy_buffers 16 32k;
    proxy_busy_buffers_size 64k;
}

สำหรับแอปพลิเคชันที่รองรับการอัปโหลดขนาดใหญ่ เช่น Media Library ในระบบจัดการเนื้อหา ให้พิจารณาตั้งค่าดังนี้:

  • client_max_body_size ควรเท่ากับหรือใหญ่กว่าขนาดไฟล์ที่ต้องการอัปโหลด
  • client_body_buffer_size ควรตั้งไว้ระหว่าง 64k ถึง 256k
  • proxy_buffer_size และ proxy_buffers ควรเพิ่มขึ้นเพื่อรองรับไฟล์ขนาดใหญ่

Buffering vs Non-Buffering — proxy_buffering

โดยค่าเริ่มต้น Nginx จะบัฟเฟอร์การตอบสนองจากแบคเอนด์ก่อนส่งไปยังไคลเอนต์ (buffering on) อย่างไรก็ตาม ในบางกรณี คุณอาจต้องปิดการบัฟเฟอร์

# ปิดการบัฟเฟอร์
http {
    proxy_buffering off;
}

ประโยชน์ของการปิดบัฟเฟอร์:

  • ลดความล่าช้า (latency) สำหรับการส่งข้อมูลแบบสตรีมมิง (streaming)
  • ลดการใช้หน่วยความจำเมื่อส่งไฟล์ขนาดใหญ่
  • มีประโยชน์สำหรับการเชื่อมต่อ WebSocket

ข้อเสีย: ประสิทธิภาพอาจลดลงเมื่อมี latency สูงระหว่าง Nginx และแบคเอนด์

การวินิจฉัย Buffer Issues จากลอก (Error Logs)

เมื่อพบปัญหาที่เกี่ยวข้องกับ buffer ให้ตรวจสอบไฟล์ลองของ Nginx เพื่อดูข้อความ error

tail -f /var/log/nginx/error.log

ข้อความ error ที่พบบ่อย:

  • “upstream sent too big header” — ต้องเพิ่ม proxy_buffer_size หรือ large_client_header_buffers
  • “414 Request-URI Too Large” — ต้องเพิ่ม client_header_buffer_size
  • “413 Request Entity Too Large” — ต้องเพิ่ม client_max_body_size
  • “open() failed … No space left on device” — ดิสก์ชั่วคราวเต็ม อาจต้องเพิ่ม buffer เพื่อลดการเขียนไปยังดิสก์

Buffer Size Recommendations โดยอิงตามกรณีการใช้งาน

เซิร์ฟเวอร์ทั่วไป (General Purpose Server)

http {
    client_body_buffer_size 128k;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;

    proxy_buffer_size 4k;
    proxy_buffers 8 4k;
    proxy_busy_buffers_size 8k;
}

เซิร์ฟเวอร์ที่รองรับการอัปโหลดไฟล์ขนาดใหญ่

http {
    client_max_body_size 500m;
    client_body_buffer_size 256k;
    client_header_buffer_size 2k;
    large_client_header_buffers 4 16k;

    proxy_buffer_size 16k;
    proxy_buffers 32 16k;
    proxy_busy_buffers_size 48k;
    proxy_temp_file_write_size 32k;
}

เซิร์ฟเวอร์ PHP/WordPress

http {
    client_body_buffer_size 128k;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;

    fastcgi_buffer_size 32k;
    fastcgi_buffers 16 32k;
    fastcgi_busy_buffers_size 64k;
    fastcgi_temp_file_write_size 32k;
}

เซิร์ฟเวอร์ที่มีการใช้งานสูง (High-Performance Server)

http {
    client_body_buffer_size 256k;
    client_header_buffer_size 2k;
    large_client_header_buffers 8 16k;

    proxy_buffer_size 16k;
    proxy_buffers 64 16k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 64k;
}

Best Practices สำหรับการตั้งค่า Buffer

เพื่อให้ได้ประสิทธิภาพสูงสุดจากการตั้งค่า buffer ในเซิร์ฟเวอร์ Nginx ของคุณ ให้ปฏิบัติตามแนวทางนี้:

1. เริ่มต้นด้วยค่าเริ่มต้น

อย่าเพิ่มค่า buffer โดยไม่จำเป็น ให้ลองใช้ค่าเริ่มต้นของ Nginx ก่อน และปรับแต่งเฉพาะเมื่อพบปัญหา

2. ตรวจสอบ System Resources

ตรวจสอบหน่วยความจำและพื้นที่ดิสก์ของเซิร์ฟเวอร์ก่อนเพิ่มค่า buffer

free -h
df -h

3. ทำการทดสอบเชิงสถิติ

ใช้เครื่องมือเช่น Apache Bench หรือ ApacheBench เพื่อวัดประสิทธิภาพหลังจากการปรับแต่ง

ab -n 10000 -c 100 https://example.com/

4. ตรวจสอบลอกอย่างสม่ำเสมอ

ติดตามไฟล์ลองของ Nginx เพื่อค้นหา error ที่เกี่ยวข้องกับ buffer

tail -100 /var/log/nginx/error.log | grep -i buffer

5. ปรับแต่งทีละขั้นตอน

เปลี่ยนแปลงค่า buffer ทีละตัวและทดสอบในแต่ละครั้ง เพื่อให้ทราบว่าการเปลี่ยนแปลงใดมีผลกระทบ

6. ใช้ location-specific Configuration

สำหรับแอปพลิเคชันที่แตกต่างกัน ให้ตั้งค่า buffer ที่แตกต่างกันในแต่ละ location block

server {
    listen 80;
    server_name example.com;

    # ตั้งค่าทั่วไป
    client_body_buffer_size 128k;

    # ตั้งค่าเฉพาะสำหรับอัปโหลด
    location /upload/ {
        client_body_buffer_size 256k;
        client_max_body_size 500m;
    }

    # ตั้งค่าเฉพาะสำหรับ API
    location /api/ {
        proxy_buffering off;
    }
}

7. ตรวจสอบประสิทธิภาพ CPU และ Memory

ใช้ top หรือ htop เพื่อติดตามการใช้งาน CPU และหน่วยความจำของโปรเซส Nginx

top -p $(pgrep -f 'nginx: master')

ตัวอย่าง Configuration ที่สมบูรณ์

นี่คือตัวอย่าง configuration ที่สมบูรณ์สำหรับเซิร์ฟเวอร์ WordPress ที่มีประสิทธิภาพสูง:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 2048;
    multi_accept on;
}

http {
    # Buffer settings
    client_body_buffer_size 256k;
    client_header_buffer_size 2k;
    large_client_header_buffers 8 16k;
    client_max_body_size 100m;

    # Proxy buffer settings
    proxy_buffer_size 16k;
    proxy_buffers 32 16k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 32k;

    # FastCGI buffer settings
    fastcgi_buffer_size 64k;
    fastcgi_buffers 32 64k;
    fastcgi_busy_buffers_size 128k;

    # Output buffer settings
    output_buffers 2 64k;
    postpone_output 1460;

    # Other important settings
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Logging
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # Gzip compression
    gzip on;
    gzip_vary on;
    gzip_types text/plain text/css text/javascript
               application/javascript application/json;

    # Include server blocks
    include /etc/nginx/sites-enabled/*;
}

สรุป

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

ข้อมูลสำคัญที่ต้องจำ:

  • client_body_buffer_size ควบคุมขนาดของเนื้อหาคำขอจากไคลเอนต์
  • client_header_buffer_size และ large_client_header_buffers ควบคุมขนาดของส่วนหัวคำขอ
  • proxy_buffer_size และ proxy_buffers ใช้สำหรับการสื่อสารแบบ reverse proxy
  • fastcgi_buffer_size และ fastcgi_buffers ใช้สำหรับแอปพลิเคชัน PHP
  • การตั้งค่าที่เหมาะสมขึ้นอยู่กับกรณีการใช้งานและทรัพยากรของเซิร์ฟเวอร์
  • ตรวจสอบลองของ Nginx เพื่อวินิจฉัยปัญหา
  • ปรับแต่งค่า buffer ทีละขั้นตอนและทดสอบในแต่ละครั้ง

แนะนำบริการ Dot Enterprise Cloud VPS & Cloud Hosting

หากคุณต้องการเซิร์ฟเวอร์ที่มีประสิทธิภาพสูง พร้อมการตั้งค่า Nginx ที่ดีแล้วสำเร็จ Dot Enterprise Cloud VPS และ Cloud Hosting เป็นตัวเลือกที่ยอดเยี่ยม

บริการของเรา รวมถึง:

  • เซิร์ฟเวอร์ Nginx ที่ตั้งค่าให้เหมาะสม
  • การสนับสนุนด้านเทคนิค 24/7
  • การสำรองข้อมูลอัตโนมัติ
  • การรักษาความปลอดภัยระดับเอนเทอร์ไพรส์
  • ความเร็ว (uptime) 99.9%

สำหรับข้อมูลเพิ่มเติมและการลองใช้ฟรี ให้เยี่ยมชม Cloud VPS และ Cloud Hosting ของ Dot Enterprise ในวันนี้

Contact Dot Enterprise: สำหรับการสอบถามเพิ่มเติม ให้ติดต่อทีมงานของเราที่ https://de.co.th