คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X ข้อมูล
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP เป็น 504
พร้อมข้อความ Gateway Timeout
เพื่อตอบกลับการเรียก API
การตอบกลับข้อผิดพลาดนี้บ่งบอกว่าไคลเอ็นต์ไม่ได้รับการตอบกลับอย่างทันท่วงทีจาก Apigee Edge หรือเซิร์ฟเวอร์แบ็กเอนด์ขณะดำเนินการเรียก API
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 504 Gateway Time-out
เมื่อเรียกพร็อกซีดังกล่าวโดยใช้ cURL หรือเว็บเบราว์เซอร์ คุณอาจได้รับข้อผิดพลาดต่อไปนี้
<!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>
การหมดเวลาเกิดจากอะไร
เส้นทางทั่วไปสำหรับคำขอ API ผ่านแพลตฟอร์ม Edge คือไคลเอ็นต์ > เราเตอร์ > ผู้ประมวลผลข้อความ > เซิร์ฟเวอร์แบ็กเอนด์ ดังที่แสดงในรูปต่อไปนี้
คอมโพเนนต์ทั้งหมดในโฟลว์รันไทม์ของ Apigee Edge ซึ่งรวมถึงไคลเอ็นต์ เราเตอร์ ตัวประมวลผลข้อความ และเซิร์ฟเวอร์แบ็กเอนด์จะได้รับการตั้งค่าระยะหมดเวลาเริ่มต้นที่เหมาะสมเพื่อให้แน่ใจว่าคำขอ API จะไม่ใช้เวลานานเกินไป หากคอมโพเนนต์ใดในโฟลว์ไม่ได้รับการตอบสนองจากคอมโพเนนต์อัปสตรีมภายในระยะเวลาที่ระบุไว้ในการกำหนดค่าระยะหมดเวลา คอมโพเนนต์นั้นจะใช้งานไม่ได้และมักจะแสดงข้อผิดพลาด 504 Gateway Timeout
Playbook นี้อธิบายวิธีแก้ปัญหาและข้อผิดพลาด 504
ที่เกิดขึ้นเมื่อเราเตอร์หมดเวลา
หมดเวลาบนเราเตอร์
ระยะหมดเวลาเริ่มต้นที่กำหนดค่าไว้บนเราเตอร์ใน Apigee Edge คือ 57 วินาที นี่คือระยะเวลาสูงสุดที่พร็อกซี API จะทำงานได้นับตั้งแต่เวลาที่ได้รับคำขอ API ใน Edge จนกว่าจะมีการส่งการตอบกลับ รวมถึงการตอบกลับแบ็กเอนด์และนโยบายทั้งหมดที่ดำเนินการ คุณลบล้างระยะหมดเวลาเริ่มต้นได้ในเราเตอร์/โฮสต์เสมือนตามที่อธิบายไว้ใน การกำหนดค่าระยะหมดเวลาของ I/O บนเราเตอร์
สาเหตุที่เป็นไปได้
ใน Edge สาเหตุทั่วไปของข้อผิดพลาด 504 Gateway Timeout
ที่เกิดจากการหมดเวลาของเราเตอร์ ได้แก่
สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้กับ |
---|---|---|
การกำหนดค่าการหมดเวลาบนเราเตอร์ไม่ถูกต้อง | กรณีนี้จะเกิดขึ้นหากมีการกำหนดค่าเราเตอร์ด้วยระยะหมดเวลา I/O ไม่ถูกต้อง | ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
ใช้เครื่องมือ/เทคนิคอย่างใดอย่างหนึ่งต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดนี้
- การตรวจสอบ API
- บันทึกการเข้าถึง NGINX
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้ API Monitoring
- ไปที่หน้าวิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
- กรองหาข้อผิดพลาด
5xx
รายการและเลือกกรอบเวลา - พล็อตรหัสสถานะเทียบกับเวลา
-
คลิกเซลล์ที่แสดงข้อผิดพลาด
504
รายการเพื่อดูรายละเอียดเพิ่มเติมและดูบันทึกเกี่ยวกับข้อผิดพลาดเหล่านี้ตามที่แสดงด้านล่างตัวอย่างที่แสดงข้อผิดพลาด 504
- ในแผงด้านขวา ให้คลิกดูบันทึก
จากหน้าต่างบันทึกการรับส่งข้อมูล ให้สังเกตรายละเอียดต่อไปนี้สำหรับข้อผิดพลาด
504
บางอย่าง- คำขอ: จะระบุเมธอดคำขอและ URI ที่ใช้สำหรับการเรียก
- เวลา การตอบกลับ: ข้อมูลเวลาทั้งหมดที่ใช้สำหรับคำขอ
ในตัวอย่างด้านบน
- คำขอ กำลังชี้ไปยัง
GET /test-timeout
- เวลาในการตอบสนอง เท่ากับ
57.001
วินาที ซึ่งหมายความว่าเราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความจะตอบกลับได้ เนื่องจากค่านั้นใกล้เคียงกับระยะหมดเวลาของ I/O เริ่มต้นบนเราเตอร์เป็นอย่างมาก ซึ่งก็คือ 57 วินาที
นอกจากนี้ คุณยังดูบันทึกทั้งหมดได้โดยใช้ API GET บันทึก API ของ Monitoring เช่น การค้นหาบันทึกสำหรับ
org
,env
,timeRange
และstatus
จะทำให้คุณดาวน์โหลดบันทึกทั้งหมดสำหรับธุรกรรมที่ไคลเอ็นต์หมดเวลาได้เนื่องจาก API Monitoring ตั้งค่าพร็อกซีเป็น
-
(not set) สำหรับข้อผิดพลาด504
เหล่านี้ คุณจึงใช้ API (Logs API) เพื่อรับพร็อกซีที่เกี่ยวข้องสำหรับโฮสต์เสมือนและเส้นทางได้For example :
curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
- ตรวจสอบเวลาในการตอบสนองสำหรับข้อผิดพลาด
504
เพิ่มเติม และดูว่าเวลาในการตอบกลับสอดคล้องกันหรือไม่ (ค่าระยะหมดเวลา I/O ที่กำหนดไว้ในเราเตอร์คือ 57 วินาที) สำหรับข้อผิดพลาด504
ทั้งหมด
บันทึกการเข้าถึง NGINX
วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX
- ตรวจสอบบันทึกการเข้าถึง NGINX ดังนี้
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- ค้นหาเพื่อดูว่ามีข้อผิดพลาด
504
ใดๆ ในช่วงเวลาที่ระบุหรือไม่ (หากเกิดปัญหาในอดีต) หรือมีคำขอใดที่ยังคงล้มเหลวด้วย504
- โปรดทราบข้อมูลต่อไปนี้สำหรับข้อผิดพลาด
504
บางรายการ- ระยะเวลาการตอบกลับ
- URI คำขอ
ในตัวอย่างนี้ เราจะเห็นข้อมูลต่อไปนี้
-
เวลาคำขอ:
57.001
วินาที ซึ่งบ่งบอกว่าเราเตอร์หมดเวลาหลังจากผ่านไป 57.001 วินาที - คำขอ:
GET /test-timeout
- ชื่อแทนโฮสต์:
myorg-test.apigee.net
-
ตรวจสอบว่าเวลาคำขอตรงกับระยะหมดเวลาของ I/O ที่กำหนดค่าไว้บนเราเตอร์/โฮสต์เสมือนหรือไม่ ถ้าใช่ แสดงว่าเราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความจะไม่ตอบกลับภายในระยะเวลานี้
ในตัวอย่างรายการบันทึกการเข้าถึง NGINX ที่แสดงด้านบน เวลาคำขอของ
57.001
วินาทีใกล้เคียงกับระยะหมดเวลาเริ่มต้นของ I/O บนเราเตอร์เป็นอย่างมาก ซึ่งเป็นการระบุอย่างชัดเจนว่าเราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความจะตอบกลับได้ - กำหนดพร็อกซี API ที่ส่งคำขอโดยใช้เส้นทางฐานในช่องคำขอ
สาเหตุ: การกำหนดค่าการหมดเวลาบนเราเตอร์ไม่ถูกต้อง
การวินิจฉัย
- พิจารณาว่าข้อผิดพลาด
504
เกิดขึ้นเนื่องจากเราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความจะตอบกลับได้หรือไม่ ซึ่งทำได้โดยตรวจสอบว่าเวลาในการตอบสนองในการตรวจสอบ API/เวลาคำขอ ในเราเตอร์ (ทั้ง 2 ช่องแสดงข้อมูลเดียวกัน แต่เรียกใช้ด้วยชื่อต่างกัน) เหมือนกับระยะหมดเวลา I/O ที่กำหนดค่าบนเราเตอร์/โฮสต์เสมือน และในช่องต้นทางของข้อผิดพลาด พร็อกซีของข้อผิดพลาด และโค้ดข้อผิดพลาด GINX ที่มีคำอธิบายใน-
โดยใช้บันทึกการเข้าถึง API ของการตรวจสอบหรือ N/O -
ตรวจสอบว่าค่าระยะหมดเวลา I/O ที่กำหนดค่าไว้บนเราเตอร์หรือโฮสต์เสมือนต่ำกว่าเมื่อเทียบกับที่กำหนดค่าไว้ในโปรแกรมประมวลผลข้อความหรือพร็อกซี API ที่ระบุ
ซึ่งทำได้โดยทำตามขั้นตอนต่างๆ ในส่วนนี้
การยืนยันการหมดเวลา I/O บนโฮสต์เสมือน
UI ของ Edge
วิธีตรวจสอบระยะหมดเวลาของโฮสต์เสมือนโดยใช้ Edge UI
- เข้าสู่ระบบ Edge UI
- ไปที่ผู้ดูแลระบบ > โฮสต์เสมือน
- เลือกสภาพแวดล้อมเฉพาะที่คุณประสบปัญหาการหมดเวลา
- เลือกโฮสต์เสมือนที่คุณต้องการยืนยันค่าระยะหมดเวลา I/O
- ในส่วนคุณสมบัติ ให้ดูค่าหมดเวลาอ่านพร็อกซีเป็นวินาที
ในตัวอย่างข้างต้น ระยะหมดเวลาของการอ่านพร็อกซี ได้รับการกำหนดค่าด้วยค่า
120
ซึ่งหมายความว่าระยะหมดเวลา I/O ที่กำหนดค่าไว้บนโฮสต์เสมือนนี้คือ 120 วินาที
API การจัดการ
นอกจากนี้ คุณยังสามารถยืนยัน ระยะหมดเวลาการอ่านพร็อกซี โดยใช้ API การจัดการต่อไปนี้
-
เรียกใช้ API รับโฮสต์เสมือนเพื่อรับการกำหนดค่า
virtualhost
ดังที่แสดงด้านล่างผู้ใช้ระบบคลาวด์สาธารณะ
curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
ผู้ใช้ Private Cloud
curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
โดยที่
ORGANIZATION_NAME คือชื่อองค์กร
ENVIRONMENT_NAME คือชื่อสภาพแวดล้อม
VIRTUALHOST_NAME คือชื่อของโฮสต์เสมือน
-
ตรวจสอบค่าที่กำหนดค่าไว้สำหรับพร็อพเพอร์ตี้
proxy_read_timeout
ตัวอย่างคำจำกัดความของโฮสต์เสมือน
{ "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 }
ในตัวอย่างข้างต้น
proxy_read_timeout
ได้รับการกำหนดค่าด้วยค่า120
ซึ่งหมายความว่าระยะหมดเวลา I/O ที่กำหนดค่าไว้บนโฮสต์เสมือนนี้คือ 120 วินาที
การยืนยันการหมดเวลา I/O ในไฟล์ Router.properties
- เข้าสู่ระบบเครื่องเราเตอร์
- ค้นหาพร็อพเพอร์ตี้
proxy_read_timeout
ในไดเรกทอรี/opt/nginx/conf.d
และตรวจสอบว่ามีการตั้งค่าด้วยค่าใหม่หรือไม่ ดังนี้grep -ri "proxy_read_timeout" /opt/nginx/conf.d
-
ตรวจสอบชุดค่าสำหรับพร็อพเพอร์ตี้
proxy_read_timeout
ในไฟล์การกำหนดค่าโฮสต์เสมือนที่เฉพาะเจาะจงผลลัพธ์ตัวอย่างจากคำสั่ง grep
/opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57; /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;
ในตัวอย่างเอาต์พุตด้านบน ให้สังเกตว่ามีการตั้งค่าพร็อพเพอร์ตี้
proxy_read_timeout
ด้วยค่าใหม่57
ใน0-default.conf
ซึ่งเป็นไฟล์การกำหนดค่าสำหรับโฮสต์เสมือนเริ่มต้น ซึ่งหมายความว่ามีการกำหนดค่าระยะหมดเวลา I/O เป็น 57 วินาทีบนเราเตอร์สำหรับโฮสต์เสมือนเริ่มต้น หากมีโฮสต์เสมือนหลายรายการ คุณจะเห็นข้อมูลนี้สำหรับแต่ละโฮสต์ รับค่าของproxy_read_timeout
สำหรับโฮสต์เสมือนที่คุณใช้สำหรับการเรียก API ซึ่งล้มเหลวโดยมีข้อผิดพลาด504
การยืนยันการหมดเวลาของ I/O ในพร็อกซี API
คุณสามารถดูระยะหมดเวลาของ I/O ได้ในส่วนต่อไปนี้
- ปลายทางเป้าหมายของพร็อกซี API
- นโยบาย ServiceAPI ของพร็อกซี API
ดูการหมดเวลา I/O ในปลายทางเป้าหมายของพร็อกซี API
- ใน Edge UI ให้เลือกพร็อกซี API เฉพาะที่คุณต้องการดูค่าระยะหมดเวลา I/O
- เลือกปลายทางเป้าหมายที่ต้องการตรวจสอบ
- ดูพร็อพเพอร์ตี้
io.timeout.millis
พร้อมค่าที่เหมาะสมภายใต้องค์ประกอบ<HTTPTargetConnection>
ในการกำหนดค่าTargetEndpoint
ตัวอย่างเช่น ระยะหมดเวลา I/O ในโค้ดต่อไปนี้จะตั้งเป็น 120 วินาที
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
ดูการหมดเวลา I/O ในนโยบาย ServiceAPI ของพร็อกซี API
- ใน Edge UI ให้เลือกพร็อกซี API เฉพาะที่คุณต้องการดูค่าระยะหมดเวลา I/O ใหม่สำหรับนโยบาย ServiceAPI
- เลือกนโยบาย ServiceAPI ที่ต้องการตรวจสอบ
-
ดูองค์ประกอบ
<Timeout>
พร้อมค่าที่เหมาะสมภายใต้การกำหนดค่า<ServiceCallout>
ตัวอย่างเช่น ระยะหมดเวลา I/O ของโค้ดต่อไปนี้จะเป็น 120 วินาที
<Timeout>120000</Timeout>
การยืนยันการหมดเวลา I/O บนตัวประมวลผลข้อความ
- เข้าสู่ระบบเครื่องประมวลผลข้อความ
-
ค้นหาพร็อพเพอร์ตี้
HTTPTransport.io.timeout.millis
ในไดเรกทอรี/opt/apigee/edge-message-processor/conf
โดยใช้คำสั่งต่อไปนี้grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
ตัวอย่างเอาต์พุต
/opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
- ในตัวอย่างเอาต์พุตด้านบน ให้สังเกตว่ามีการตั้งค่าพร็อพเพอร์ตี้
HTTPTransport.io.timeout.millis
ด้วยค่า55000
ในhttp.properties
ซึ่งบ่งบอกว่ามีการกำหนดค่าระยะหมดเวลา I/O เป็น 55 วินาทีในตัวประมวลผลข้อความสำเร็จแล้ว
เมื่อคุณระบุระยะหมดเวลาที่กำหนดค่าบนเราเตอร์และเครื่องมือประมวลผลข้อความแล้ว ให้ตรวจสอบว่ามีการกำหนดค่าเราเตอร์/โฮสต์เสมือนด้วยค่าระยะหมดเวลาที่ต่ำลงเมื่อเทียบกับค่าบนพร็อกซีข้อความ/API
จดบันทึกค่าที่ตั้งไว้ในเลเยอร์ทั้งหมดดังที่แสดงในตารางด้านล่าง
หมดเวลาบนเราเตอร์ (วินาที) | หมดเวลาในโฮสต์เสมือน (วินาที) | ระยะหมดเวลาสำหรับตัวประมวลผลข้อความ (วินาที) | หมดเวลาเมื่อพร็อกซี API (วินาที) |
---|---|---|---|
57 | - | 55 | 120 |
ในตัวอย่างนี้
- เราเตอร์คือค่าเริ่มต้น 57 วินาที
- ไม่ได้ตั้งค่าระยะหมดเวลาบนโฮสต์เสมือนที่เจาะจง ซึ่งหมายความว่าจะใช้ค่าเริ่มต้น 57 วินาทีที่กำหนดค่าบนเราเตอร์
- ในเครื่องมือประมวลผลข้อความ ระบบจะกำหนดค่าเริ่มต้นไว้ที่ 55 วินาที
- แต่ในพร็อกซี API ที่เฉพาะเจาะจง จะมีการกําหนดค่าเป็น 120 วินาที
โปรดทราบว่าค่าระยะหมดเวลาที่สูงกว่าจะได้รับการกำหนดค่าในพร็อกซี API เท่านั้น แต่เราเตอร์จะยังคงกำหนดค่าที่ 57 วินาที ดังนั้น เราเตอร์จะหมดเวลาที่ 57 วินาที ขณะที่ตัวประมวลผล/แบ็กเอนด์ข้อความยังคงประมวลผลคำขอของคุณ ซึ่งจะทำให้เราเตอร์ตอบกลับโดยมีข้อผิดพลาด 504 Gateway Timeout
รายการในแอปพลิเคชันไคลเอ็นต์
ความละเอียด
โปรดทำตามขั้นตอนต่อไปนี้เพื่อกำหนดค่าการหมดเวลา I/O ที่เหมาะสมบนเราเตอร์และเครื่องมือประมวลผลข้อความเพื่อแก้ไขปัญหานี้
- ดู แนวทางปฏิบัติแนะนำสำหรับการกำหนดค่าระยะหมดเวลาของ I/O เพื่อทำความเข้าใจว่าควรตั้งค่าระยะหมดเวลาเท่าใดในคอมโพเนนต์ต่างๆ ที่เกี่ยวข้องกับโฟลว์คำขอ API ผ่าน Apigee Edge
- ในตัวอย่างข้างต้น ถ้าคุณมั่นใจว่าต้องตั้งค่าระยะหมดเวลาที่สูงขึ้นเนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานกว่าปกติ และได้เพิ่มค่าระยะหมดเวลาของโปรแกรมประมวลผลข้อความเป็น 120 วินาทีแล้ว ให้กำหนดค่าระยะหมดเวลาที่สูงขึ้น เช่น
123 seconds
บนเราเตอร์ หากต้องการหลีกเลี่ยงผลกระทบต่อพร็อกซี API ทั้งหมดเนื่องจากค่าระยะหมดเวลาใหม่ ให้กำหนดค่า123 seconds
เฉพาะในโฮสต์เสมือนที่ใช้ในพร็อกซี API ที่ระบุ - ทำตามวิธีการใน การกำหนดค่าระยะหมดเวลาของ I/O บนเราเตอร์ เพื่อตั้งค่าระยะหมดเวลาบนโฮสต์เสมือน