โดยปกติแล้วหากการทำงานเครื่องที่เร็วจริงๆ หรือ traffic ไม่มากจริงๆ เราอาจจะไม่ได้พบ Error Code อะไรเลย หรือเจอก็ไม่มากนัก แต่ทีนี้หากพบว่า Nginx มีการแสดงผลเป็น 504 Gateway Time-Out อาจจะเป็นไปได้หลายสาเหตุ เช่น
1. หาก Nginx ทำงานเป็น Web Server แล้วใช้งาน PHP-FPM สาเหตุอาจเกิดจาก PHP-FPM ทำงานไม่ทัน จนเจ๊งไป ก็เป็นได้เช่นกัน
2. หาก Nginx ทำงานเป็น Reverse Proxy อาจเป็นไปได้ว่าเครื่องข้างหลังบ้านอาจจะเจ๊งไปซึ่งก็อาจจะทำให้เกิด 502 Bad Gateway ได้ ซึ่งก็แก้ไขได้โดยการไป Restart Web Server หรือไปปรับประสิทธิภาพ Web Server ที่อยู่ข้างหลังแทน แต่หากไม่เจ๊งไปซะก่อน เครื่องตอบสนองช้ากว่าที่เรากำหนดก็อาจจะเกิด 504 Gateway Time-Out ได้เช่นกัน
ทั้งนี้ปัญหา 502 Bad Gateway สามารถแก้ไขได้ดังนี้
1. เพิ่ม Buffer และ Timeout ให้กับ HTTP
http {
…
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
…
}
2. พยายามทำให้แน่ใจว่า PHP-FPM ยังคงทำงานอยู่ปกติ และยังเชื่อมต่อกับ Nginx ได้อย่างปกติ
โดย Configure ของ PHP-FPM ที่อยู่ใน /etc/php-fpm.d/www.conf (หากเป็น Ubuntu จะอยู่ที่ /etc/php5/fpm/pool.d/www.conf)จะมีหน้าตาเหมือนกับใน Nginx เช่น หากมีการกำหนด PHP-FPM ทำงานเป็นแบบ Listening อยู่เป็น
listen = 127.0.0.1:9000
ในส่วนของ Nginx ก็ต้องมีการกำหนดให้ติดต่อไปยัง PHP-FPM ที่ 127.0.0.1:9000 ด้วยเช่นกัน
fastcgi_pass 127.0.0.1:9000;
ทั้งนี้หาก PHP-FPM ใช้งานเป็นแบบ file เช่น
listen = /var/run/php5-fpm.sock
ทางของ Nginx ก็ต้องใช้งานเป็นรูปแบบไฟล์ด้วยเช่นกัน
fastcgi_pass unix:/tmp/php5-fpm.sock;
(ทั้งนี้ผู้เขียนแนะนำให้ใช้เป็นแบบ listening มากกว่าครับ แต่หากจะใช้เป็นไฟล์ อย่าลืมกำหนด Permission ของ PHP5-FPM.sock ให้สามารถ read,write ได้ด้วยนะครับ)
chmod 0660 /var/run/php5-fpm.sock
chown www-data:www-data /var/run/php5-fpm.sock
3. Disable APC Caching แล้วไปใช้ Caching แบบอื่นแทนอย่างเช่น Xcache
เนื่องด้วยมีคนพบปัญหาว่าใช้งาน APC Caching แล้วมีปัญหาเกี่ยวกับ 504 เยอะมากๆ จึงแนะนำให้ไปใช้ตัวอื่นแทนครับ
# apt-get install php5-xcache
504 Gateway Time-Out สามารถแก้ไขได้ดังนี้
– แก้ไขที่ max_execution_time เพื่อเพิ่มเวลาในการทำงานใน php.ini (หากเป็น Ubuntu จะอยู่ที่ /etc/php5/fpm/php.ini)
max_execution_time = 300
– จากนั้นไปเพิ่มการทำงานใน PHP5-FPM ใน request_terminate_timeout ที่อยู่ใน www.conf
request_terminate_timeout = 300
– สุดท้ายเข้าไปแก้ Request Time Out ของ Nginx ในส่วน fastcgi_read_timeout ให้เป็นค่าที่มากขึ้น
fastcgi_read_timeout 300;
– หาก Nginx เป็น Reverse Proxy ให้กำหนดดังนี้
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
Reference::
– http://www.nginxtips.com/504-gateway-time-out-using-nginx/
– http://idroot.net/tutorials/install-xcache-php-centos/
– http://www.nginxtips.com/502-bad-gateway-using-nginx/
ที่มา http://www.techsuii.com/2015/05/02/how-to-fix-nginx-502-bad-gateway-or-504-gateway-timeout/