Gần đây, tôi thấy mình có một trang web (Thương mại điện tử Prestashop trên máy Centos PHP-FPM /Apache / MySql) không hoạt động và không phản hồi các yêu cầu web.
Sau khi điều tra, sự cố là do lệnh gọi API được thực hiện bằng php-curl hướng tới điểm cuối tạm thời ngoại tuyến, bên trong tệp PHP của ứng dụng được gọi lại trong tất cả các trang của trang web.
Cuộc gọi cURL đã được thực hiện sai mà không có cài đặt CURLOPT_TIMEOUT_MS, vì vậy người dùng truy cập trang web của tôi đã nhanh chóng lấp đầy số lượng kết nối php tối đa, chặn các quy trình php-fpm và ngăn máy chủ của tôi nhận các kết nối đến khác.
Tôi tự hỏi liệu người ta có thể ngăn chặn/xác định nhanh chóng và hiệu quả sự cố như vậy "trong quá trình sản xuất" từ thiết bị đầu cuối nếu nó xảy ra lần nữa hay không (đặc biệt là để nhanh chóng hiểu đâu là điểm cuối bị chặn hoặc xác định tệp mà từ đó tập lệnh đã chặn máy chủ được tạo) , vì trong trường hợp của tôi, tôi phải kiểm tra sự cố ở "cấp ứng dụng" thay vì từ máy chủ vì:
- khởi chạy "top" máy chủ hiển thị danh sách các quy trình php-fpm bị chặn mà không có bất kỳ thông tin bổ sung nào để hiểu vấn đề (đồng thời tải trung bình của máy chủ là khoảng 0,00 vì hầu như không có hoạt động nào do kết nối bị kẹt).
- Khởi chạy "netstat -nputw" cho tôi thấy rất nhiều kết nối nội bộ ở trạng thái TIME_WAIT, nhưng một lần nữa không có thông tin nào về "thủ phạm" ngừng hoạt động (tôi có thể thấy điểm cuối được gọi bởi php-curl bằng netstat hoặc lệnh mạng tương tự không?)
- Khởi chạy "dấu vết" của các quy trình php-fpm, tôi thấy rất nhiều tệp liên quan, nhưng điều này không hữu ích lắm vì trang web, với lưu lượng truy cập trung bình, sẽ mở hàng tá tệp.
- Nhật ký máy chủ web chỉ thông báo cho tôi về thời gian chờ kết nối với tài nguyên web chứ không thông báo về tập lệnh chứa lệnh gọi cURL có vấn đề.
Cảm ơn bạn đã giúp đỡ.