วิธีการแก้ไข Nginx 502 Bad Gateway, 504 Gateway Time-out

โดยปกติแล้วหากการทำงานเครื่องที่เร็วจริงๆ หรือ 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/
  • 89 Korisnici koji smatraju članak korisnim
Je li Vam ovaj odgovor pomogao?

Vezani članci

linux script to check if a service is running and start it, if it’s stopped

Here is a simple script that will check if your specified service is running and will start it if...

การอัพเดท PHPMyAdmin บน Directadmin

cd /usr/local/directadmin/custombuild./build update./build phpmyadmin

เพิ่ม Plugin CustomBuild ใน Directadmin

ไปที่ Plugin Manager ใน Directamin วาง URL http://www.custombuild.eu/plugin/custombuild.tar.gz...

การหาไฟล์จากข้อความและวันที่อัพเดท

หาข้อความว่า base64_decode ในไฟล์ .phpgrep -lr --include=*.php "base64_decode" /path...

การเปิด let's encrypt ใน directadmin

เข้า Directadmin ใน Admin Level ในหมวด Admin tools เลือก File Editor กดเลือก Select a file to...