502 bad gateway nginx – Xử lý lỗi “502 Bad Gateway” trên Nginx

30474

502 bad gateway nginx fix

Trong bài này, chúng tôi sẽ mô tả cách các điều kiện sau có thể khiến NGINX trả về lỗi 502 vả cách fix nhanh 502 bad gateway nginx:

1. PHP-FPM không chạy

Nếu PHP-FPM không chạy, NGINX sẽ trả về lỗi 502 cho bất kỳ yêu cầu nào nhằm truy cập ứng dụng PHP. Nếu bạn nhìn thấy 502s, trước tiên hãy kiểm tra để xác nhận rằng PHP-FPM đang chạy. Ví dụ: trên máy chủ Linux, bạn có thể sử dụng lệnh ps như lệnh này để tìm kiếm các quy trình PHP-FPM đang chạy:

sudo ps aux | grep 'php'

2. PHP-FPM đã hết thời gian chờ

Nếu ứng dụng của bạn mất quá nhiều thời gian để phản hồi, người dùng của bạn sẽ gặp phải lỗi hết thời gian chờ. Nếu thời gian chờ của PHP-FPM — request_termina_timeout của config (và mặc định là 20 giây) – ít hơn thời gian chờ của NGINX (mặc định là 60 giây), NGINX sẽ phản hồi với lỗi 502. Error log của NGINX hiển thị bên dưới chỉ ra rằng upstream process — là PHP-FPM — đã đóng kết nối trước khi gửi phản hồi hợp lệ. Nói cách khác, đây là error logs mà chúng tôi thấy khi PHP-FPM hết thời gian:

2020/02/20 17:17:12 [error] 3059#3059: *29 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/mypool.sock:", host: "localhost"

Bạn có thể tăng cài đặt thời gian chờ của PHP-FPM bằng cách chỉnh sửa tệp cấu hình (file config), nhưng điều này có thể gây ra một vấn đề khác: NGINX có thể hết thời gian trước khi nhận được phản hồi từ PHP-FPM. Thời gian chờ NGINX mặc định là 60 giây; nếu bạn đã tăng thời gian chờ PHP-FPM của mình trên 60 giây, NGINX sẽ trả về lỗi 504 Gateway Timeout nếu ứng dụng PHP của bạn không phản hồi kịp thời. Bạn có thể ngăn chặn điều này bằng cách tăng thời gian chờ NGINX của mình. Trong ví dụ bên dưới, chúng tôi đã tăng giá trị thời gian chờ lên 90 giây bằng cách thêm mục fastcgi_read_timeout vào block http của /etc/nginx/nginx.conf:

http { 
...
    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
    fastcgi_connect_timeout 90;
    fastcgi_send_timeout 90;
    fastcgi_read_timeout 90;
}

3. NGINX không thể giao tiếp với PHP-FPM

Nếu NGINX không thể giao tiếp với PHP-FPM vì bất kỳ lý do nào trong số này, nó sẽ phản hồi với lỗi 502, lưu ý điều này trong nhật ký truy cập của nó (/var/log/nginx/access.log):

127.0.0.1 - - [31/Jan/2020:18:30:55 +0000] "GET / HTTP/1.1" 502 182 "-" "curl/7.58.0"

NGINX’s access log không giải thích nguyên nhân gây ra lỗi 502, nhưng bạn có thể tham khảo error log của nó (/var/log/nginx/error.log) để tìm hiểu thêm. Ví dụ: đây là một mục nhập tương ứng trong nhật ký lỗi NGINX cho thấy rằng nguyên nhân của lỗi 502 là do socket không tồn tại, có thể do PHP-FPM không chạy.

2020/01/31 18:30:55 [crit] 13617#13617: *557 connect() to unix:/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host: "localhost"

Cách fix nhanh lỗi 502 bad gateway

  1. Mở file cấu hình Nginx:
nano /etc/nginx/nginx.conf

2. Thêm đoạn cấu hình sau vào trong block http { }

http {
    ...
    fastcgi_buffers         8 16k;
    fastcgi_buffer_size     32k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout    300;
    fastcgi_read_timeout    300;

    include /etc/nginx/conf.d/*.conf;
}

Nếu muốn tìm hiểu chuyên sâu hơn về các cấu hình trên, các bạn có về vào trang docs của Nginx với các thông số của module ngx_http_fastcgi_module rất cụ thể.

3. Khởi động lại nginx, php-fpm:

service nginx restart
service php-fpm restart