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.
Chuyển đến tài liệu về Apigee X.
thông tin

Triệu chứng

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

Phản hồi lỗi này cho biết ứng dụng không nhận được phản hồi kịp thời của 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 đây:

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 nào gây ra thời gian chờ?

Đường dẫn điển hình cho một yêu cầu API thông qua nền tảng Edge là Ứng dụng > Bộ định tuyến > Bộ xử lý tin nhắn > Máy chủ phụ trợ như trong hình sau:

Tất cả thành phần trong quy trình thời gian chạy Apigee Edge, bao gồm cả ứng dụng khách, Bộ định tuyến, Bộ xử lý tin nhắn và máy chủ phụ trợ đều được thiết lập với giá trị thời gian chờ mặc định phù hợp để đảm bảo 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 tải lê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 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ừ khi nhận được yêu cầu API trên Edge cho đến khi phản hồi được gửi trả lại, bao gồm cả phản hồi trong phần phụ trợ và mọi 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ư giải thích trong bài viết Đị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 điển hình gây ra lỗi 504 Gateway Timeout do thời gian chờ của Bộ định tuyến là:

Nguyên nhân Nội dung mô tả Hướng dẫn khắc phục sự cố áp dụng cho
Cấu hình hết 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 và Private Cloud

Các bước chẩn đoán phổ biến

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 5xx lỗi và chọn khung thời gian.
  3. Vẽ Mã trạng thái dựa trên Thời gian.
  4. Nhấp vào ô cụ thể hiển thị các lỗi 504 để xem thêm thông tin chi tiết và xem nhật ký về các lỗi này như minh hoạ dưới đây:

    Ví dụ về 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ổ Traffic Logs (Nhật ký lưu lượng), hãy lưu ý thông tin chi tiết sau đây về một số lỗi 504:

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

    Trong ví dụ trên,

    • Request (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 biết 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 lại vì giá trị 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 nhật ký của dịch vụ Giám sát API. Ví dụ: bằng cách truy vấn nhật ký cho org, env, timeRangestatus, bạn có thể tải mọi nhật ký của những giao dịch mà ứng dụng đã hết thời gian chờ xuống.

    Vì tính năng Giám sát API sẽ đặt proxy thành - (not set) cho những 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 đường dẫn và máy chủ ảo.

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. Xem lại 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ó Lỗi 504 nào trong một khoảng thời gian cụ thể không (nếu vấn đề đã xảy ra trong quá khứ) hoặc 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 về 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 sẽ thấy 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
    • Email đại diện 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 Trình 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 hiển thị ở trên, Thời gian yêu cầu 57.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 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 lại.

  5. Xác định Proxy API cho yêu cầu bằng cách sử dụng đường dẫn cơ sở trong trường Yêu cầu .

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

Chẩn đoán

  1. Xác định xem lỗi 504 có phải là do 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 lại hay không. Bạn có thể thực hiện điều này bằng cách kiểm tra xem Thời gian phản hồi trong Giám sát API/Thời gian yêu cầu trong Bộ định tuyến 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. Thời gian chờ I/O trong Bộ định tuyến/máy chủ ảo và các trường Nguồn lỗi, Lỗi lỗiLỗi mã nguồn được đặt thành - theo các bước chẩn đoán phổ biến của API hoặc NGIN trong phần Kiểm tra phổ biến API trong Nhật ký giám sát API hay NGIN
  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 Bộ xử lý thông báo hoặc Proxy API 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. Di chuyển đến phần 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 sự cố 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 Tài sản, hãy xem giá trị Thời gian chờ đọc proxy tính bằng giây.

    Trong ví dụ trên, Thời gian chờ đọc proxy được định cấu hình bằng 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 Thời gian chờ đọc proxy bằng các API quản lý sau:

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

    Người dùng Public Cloud

    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 định cấu hình 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 định cấu hình bằng 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.

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

  1. Đăng nhập vào máy Bộ định tuyến.
  2. Tì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 này đã được đặt bằng giá trị mới như sau chưa:
    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 kết quả ví dụ ở trên, hãy lưu ý rằng thuộc tính proxy_read_timeout đã được thiết lập bằng 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 là 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ủ ảo. Nhận giá trị của proxy_read_timeout cho máy chủ ảo cụ thể mà bạn đã sử dụng để thực hiện các lệnh gọi API không thành công kèm theo 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 phần dưới đây:

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

    Ví dụ: thời gian chờ I/O trong mã sau đượ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 Chú thích dịch vụ của proxy API
  1. Trong giao diện người dùng Edge, hãy chọn proxy API cụ thể mà bạn muốn xem giá trị thời gian chờ I/O mới cho chính sách ServiceChú thích.
  2. Chọn chính sách về Chú thích dịch vụ cụ thể mà bạn muốn kiểm tra.
  3. Hãy xem phần tử <Timeout> có giá trị thích hợp trong cấu hình <ServiceCallout>.

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

    <Timeout>120000</Timeout>
    

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

  1. Đăng nhập vào máy Bộ xử lý thư.
  2. Tìm kiếm thuộc tính 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
    

    Ví dụ về mã được tạo

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

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

Hãy ghi lại các giá trị được đặt trên tất cả các lớp như minh hoạ trong bảng dưới đây:

Thời gian chờ trên bộ định tuyến (giây) Thời gian chờ trên máy chủ ảo (giây) Thời gian chờ trên Trình xử lý thư (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 Bộ xử lý thư, giá trị mặc định là 55 giây được định cấu hình.
  • Tuy nhiên, trên một Proxy API cụ thể, giá trị 120 giây được định cấu hình.

Lưu ý rằng giá trị thời gian chờ cao hơn chỉ được định cấu hình trên proxy API, nhưng Bộ định tuyến vẫn được định cấu hình trong 57 giây. Do đó, Bộ định tuyến hết thời gian chờ là 57 giây trong khi Bộ 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 Bộ định tuyến phản hồi lại kèm theo lỗi 504 Gateway Timeout cho ứng dụng.

Độ 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 nhằm 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 để tìm hiểu xem nên đặt giá trị thời gian chờ nào cho các thành phần liên quan đến luồng yêu cầu API thông qua Apigee Edge.
  2. Trong ví dụ trên, nếu bạn chắc chắn cần đặt giá trị thời gian chờ cao hơn vì máy chủ phụ trợ yêu cầu thời gian dài 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, 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 Proxy API do giá trị hết 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 Proxy API cụ thể.
  3. Làm theo hướng dẫn trong bài viết Đị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ủ ảo.