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 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 rằng khách hàng 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 sẽ 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 gây ra 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à Ứng dụng > Bộ định tuyến > Nội dung Bộ xử lý > Máy chủ phụ trợ như minh hoạ 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, Bộ định tuyến, Tin nhắn Các bộ xử lý và máy chủ phụ trợ đượ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 thành. Nếu bất kỳ thành phần nào trong flow không nhận được phản hồi từ thành phần ngược dòng (upstream) 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ề 504 Gateway Timeoutlỗi.

Cẩm nang này mô tả cách khắc phục sự 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à tối đa khoảng thời gian một proxy API có thể thực thi từ khi nhận được yêu cầu API trên Edge cho đến thì phản hồi sẽ đượ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. Thời gian chờ mặc định có thể được ghi đè trên Bộ định tuyến/máy chủ ảo như được giải thích trong Đị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 là do Thời gian chờ trên bộ định tuyến 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 công khai và riêng tư

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 thẻ Analyze (Phân tích) > Giám sát API > Điều tra.
  2. Lọc ra 5xx lỗi rồi chọn khung thời gian.
  3. Vẽ Mã trạng thái theo Thời gian.
  4. Nhấp vào ô cụ thể hiện lỗi 504 để tìm hiểu thêm và xem nhật ký về các lỗi này như được trình bày dưới đây:

    Ví dụ minh hoạ 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 truy cập), hãy lưu ý những thông tin chi tiết sau đây đối với một số lỗi 504:

    • Request (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: Mục này cho biết tổng thời gian đã trôi qua của 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 biết rằng Bộ định tuyến đã hết thời gian trước khi Trình xử lý thư có thể phản hồi lại vì giá trị rất gần thời gian chờ I/O mặc định đã đặt trên Bộ định tuyến, là 57 giây.

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

    Vì tính năng Giám sát API đặt proxy thành - (not set) cho các 504 này lỗi, bạn có thể sử dụng API (Nhật ký API) để lấy proxy liên kết cho đường dẫn và máy chủ lưu trữ ả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 504 lỗi khác rồi 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ể hay không (nếu sự cố đã xảy ra trong quá khứ) hoặc nếu có bất kỳ yêu cầu nào vẫn không thành công với 504.
  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 sẽ thấy thông tin sau:

    • Thời gian yêu cầu: 57.001 giây. Điều này cho thấy rằng Bộ định tuyến hết thời gian chờ sau 57.001 giây.

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

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

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

Nguyên nhân: Cấu hình hết 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 là do Bộ định tuyến đã hết thời gian chờ trước đó hay không Trình xử lý thư có thể phản hồi lại. 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 Giám sát API/Thời gian yêu cầu trong Bộ định tuyến (cả hai trường thể hiện cùng một thông tin nhưng được gọi bằng các tên khác nhau) cũng giống như Thời gian chờ I/O được định cấu hình trên Bộ định tuyến/máy chủ ảo 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 chức năng Giám sát API hoặc quyền truy cập NGINX nhật ký như được giải thích trong Các bước chẩn đoán phổ biến.
  2. Kiểm tra xem liệu 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 Proxy API cụ thể.

    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 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 mục Thuộc tính, 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 với giá trị là 120. Tức 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ách sử dụng các API quản lý sau:

  1. Thực thi Nhận API máy chủ ảo để lấy cấu hình virtualhost như trình bày dưới đây:

    Người dùng Cloud 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 trên đá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 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 với giá trị là 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 Route.properties

  1. Đăng nhập vào máy Bộ định tuyến.
  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 thư mục này đã được thiết lập bằng giá trị mới hay chưa như sau:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. Kiểm tra giá trị đã đặt cho thuộc tính proxy_read_timeout trong thực thể ảo cụ thể tệp cấu hình máy chủ lưu trữ.

    Kết quả mẫu của 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ả của ví dụ ở trên, hãy lưu ý rằng thuộc tính proxy_read_timeout có đã được thiết lập với giá trị mới 57 trong 0-default.conf, đây là giá trị cho máy chủ ảo mặc định. Điều này cho biết rằng thời gian chờ I/O là đượ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 bạn có nhiều máy chủ ảo, bạn sẽ thấy thông tin này cho mỗi máy chủ ảo. Lấy giá trị của proxy_read_timeout cho máy chủ ảo cụ thể mà bạn đã sử dụng để tạo API không thực hiện được lệnh gọi với 504 lỗi.

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

Bạn có thể xem thời gian chờ I/O trong các phần sau:

  • Điểm cuối mục tiêu của proxy API
  • Chính sách ServiceAnnotation 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 proxy API cụ thể mà bạn muốn xem I/O giá trị hết thời gian chờ.
  2. Chọn điểm cuối mục tiêu 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> trong 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 ServiceAnnotation 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 I/O mới giá trị hết thời gian chờ cho chính sách ServiceAnnotation.
  2. Chọn chính sách ServiceAnnotation 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ư

  1. Đăng nhập vào máy 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
    

    Kết quả mẫu

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
    
  3. Trong kết quả của ví dụ ở trên, hãy lưu ý rằng thuộc tính Đã đặt HTTPTransport.io.timeout.millis với 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 để 55 giây trên Trình xử lý tin nhắn.

Khi bạn đã xác định được thời gian chờ được định cấu hình trên Bộ định tuyến và Bộ xử lý thư, 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ị trên Bộ xử lý thư/proxy API.

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

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 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à Chrome 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ư, giá trị mặc định là 55 giây được định cấu hình.
  • Tuy nhiên, trên 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 được định cấu hình với 57 giây. Do đó, Bộ định tuyến hết thời gian chờ 57 giây trong khi Thông báo Đơn vị xử lý/máy chủ 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 bằng 504 Gateway Timeout lỗi với ứ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à Thông báo Bộ xử lý cần xử lý để 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 để nắm được giá trị thời gian chờ nào phải được thiết lập trên nhiều thành phần 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 chắc chắn rằng cần đặt giá trị thời gian chờ cao hơn vì máy chủ phụ trợ yêu cầu nhiều thời gian hơn và bạn đã tăng thời gian chờ của Trình xử lý thư là 120 giây, sau đó đặt giá trị thời gian chờ cao hơn cho 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ị thời gian chờ mới, hãy chỉ đặt giá trị 123 seconds trên máy chủ ảo cụ thể dùng trong Proxy API cụ thể.
  3. Làm theo hướng dẫn trong Đị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.