ปัญหา Connection Timeout และการ Optimization Nginx

Web Development 23 สิงหาคม พ.ศ. 2566 636
Home / Articles / 64

ในบทความนี้ผมจะมาแนะนำการ Optimization Website ที่ทำงานบน Node.js และใช้ Nginx เป็น Reverse Proxy สำหรับนักพัฒนาเว็บไซต์ที่เจอ Connection Timeout บ่อยๆ

ก่อนแรกต้องไปที่ไฟล์ /etc/nginx/sites-enabled/default สมมุติว่าใน server {} ผมมีตั้งค่าดังนี้

server {
    listen 80;
    listen [::]:80;
	
    server_name abc.com;

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

    location / {
        proxy_pass http://localhost:4444;
    }
}

1. เลิก Served Static Files จาก Node.js

Node.js จะใช้ทรัพยากรมาก หากต้อง Served Static ไฟล์ อย่างพวก รูปภาพ และไฟล์ต่างๆ ดังนั้นผมจึงสร้าง location /image/ ขึ้นมาเพื่อให้ nginx ทำการ served ไฟล์ใน /image/ แทน จะช่วยเพิ่มความเร็วของเว็บไซต์ โดยจะใช้ alias เชื่อมโยงไปหา Directory ดังกล่าว

server {
    listen 80;
    listen [::]:80;
	
    server_name abc.com;

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

    location / {
        proxy_pass http://localhost:4444;
    }
    location /image/ {
		alias /abc/public/image/;
    }
}

2. ตั้งค่า Proxy Timeout

ปัญหาหลักๆ คือ บางที Node.js กรณีที่เชื่อมต่อกับ MySQL อาจจะใช้เวลานาน ทำให้ Nginx ตัดการเชื่อมต่อไปก่อน สำหรับเว็บไซต์ที่ผูก DNS ไว้กับ Cloudflare ก็จะขึ้น Error 522 Connection Timeout.

วิธีแก้คือเราจะตั้งค่า Timeout ของแต่ละ request บน nginx ไว้ เพื่อขยายเวลาการเชื่อมต่อของ user

ในการตั้งค่า Nginx สามารถทำได้ตั้งแต่ใน http {} หรือ server {} จนถึง location {}

หากจะตั้ง timeout จาก http เลย ก็จะต้องเข้าไปที่ไฟล์  nginx.conf โดยใช้คำสั่ง

sudo nano /etc/nginx/nginx.conf

และเพิ่ม 4 บรรทัดข้างล่างนี้ เข้าไปในระหว่าง http {}

proxy_connect_timeout 1000;
proxy_send_timeout 1000;
proxy_read_timeout 1000;
send_timeout 1000;

ค่า 1000 ที่เห็นในโค้ด คือ วินาที หมายความว่า ไม่ว่า user จะ connect, read, send ข้อมูล จะสามารถใช้เวลาได้นานถึง 1000 วินาที

จากนั้น Restart Nginx โดยใช้คำสั่ง

sudo systemctl restart Nginx

3. ตรวจสอบ SSL

หากทำตามข้อ 1 และ 2 แล้วยังมีปัญหา Connection Timeout จาก Cloudflare โดยที่เข้าผ่าน HTTP ได้ปกติ มีปัญหาเฉพาะ โดเมนที่เชื่อมต่อกับ Cloudflare แน่นอนว่าปัญหาอยู่ที่ SSL Certificate ของ  Cloudflare ให้แก้ปัญหาโดยการ สร้างใหม่ ใส่ข้อมูลลงใน nginx ให้เรียบร้อย และ Revoke อันเก่าทิ้ง

หวังว่าจะช่วยเพื่อนๆ ที่กำลังพัฒนาเว็บไซต์ด้วย Node.js ไม่มากก็น้อยครับ

Profile Picture.
  • Name (Pen name): Sunny Jirakit (Sunny420x)
  • Study: Bachelor Degree of Computer Science from Chiang Mai Rajabhat University
  • Personality: Architect (INTJ-T)
  • Experience: JavaScript,  Angular.js, React.js, Next.js  Express.js, Unity C#, Socket.io