Khi nginx được cấu hình giống như proxy server chúng ta có thể gặp lỗi error 504 gateway timeout, trong bài viết này chúng ta tìm hiểu tại sao có lỗi 504 gateway timeout và làm sao để khắc phục lỗi.
504 gateway time out nginx là gì
Lỗi này xảy ra khi Nginx chạy như proxy server, ví dụ apache làm backend và nginx làm front-end, lỗi này có nghia là đã đat tới thời gian phản hồi của server, trong trường hợp của chúng tôi là thời gian phản hồi của php-fpm đã đạt tới, nguyên nhân dẫn tới tình trạng này.
- PHP script hoặc mã nguồn xử lý bởi php-fpm bị đóng băng, không phản hồi
- Script chạy trong thời gian dài, nhưng nginx được cấu hình tự reset kết nối nếu máy chủ không phản hồi
- Server bị quá tải và không thể phục vụ toàn bộ client kết nối
fix lỗi 504 gateway time out Nginx
Đầu tiên chúng ta cần kiểm tra RAM và CPU để xem có quá tải không
free -h
top
Nếu bạn thấy tài nguyên máy chủ hết, bạn cần tối ưu lại hoặc nâng cấp phần cứng server
Trường hợp 2: Nếu script cần thời gian dài hơn để xử lý hoạt động, chúng ta có thể cấu hình nâng thời gian chờ trên nginx. trong trường hợp này cần thêm đoạn cấu hình sau vào block FastCGI trong file nginx.conf
location ~ .php$ {
...
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
}
add thêm đoạn sau vào block server trong nginx.conf nếu bạn sử dụng nginx làm proxy cho apache
proxy_connect_timeout 600;
proxy_send_timeout 600;
Proxy_read_timeout 600;
Send_timeout 600;
Sau khi xong cần reset lại nginx:
systemctl restart nginx
chúng ta có thể theo dõi script nào đang thực thi chậm bằng cách ghi slow log, bằng cách cấu hình sau
sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Trong cấu hình trên các script chạy hơn 5s sẽ được add vào log, bạn có thể thay đổi giá trị này theo nhu cầu
bạn sửa file : /etc/php5/fpm/pool.d/www.conf và thêm đoạn sau nếu chưa có (đường dẫn với mỗi phiên bản php sẽ khác nhau bạn cần kiểm tra đúng đường dẫn)
request_terminate_timeout = 300
Trong /etc/php.ini sửa lại phần sau
max_execution_time = 300
Sau khi thao tác xong, bạn cần restart lại php-fpm và nginx để nhận giá trị mới