504 Cổng hết thời gian chờ – Bộ định tuyến hết thời gian chờ

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

Dấu hiệu

Ứng dụng khách nhận được mã trạng thái HTTP 504 kèm theo thông báo Gateway Timeout để phản hồi các lệnh gọi API.

Phản hồi lỗi này cho biết rằng máy khách không nhận được phản hồi kịp thời từ Apigee Edge hoặc máy chủ phụ trợ trong quá trình thực thi lệnh gọi API.

Thông báo lỗi

Ứng dụng khách nhận được mã phản hồi sau:

HTTP/1.1 504 Gateway Time-out

Khi gọi proxy như vậy bằng cURL hoặc trình duyệt web, bạn có thể gặp lỗi sau:

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
</body>
</html>

Nguyên nhân gây ra lỗi hết thời gian chờ là gì?

Đường dẫn thông thường cho một yêu cầu API thông qua nền tảng Edge là Client > Router > Message Processor > Backend Server như minh hoạ trong hình sau:

Tất cả các thành phần trong quy trình thời gian chạy Apigee Edge, bao gồm cả máy khách, Bộ định tuyến, Bộ xử lý thông báo và máy chủ phụ trợ, đều được thiết lập với các giá trị thời gian chờ mặc định phù hợp để đảm bảo rằng các yêu cầu API không mất quá nhiều thời gian để hoàn tất. Nếu bất kỳ thành phần nào trong luồng không nhận được phản hồi từ thành phần nguồn trong khoảng thời gian được chỉ định trong cấu hình thời gian chờ, thì thành phần cụ thể đó sẽ hết thời gian chờ và thường sẽ trả về lỗi 504 Gateway Timeout.

Cẩm nang này mô tả cách khắc phục và giải quyết lỗi 504 xảy ra khi Bộ định tuyến hết thời gian chờ.

Hết thời gian chờ trên bộ định tuyến

Thời gian chờ mặc định được định cấu hình trên Bộ định tuyến trong Apigee Edge là 57 giây. Đây là khoảng thời gian tối đa mà một proxy API có thể thực thi kể từ thời điểm yêu cầu API được nhận trên Edge cho đến khi phản hồi được gửi lại, bao gồm cả phản hồi phụ trợ và tất cả các chính sách được thực thi. Bạn có thể ghi đè thời gian chờ mặc định trên Bộ định tuyến/máy chủ ảo như được giải thích trong phần Định cấu hình thời gian chờ I/O trên Bộ định tuyến.

Các nguyên nhân có thể

Trong Edge, các nguyên nhân thường gặp gây ra lỗi 504 Gateway Timeout do Bộ định tuyến hết thời gian chờ là:

Nguyên nhân Mô tả Hướng dẫn khắc phục sự cố áp dụng cho
Cấu hình thời gian chờ không chính xác trên Bộ định tuyến Điều này xảy ra nếu Bộ định tuyến được định cấu hình với khoảng thời gian chờ I/O không chính xác. Người dùng Edge Public Cloud và Private Cloud

Các bước chẩn đoán thường gặp

Hãy sử dụng một trong các công cụ/kỹ thuật sau để chẩn đoán lỗi này:

  • Giám sát API
  • Nhật ký truy cập NGINX

Giám sát API

Cách chẩn đoán lỗi bằng tính năng Giám sát API:

  1. Chuyển đến trang Phân tích > Giám sát API > Điều tra.
  2. Lọc các lỗi 5xx và chọn khung thời gian.
  3. Vẽ Mã trạng thái theo Thời gian.
  4. Nhấp vào ô cụ thể có lỗi 504 để xem thêm thông tin chi tiết và xem nhật ký về những lỗi này như minh hoạ bên dưới:

    Ví dụ cho thấy Lỗi 504

  5. Trong ngăn bên phải, hãy nhấp vào Xem nhật ký.

    Trong cửa sổ Nhật ký lưu lượng truy cập, hãy lưu ý những thông tin sau đây đối với một số lỗi 504:

    • Yêu cầu: Phần này cung cấp phương thức yêu cầu và URI được dùng để thực hiện các lệnh gọi
    • Thời gian phản hồi: Thông tin này cho biết tổng thời gian đã trôi qua cho yêu cầu.

    Trong ví dụ trên,

    • Yêu cầu đang trỏ đến GET /test-timeout.
    • Thời gian phản hồi 57.001 giây. Điều này cho thấy Bộ định tuyến đã hết thời gian chờ trước khi Bộ xử lý thông báo có thể phản hồi vì giá trị này rất gần với thời gian chờ I/O mặc định được đặt trên Bộ định tuyến, tức là 57 giây.

    Bạn cũng có thể nhận tất cả nhật ký bằng cách sử dụng API GET logs (Nhận nhật ký) của API Giám sát. Ví dụ: bằng cách truy vấn nhật ký cho org, env, timeRangestatus, bạn có thể tải xuống tất cả nhật ký cho các giao dịch mà máy khách đã hết thời gian chờ.

    Vì API Monitoring đặt proxy thành - (not set) cho các lỗi 504 này, nên bạn có thể sử dụng API (Logs API) để lấy proxy được liên kết cho máy chủ ảo và đường dẫn.

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. Xem xét Thời gian phản hồi để biết thêm các lỗi 504 và kiểm tra xem Thời gian phản hồi có nhất quán hay không (giá trị thời gian chờ I/O được đặt trên Bộ định tuyến là 57 giây) trên tất cả các lỗi 504.

