ในบทความนี้ผมจะมาแนะนำการ 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;
}
}
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/;
}
}
ปัญหาหลักๆ คือ บางที 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
หากทำตามข้อ 1 และ 2 แล้วยังมีปัญหา Connection Timeout จาก Cloudflare โดยที่เข้าผ่าน HTTP ได้ปกติ มีปัญหาเฉพาะ โดเมนที่เชื่อมต่อกับ Cloudflare แน่นอนว่าปัญหาอยู่ที่ SSL Certificate ของ Cloudflare ให้แก้ปัญหาโดยการ สร้างใหม่ ใส่ข้อมูลลงใน nginx ให้เรียบร้อย และ Revoke อันเก่าทิ้ง
หวังว่าจะช่วยเพื่อนๆ ที่กำลังพัฒนาเว็บไซต์ด้วย Node.js ไม่มากก็น้อยครับ
