Nginx timeout เป็นหนึ่งในการตั้งค่าที่สำคัญที่สุดในการจัดการเซิร์ฟเวอร์เว็บ เมื่อคลายเอนต์ส่งคำขอ (request) หรือเซิร์ฟเวอร์ส่งการตอบสนอง (response) ต่อกว่าเวลาที่กำหนด Nginx จะปิดการเชื่อมต่อโดยอัตโนมัติ การตั้งค่า timeout ที่ไม่เหมาะสมอาจนำไปสู่ข้อผิดพลาด 408 (Request Timeout) หรือ 504 (Gateway Timeout) ซึ่งส่งผลกระทบต่อประสบการณ์ผู้ใช้และประสิทธิภาพของแอปพลิเคชัน
บทความนี้จะอธิบายรายละเอียดเกี่ยวกับ Nginx timeout settings ทั้งหมด วิธีการตั้งค่า ส่วนประกอบ และวิธีการออกแบบโซลูชันที่เหมาะสมสำหรับแอปพลิเคชันของคุณ
Client Timeouts — ตั้งค่า Timeout สำหรับคลายเอนต์
Client timeout เป็นการจัดการเวลารอสำหรับการเชื่อมต่อจากผู้ใช้ไปยังเซิร์ฟเวอร์ Nginx หากคลายเอนต์ไม่ส่งข้อมูลมาถึงภายในเวลาที่กำหนด Nginx จะปิดการเชื่อมต่อ
client_body_timeout — จำนวนเวลารอสำหรับ Request Body
Directive นี้กำหนดเวลาที่ Nginx จะรอการรับข้อมูล (body) ของ request จากคลายเอนต์ ค่าเริ่มต้นคือ 60 วินาที หากคลายเอนต์ส่งข้อมูลช้าหรือขาดการส่งสำเร็จ การเชื่อมต่อจะถูกปิด
http {
client_body_timeout 60s; # ค่าเริ่มต้น
}
server {
client_body_timeout 120s; # เพิ่มสำหรับการอัพโหลดไฟล์ขนาดใหญ่
}
สำหรับแอปพลิเคชันที่อัพโหลดไฟล์ขนาดใหญ่ ควรเพิ่มค่า client_body_timeout เป็น 120-300 วินาที เพื่อหลีกเลี่ยงการหมดเวลา
client_header_timeout — จำนวนเวลารอสำหรับ Request Headers
Directive นี้กำหนดเวลาที่ Nginx จะรอการรับ HTTP headers จากคลายเอนต์ ค่าเริ่มต้นคือ 60 วินาที บ่อยครั้งค่านี้ไม่จำเป็นต้องเปลี่ยนแปลง เว้นแต่ว่าคุณต้องจัดการกับคลายเอนต์ที่ช้า
server {
client_header_timeout 30s; # เพิ่มเสถียรภาพสำหรับเครือข่ายช้า
}
Server-to-Client Response Timeouts
send_timeout — เวลารอสำหรับส่งการตอบสนองไปยังคลายเอนต์
Directive นี้กำหนดเวลารอการส่งการตอบสนองจากเซิร์ฟเวอร์ไปยังคลายเอนต์ หากคลายเอนต์ไม่รับข้อมูลภายในเวลาที่กำหนด การเชื่อมต่อจะถูกปิด ค่าเริ่มต้นคือ 60 วินาที
http {
send_timeout 60s; # ค่าเริ่มต้น
}
server {
send_timeout 30s; # เพื่อปิดการเชื่อมต่อที่ชะลอตัวเร็วขึ้น
}
keepalive_timeout — เวลารอสำหรับ Keep-Alive Connection
Directive นี้กำหนดเวลารอการเชื่อมต่อแบบ Keep-Alive ระหว่างคลายเอนต์และเซิร์ฟเวอร์ Keep-Alive อนุญาตให้ใช้การเชื่อมต่อเดียวสำหรับหลายคำขอ ซึ่งปรับปรุงประสิทธิภาพและลดภาระของเซิร์ฟเวอร์
http {
keepalive_timeout 65s; # ค่าเริ่มต้น
keepalive_requests 100; # จำนวนคำขอสูงสุดต่อการเชื่อมต่อ
}
ค่า keepalive_timeout ที่เหมาะสมช่วยให้บรรเทาภาระ CPU และลดเวลาในการสร้างการเชื่อมต่อใหม่ อย่างไรก็ตาม ค่าที่สูงเกินไปอาจใช้ทรัพยากรเซิร์ฟเวอร์มากเกินไป
Upstream/Proxy Timeouts — การตั้งค่า Timeout สำหรับ Upstream Server
เมื่อ Nginx ทำหน้าที่เป็น reverse proxy หรือ load balancer ต้องตั้งค่า proxy timeout เพื่อควบคุมเวลารอการตอบสนองจาก upstream server
proxy_connect_timeout — เวลารอการเชื่อมต่อกับ Upstream Server
Directive นี้กำหนดเวลารอการเชื่อมต่อกับ upstream server (เช่น application server หรือฐานข้อมูล) ค่าเริ่มต้นคือ 60 วินาที
upstream backend {
server app1.example.com:8080;
server app2.example.com:8080;
}
server {
location / {
proxy_connect_timeout 30s; # เวลารอเชื่อมต่อกับ upstream
proxy_pass http://backend;
}
}
proxy_read_timeout — เวลารอการรับการตอบสนองจาก Upstream
Directive นี้เป็นหนึ่งในการตั้งค่าที่สำคัญที่สุด กำหนดเวลารอการรับข้อมูลจาก upstream server หากการตอบสนองมาช้าเกินไป ข้อผิดพลาด 504 Gateway Timeout จะเกิดขึ้น
server {
location ~ \.php$ {
proxy_read_timeout 300s; # สำหรับ PHP scripts ที่ใช้เวลานาน
proxy_pass http://php-upstream;
}
location /api/ {
proxy_read_timeout 30s; # สำหรับ APIs ที่รวดเร็ว
proxy_pass http://api-upstream;
}
}
ค่า proxy_read_timeout ควรตั้งให้สูงกว่า client_body_timeout เพื่อให้ upstream server มีเวลาเพียงพอในการประมวลผลคำขอ
proxy_send_timeout — เวลารอการส่งข้อมูลไปยัง Upstream
Directive นี้กำหนดเวลารอการส่งข้อมูลไปยัง upstream server ส่วนใหญ่ค่านี้ใกล้เคียงกับ proxy_read_timeout
server {
location / {
proxy_connect_timeout 30s;
proxy_send_timeout 60s; # เวลารอส่งข้อมูล
proxy_read_timeout 60s; # เวลารอรับข้อมูล
proxy_pass http://backend;
}
}
FastCGI Timeouts — ตั้งค่า Timeout สำหรับ PHP-FPM
หาก Nginx ใช้งาน PHP-FPM จำเป็นต้องตั้งค่า FastCGI timeout เพื่อควบคุมเวลารอการประมวลผล PHP
fastcgi_read_timeout — เวลารอการรับผลลัพธ์จาก PHP-FPM
Directive นี้กำหนดเวลารอการรับการตอบสนองจาก PHP-FPM ค่าเริ่มต้นคือ 30 วินาที สำหรับแอปพลิเคชัน PHP ที่ใช้เวลาประมวลผลนาน ควรเพิ่มค่านี้
server {
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # PHP-FPM socket
fastcgi_read_timeout 300s; # เวลารอ 5 นาที
fastcgi_connect_timeout 60s; # เวลารอเชื่อมต่อ
fastcgi_send_timeout 60s; # เวลารอส่งข้อมูล
include fastcgi_params;
}
}
Advanced Timeout Settings
resolver_timeout — เวลารอสำหรับ DNS Resolution
Directive นี้กำหนดเวลารอสำหรับการแปลง DNS (Domain Name System) ค่าเริ่มต้นคือ 30 วินาที หาก DNS resolver ช้า ข้อผิดพลาดอาจเกิดขึ้น
http {
resolver 8.8.8.8 8.8.4.4; # Google DNS
resolver_timeout 10s; # เวลารอ DNS
}
lingering_timeout — ปิดการเชื่อมต่อที่ค้างไว้
Directive นี้กำหนดเวลารอสำหรับปิดการเชื่อมต่อที่มีข้อมูลค้างเหลือ หลังจากส่งการตอบสนองให้คลายเอนต์แล้ว
server {
lingering_timeout 30s; # เวลารอเพิ่มเติม
lingering_time 30s; # ระยะเวลาเพิ่มเติม
}
reset_timedout_connection — ตั้งค่ากำหนดหมดเวลา
Directive นี้บอก Nginx ให้ปล่อยการเชื่อมต่อที่หมดเวลาแล้วโดยใช้ TCP RST flag แทนการปิดแบบปกติ
server {
reset_timedout_connection on; # เปิดใช้งาน
}
Timeout สำหรับ WebSocket Connections
WebSocket ใช้การเชื่อมต่อที่อยู่คงตัว (persistent connection) ซึ่งต้องการการตั้งค่า timeout ที่แตกต่างจากการเชื่อมต่อ HTTP ทั่วไป
server {
location /ws {
proxy_pass http://websocket_backend;
# ตั้งค่า timeout สูงสำหรับ WebSocket
proxy_read_timeout 86400s; # 24 ชั่วโมง
proxy_send_timeout 86400s; # 24 ชั่วโมง
proxy_connect_timeout 30s;
# ตั้งค่า WebSocket-specific
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Timeout สำหรับการอัพโหลดไฟล์
การอัพโหลดไฟล์ขนาดใหญ่ต้องการการตั้งค่า timeout ที่เหมาะสมเพื่อหลีกเลี่ยงข้อผิดพลาด 408 Request Timeout
server {
# ตั้งค่าขนาดสูงสุดของ request body
client_max_body_size 500M;
location /upload {
# ตั้งค่า timeout สำหรับการอัพโหลด
client_body_timeout 300s; # 5 นาที
proxy_read_timeout 600s; # 10 นาที
proxy_send_timeout 600s; # 10 นาที
proxy_connect_timeout 60s;
proxy_pass http://upload_backend;
}
}
สำหรับการอัพโหลดไฟล์ที่มีขนาด 100 MB ขึ้นไป ควรตั้งค่า client_body_timeout เป็น 300-600 วินาที
Timeout สำหรับ Long-Running Requests
แอปพลิเคชันบางอย่างเช่น batch processing, data export, หรือ report generation อาจใช้เวลานาน ตั้งค่า timeout ให้สูงพอเพื่อให้คำขอสำเร็จ
server {
# สำหรับ batch processing
location /batch-process {
proxy_read_timeout 1800s; # 30 นาที
proxy_send_timeout 1800s; # 30 นาที
proxy_connect_timeout 60s;
# เพิ่ม buffer เพื่อจัดเก็บการตอบสนองขนาดใหญ่
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_pass http://backend;
}
# สำหรับ report generation
location /reports {
fastcgi_read_timeout 1200s; # 20 นาที
fastcgi_send_timeout 1200s; # 20 นาที
fastcgi_connect_timeout 60s;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
}
การวินิจฉัย Timeout Issues
Error 408 — Request Timeout
ข้อผิดพลาด 408 เกิดจากการที่คลายเอนต์ไม่ส่งข้อมูลหรือ headers ให้เซิร์ฟเวอร์ภายในเวลาที่กำหนด เพิ่มค่า client_body_timeout และ client_header_timeout
server {
# เพิ่ม timeout เพื่อแก้ 408
client_body_timeout 120s;
client_header_timeout 120s;
}
Error 504 — Gateway Timeout
ข้อผิดพลาด 504 เกิดจากการที่ upstream server ไม่ส่งการตอบสนองภายในเวลาที่กำหนด เพิ่มค่า proxy_read_timeout
server {
location / {
# เพิ่ม timeout เพื่อแก้ 504
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_connect_timeout 60s;
proxy_pass http://backend;
}
}
ตรวจสอบ logs ของ Nginx เพื่อหาข้อมูลเพิ่มเติม:
# ตรวจสอบ Nginx error log
tail -f /var/log/nginx/error.log | grep timeout
# ตรวจสอบ access log สำหรับ 504 errors
grep "504" /var/log/nginx/access.log
ตารางเปรียบเทียบ Timeout Settings ตามประเภท Application
| Application Type | client_body_timeout | send_timeout | proxy_read_timeout | proxy_connect_timeout |
|---|---|---|---|---|
| API Server | 30s | 30s | 30s | 10s |
| Web Application (WordPress) | 60s | 60s | 60s | 20s |
| File Upload | 300s | 300s | 300s | 30s |
| Long-Running Tasks | 600s | 600s | 1200s | 30s |
| WebSocket | 600s | 86400s | 86400s | 30s |
| Streaming/Video | 60s | 86400s | 86400s | 30s |
Best Practices สำหรับ Timeout Configuration
1. ทดสอบและปรับแต่ง (Testing & Tuning) — ไม่ควรตั้งค่า timeout สูงเกินไป เพราะจะใช้ทรัพยากรเซิร์ฟเวอร์มากขึ้น ให้ทดสอบแอปพลิเคชันของคุณและปรับแต่งตามความเหมาะสม
2. แบ่งแยกตามประเภท Request — ตั้งค่า timeout ที่แตกต่างสำหรับ location ต่างๆ เช่น API requests (timeout สั้น) และ file uploads (timeout ยาว)
3. ตั้งค่าให้สม่ำเสมอ — ให้ proxy_send_timeout และ proxy_read_timeout ใกล้เคียงกัน เพื่อหลีกเลี่ยงความไม่สมดุล
4. ติดตามและวิเคราะห์ Logs — ตรวจสอบ error logs และ access logs ประจำวันเพื่อหา timeout errors และปรับแต่งตามความจำเป็น
5. พิจารณา Network Latency — หาก upstream server อยู่ห่างไกล (เช่น cross-region) เพิ่มค่า timeout เพื่อชดเชยความล่าช้าของเครือข่าย
6. ใช้ Connection Pooling — สำหรับแอปพลิเคชันที่มีการ request จำนวนมาก ใช้ upstream connection pooling เพื่อลดภาระในการสร้าง connection ใหม่
upstream backend {
server backend1:8080;
server backend2:8080;
keepalive 32; # จำนวน idle connections ที่เก็บไว้
}
server {
location / {
proxy_http_version 1.1;
proxy_set_header Connection ""; # เปิด keep-alive
proxy_pass http://backend;
}
}
7. ตั้งค่า Keepalive อย่างเหมาะสม — ให้ keepalive_timeout สูงพอเพื่อให้ connection นั้นใช้ได้สำหรับหลายคำขอ แต่ไม่สูงเกินไปจนใช้ทรัพยากร
ตัวอย่าง Configuration ที่สมบูรณ์
นี่คือตัวอย่าง Nginx configuration ที่สมบูรณ์สำหรับเว็บแอปพลิเคชัน:
http {
# Global timeout settings
client_body_timeout 60s;
client_header_timeout 60s;
send_timeout 60s;
keepalive_timeout 65s;
resolver_timeout 10s;
upstream php-backend {
server 127.0.0.1:9000;
keepalive 16;
}
upstream api-backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
keepalive 32;
}
server {
listen 80;
server_name example.com;
# ส่งไปยัง HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
# SSL configuration...
# สำหรับไฟล์ PHP
location ~ \.php$ {
fastcgi_pass php-backend;
fastcgi_read_timeout 300s;
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
include fastcgi_params;
}
# สำหรับ API requests
location /api/ {
proxy_pass http://api-backend;
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
# สำหรับอัพโหลดไฟล์
location /upload {
client_body_timeout 600s;
client_max_body_size 1G;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_pass http://api-backend;
}
# สำหรับ WebSocket
location /ws {
proxy_pass http://api-backend;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# Default location
location / {
proxy_pass http://php-backend;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_connect_timeout 30s;
}
}
}
Timeout Configuration สำหรับ DE Cloud Services
หากคุณใช้บริการ DE Cloud VPS หรือ DE Cloud Hosting สามารถตั้งค่า Nginx timeout ได้ตามความต้องการของแอปพลิเคชันของคุณ เราขอแนะนำให้ติดต่อทีม support ของเรา หากคุณต้องการความช่วยเหลือในการตั้งค่า Nginx สำหรับแอปพลิเคชันของคุณ
สรุป
Nginx timeout configuration เป็นสิ่งสำคัญเพื่อให้แอปพลิเคชันของคุณทำงานได้ปกติและมีประสิทธิภาพสูง การตั้งค่า timeout ที่ไม่เหมาะสมอาจนำไปสู่ข้อผิดพลาด 408 หรือ 504 ซึ่งส่งผลกระทบต่อประสบการณ์ผู้ใช้
คำสำคัญที่ต้องจำ:
- ตั้งค่า client timeouts สำหรับการเชื่อมต่อจากคลายเอนต์
- ตั้งค่า proxy timeouts สำหรับการเชื่อมต่อกับ upstream servers
- ปรับแต่งตามประเภท application (API, file upload, WebSocket เป็นต้น)
- ติดตาม logs และปรับแต่งตามอย่างต่อเนื่อง
- ทดสอบและตรวจสอบก่อนนำขึ้น production
แนะนำบริการ DE Cloud VPS และ Cloud Hosting
DE Cloud VPS และ DE Cloud Hosting เป็นโซลูชันเซิร์ฟเวอร์ที่เหมาะสำหรับแอปพลิเคชันที่ต้องการการติดตั้ง Nginx configuration ที่ปรับแต่งได้ เรามีทีม technical support ที่พร้อมช่วยเหลือในการตั้งค่า Nginx, PHP-FPM, และการแก้ปัญหา timeout issues
สำหรับข้อมูลเพิ่มเติม ให้เยี่ยมชมเว็บไซต์ของเรา:
- DE Cloud VPS — สำหรับแอปพลิเคชันที่ต้องการความยืดหยุ่นในการกำหนดค่า
- DE Cloud Hosting — สำหรับเว็บไซต์และแอปพลิเคชันเว็บ
ติดต่อเรา: https://de.co.th