Nhật ký truy cập NGINX

Cách chẩn đoán lỗi bằng nhật ký truy cập NGINX:

  1. Kiểm tra nhật ký truy cập NGINX:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Tìm kiếm để xem có 504 Lỗi nào trong một khoảng thời gian cụ thể hay không (nếu vấn đề xảy ra trong quá khứ) hoặc xem có yêu cầu nào vẫn không thành công với 504 hay không.
  3. Xin lưu ý những thông tin sau đối với một số lỗi 504:
    • Thời gian phản hồi
    • URI yêu cầu

    Trong ví dụ này, chúng ta thấy những thông tin sau:

    • Thời gian yêu cầu: 57.001 giây. Điều này cho biết Bộ định tuyến đã hết thời gian chờ sau 57,001 giây.

    • Yêu cầu: GET /test-timeout
    • Tên thay thế của máy chủ lưu trữ: myorg-test.apigee.net
  4. Kiểm tra xem Thời gian yêu cầu có giống với thời gian chờ I/O được định cấu hình trên Bộ định tuyến/máy chủ ảo hay không. Nếu có, thì tức là Bộ định tuyến đã hết thời gian chờ trước khi Bộ xử lý thông báo không phản hồi trong khoảng thời gian này.

    Trong mục nhập Nhật ký truy cập NGINX ví dụ được minh hoạ ở trên, Thời gian yêu cầu57.001 giây, rất gần với thời gian chờ I/O mặc định được đặt trên Bộ định tuyến. Điều này cho thấy rõ rằng Bộ định tuyến đã hết thời gian chờ trước khi Bộ xử lý thông báo có thể phản hồi.

  5. Xác định API Proxy mà yêu cầu được thực hiện bằng cách sử dụng đường dẫn cơ sở trong trường Request (Yêu cầu).

Nguyên nhân: Cấu hình thời gian chờ không chính xác trên Bộ định tuyến

Chẩn đoán

  1. Xác định xem lỗi 504 có phải do Bộ định tuyến đã hết thời gian chờ trước khi Trình xử lý thông báo có thể phản hồi hay không. Bạn có thể thực hiện việc này bằng cách kiểm tra xem Thời gian phản hồi trong phần Giám sát API/Thời gian yêu cầu trong Bộ định tuyến (cả hai trường này đều biểu thị cùng một thông tin,nhưng có tên gọi khác nhau) có giống với thời gian chờ I/O được định cấu hình trên Bộ định tuyến/máy chủ ảo hay không và các trường Nguồn lỗi, Lỗi ProxyMã lỗi được đặt thành - bằng cách sử dụng nhật ký Giám sát API hoặc nhật ký Truy cập NGINX như được giải thích trong phần Các bước chẩn đoán thường gặp.
  2. Kiểm tra xem giá trị thời gian chờ I/O được định cấu hình trên Bộ định tuyến hoặc máy chủ ảo cụ thể có thấp hơn so với giá trị được định cấu hình trên Trình xử lý thông báo hoặc API Proxy cụ thể hay không.

    Bạn có thể thực hiện việc này bằng cách làm theo các bước trong phần này.

Xác minh thời gian chờ I/O trên máy chủ ảo

Giao diện người dùng Edge

