Nginx

Timeouts ใน Nginx Configuration — ตั้งค่า Timeout อย่างเหมาะสม

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