Để xác minh thời gian chờ của máy chủ ảo bằng giao diện người dùng Edge, hãy làm như sau:

  1. Đăng nhập vào giao diện người dùng Edge.
  2. Chuyển đến mục Quản trị > Máy chủ ảo.
  3. Chọn một Môi trường cụ thể mà bạn đang gặp phải vấn đề hết thời gian chờ.
  4. Chọn máy chủ ảo cụ thể mà bạn muốn xác minh giá trị thời gian chờ I/O.
  5. Trong mục Properties (Thuộc tính), hãy xem giá trị Proxy Read Timeout (Thời gian chờ đọc proxy) tính bằng giây.

    Trong ví dụ trên, Proxy Read Timeout (Thời gian chờ đọc của proxy) được định cấu hình với giá trị 120. Điều này có nghĩa là thời gian chờ I/O được định cấu hình trên máy chủ ảo này là 120 giây.

API quản lý

Bạn cũng có thể xác minh Proxy Read Timeout bằng các API quản lý sau:

  1. Thực thi API Lấy máy chủ ảo để lấy cấu hình virtualhost như minh hoạ bên dưới:

    Người dùng Đám mây công khai

    curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Người dùng Đám mây riêng tư

    curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Trong trường hợp:

    ORGANIZATION_NAME là tên của tổ chức

    ENVIRONMENT_NAME là tên của môi trường

    VIRTUALHOST_NAME là tên của máy chủ ảo

  2. Kiểm tra giá trị được thiết lập cho thuộc tính proxy_read_timeout

    Định nghĩa máy chủ ảo mẫu

    {
      "hostAliases": [
        "api.myCompany,com",
      ],
      "interfaces": [],
      "listenOptions": [],
      "name": "secure",
      "port": "443",
      "retryOptions": [],
      "properties": {
        "property": [
          {
            "name": "proxy_read_timeout",
            "value": "120"
          }
        ]
      },
      "sSLInfo": {
        "ciphers": [],
        "clientAuthEnabled": "false",
        "enabled": "true",
        "ignoreValidationErrors": false,
        "keyAlias": "myCompanyKeyAlias",
        "keyStore": "ref://myCompanyKeystoreref",
        "protocols": []
      },
      "useBuiltInFreeTrialCert": false
    }

    Trong ví dụ trên, proxy_read_timeout được thiết lập với giá trị 120. Điều này có nghĩa là thời gian chờ I/O được định cấu hình trên máy chủ lưu trữ ảo này là 120 giây.

Xác minh thời gian chờ I/O trên tệp router.properties

  1. Đăng nhập vào máy Router.
  2. Tìm kiếm thuộc tính proxy_read_timeout trong thư mục /opt/nginx/conf.d và kiểm tra xem thuộc tính đó đã được đặt thành giá trị mới hay chưa như sau:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. Kiểm tra giá trị được đặt cho thuộc tính proxy_read_timeout trong tệp cấu hình máy chủ ảo cụ thể.

    Kết quả mẫu từ lệnh grep

    /opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57;
    /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;

    Trong ví dụ về đầu ra ở trên, hãy lưu ý rằng thuộc tính proxy_read_timeout đã được đặt thành giá trị mới 57 trong 0-default.conf. Đây là tệp cấu hình cho máy chủ ảo mặc định. Điều này cho biết thời gian chờ I/O được định cấu hình thành 57 giây trên Bộ định tuyến cho máy chủ ảo mặc định. Nếu có nhiều máy chủ ảo, bạn sẽ thấy thông tin này cho từng máy chủ. Lấy giá trị của proxy_read_timeout cho máy chủ ảo cụ thể mà bạn đã dùng để thực hiện các lệnh gọi API không thành công với lỗi 504.

Xác minh thời gian chờ I/O trong proxy API

Bạn có thể xem thời gian chờ I/O trong những trường hợp sau:

  • Điểm cuối mục tiêu của proxy API
  • Chính sách ServiceCallout của proxy API
Xem thời gian chờ I/O trong điểm cuối mục tiêu của proxy API
  1. Trong giao diện người dùng Edge, hãy chọn một API proxy cụ thể mà bạn muốn xem giá trị thời gian chờ I/O.
  2. Chọn điểm cuối mục tiêu cụ thể mà bạn muốn kiểm tra.
  3. Xem thuộc tính io.timeout.millis có giá trị phù hợp trong phần tử <HTTPTargetConnection> trong cấu hình TargetEndpoint.

    Ví dụ: thời gian chờ I/O trong mã sau đây được đặt thành 120 giây:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
Xem thời gian chờ I/O trong chính sách ServiceCallout của API proxy
  1. Trong giao diện người dùng Edge, hãy chọn một API proxy cụ thể mà bạn muốn xem giá trị thời gian chờ I/O mới cho chính sách ServiceCallout.
  2. Chọn chính sách ServiceCallout cụ thể mà bạn muốn kiểm tra.
  3. Xem phần tử <Timeout> có giá trị phù hợp trong cấu hình <ServiceCallout>.

    Ví dụ: thời gian chờ I/O của mã sau đây sẽ là 120 giây:

    <Timeout>120000</Timeout>

Xác minh thời gian chờ I/O trên Trình xử lý thông báo

  1. Đăng nhập vào máy xử lý tin nhắn.
  2. Tìm kiếm tài sản HTTPTransport.io.timeout.millis trong thư mục /opt/apigee/edge-message-processor/conf bằng lệnh sau:

    grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
    

    Đầu ra mẫu

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
  3. Trong đầu ra mẫu ở trên, hãy lưu ý rằng thuộc tính HTTPTransport.io.timeout.millis đã được đặt với giá trị 55000 trong http.properties. Điều này cho biết bạn đã định cấu hình thành công thời gian chờ I/O thành 55 giây trên Trình xử lý thông báo.

Sau khi xác định thời gian chờ được định cấu hình trên Bộ định tuyến và Trình xử lý thông báo, hãy xác minh xem Bộ định tuyến/máy chủ ảo có được định cấu hình với giá trị thời gian chờ thấp hơn so với giá trị trên Trình xử lý thông báo/API proxy hay không.

Ghi lại các giá trị được đặt trên tất cả các lớp như trong bảng bên dưới:

Thời gian chờ trên bộ định tuyến (giây) Hết thời gian chờ trên máy chủ ảo (giây) Hết thời gian chờ trên Trình xử lý thông báo (giây) Thời gian chờ trên proxy API (giây)
57 - 55 120

Trong ví dụ này,

  • Giá trị mặc định là 57 giây được định cấu hình trên Bộ định tuyến.
  • Giá trị thời gian chờ không được đặt trên máy chủ ảo cụ thể. Điều này có nghĩa là nó sẽ sử dụng giá trị mặc định là 57 giây được định cấu hình trên chính Bộ định tuyến.
  • Trên Trình xử lý thông báo, giá trị mặc định là 55 giây.
  • Tuy nhiên, trên API Proxy cụ thể, giá trị 120 giây được định cấu hình.

Xin lưu ý rằng giá trị thời gian chờ cao hơn chỉ được định cấu hình trên API proxy, nhưng Router vẫn được định cấu hình với 57 giây. Do đó, Bộ định tuyến hết thời gian chờ sau 57 giây trong khi Trình xử lý thông báo/phần phụ trợ vẫn đang xử lý yêu cầu của bạn. Điều này khiến Router phản hồi lại bằng lỗi 504 Gateway Timeout cho ứng dụng khách.

Độ phân giải

Thực hiện các bước sau để định cấu hình thời gian chờ I/O thích hợp trên Bộ định tuyến và Bộ xử lý thông báo để giải quyết vấn đề này.

  1. Tham khảo Các phương pháp hay nhất để định cấu hình thời gian chờ I/O để hiểu rõ những giá trị thời gian chờ cần đặt trên các thành phần khác nhau liên quan đến quy trình yêu cầu API thông qua Apigee Edge.
  2. Trong ví dụ trên, nếu bạn xác định rằng cần đặt giá trị thời gian chờ cao hơn vì máy chủ phụ trợ cần nhiều thời gian hơn và bạn đã tăng giá trị thời gian chờ của Trình xử lý thông báo lên 120 giây, thì hãy đặt giá trị thời gian chờ cao hơn. Ví dụ: 123 seconds trên Bộ định tuyến. Để tránh ảnh hưởng đến tất cả các API Proxy do giá trị thời gian chờ mới, hãy chỉ đặt giá trị của 123 seconds trên máy chủ ảo cụ thể được dùng trong API Proxy cụ thể.
  3. Làm theo hướng dẫn trong phần Định cấu hình thời gian chờ I/O trên Bộ định tuyến để đặt thời gian chờ trên máy chủ lưu trữ ảo.