สวัสดี ฉันกำลังพยายามใช้ API โดยใช้เกตเวย์ Nginx API: ฉันมี URL นี้: example.com/api/nodeapp ในการตั้งค่าของฉัน ฉันมีตัวควบคุม Ingress ซึ่งเปิดเผยภายนอกที่ .com และรับคำขอทำ oauth และเปลี่ยนเส้นทางไปยังพ็อด nginx ภายใน (แสดงเป็นบริการ IP ของคลัสเตอร์ในคลัสเตอร์ส่วนตัว) พ็อด nginx ภายในนี้จะเปลี่ยนเส้นทางไปยังพ็อด microservice เป้าหมาย ( ยังเปิดเผยเป็นบริการ Cluster IP ในคลัสเตอร์ส่วนตัวเดียวกัน) เป้าหมาย: ฉันเรียกดู url เป็น example.com/api/nodeapp ---> Ingress จะทำ oauth และเปลี่ยนเส้นทางคำขอไปยัง Nginx (ซึ่งปกติดี) Nginx รับคำขอของฉันและเปลี่ยนเส้นทางฉันไปยัง microservice nodeapp เป้าหมาย (ซึ่งล้มเหลวที่ ข้อผิดพลาด 400) ข้อมูลโค้ดของฉัน:
Ingress.yaml
ข้อมูลจำเพาะ:
กฎ:
- โฮสต์: example.com
http:
เส้นทาง:
- เส้นทาง: /api/nodeapp
แบ็กเอนด์:
ชื่อบริการ: nginx-internal-service
พอร์ตบริการ: 80
- เส้นทาง: /api/tea
แบ็กเอนด์:
ชื่อบริการ: nginx-internal-service
พอร์ตบริการ: 80
Nginx.conf
ผู้ใช้ nginx;
worker_processes อัตโนมัติ
error_log /var/log/nginx/error.log ดีบัก;
pid /var/run/nginx.pid;
เหตุการณ์ {
worker_connections 1024;
}
http {
รวม /etc/nginx/mime.types;
แอปพลิเคชัน default_type/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$สถานะ $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log หลัก;
ส่งไฟล์บน;
#tcp_nopush บน;
keepalive_timeout 65;
#gzip บน;
รวม /etc/nginx/api_gateway.conf;
รวม /etc/nginx/conf.d/*.conf;
}
api_gateway.conf
รวมถึง api_backends.conf;
#รวม api_keys.conf;
เซิร์ฟเวอร์ {
access_log /var/log/nginx/api_access.log หลัก; # แต่ละ API อาจบันทึกไปยังไฟล์แยกต่างหาก
ฟัง 80; # การกำหนดค่า TLS ไปที่นี่ (สำหรับการใช้งานจริง)
server_name example.com;
#การกำหนดค่า TLS
#ssl_certificate /etc/ssl/certs/api.example.com.crt;
#ssl_certificate_key /etc/ssl/private/api.example.com.key;
#ssl_session_cache ที่แชร์:SSL:10m;
#ssl_session_timeout 5 นาที;
#ssl_ciphers สูง:!aNULL:!MD5;
#ssl_โปรโตคอล TLSv1.2 TLSv1.3;
# ทรัพยากรไม่ถูกต้อง
ที่ตั้ง / {
เขียนใหม่ ^ https://$host$request_uri ถาวร;
}
# คำจำกัดความของ API หนึ่งรายการต่อไฟล์
รวม api_conf.d/*.conf;
#ตอบผิด
error_page 404 = @400; # เส้นทางที่ไม่ถูกต้องถือเป็นคำขอที่ไม่ถูกต้อง
ที่ตั้ง @400 {
ส่งคืน 400 '{"status":400,"message":"คำขอไม่ถูกต้อง"}\n';
}
เปิด proxy_intercept_errors; # อย่าส่งข้อผิดพลาดส่วนหลังไปยังไคลเอนต์
รวม error_json.conf; # การตอบสนองข้อผิดพลาด JSON ที่เป็นมิตรกับไคลเอ็นต์ API
แอปพลิเคชัน default_type/json; # หากไม่มีประเภทเนื้อหาให้ถือว่า JSON
}
nodeapi_simple.conf
# โหนด API
#
ตำแหน่ง /api/ {
# การกำหนดค่านโยบายที่นี่ (การรับรองความถูกต้อง การจำกัดอัตรา การบันทึก และอื่นๆ...)
#
access_log /var/log/nginx/nodeapp_api.log หลัก;
# การกำหนดเส้นทาง URI
#
สถานที่ /api/ชา {
proxy_pass http://tea;
}
ตำแหน่ง /api/nodeapp {
proxy_pass http://nodeapp;
}
กลับ 404; #จับทั้งหมด
}
# เสียงเรียกเข้า: ไวยากรณ์ = nginx
api_backend.conf
nodeapp ต้นน้ำ {
โซน nodeapp 64k;
เซิร์ฟเวอร์ nodeapp IP:8000;
}
ชาต้นน้ำ {
โซนชา 64k;
แอปเซิร์ฟเวอร์ Tea IP:80;
}
# เสียงเรียกเข้า: ไวยากรณ์ = nginx
เป้าหมายหลักของฉันที่นี่คือเรียกใช้ example.com/api/nodeapp เพื่อเรียกใช้ซึ่งไม่ทำงานแม้ว่าฉันจะทดสอบ nodeapp บน localhost แล้วว่ามันทำงานได้ดีสิ่งที่แปลกอีกอย่างคือแอปชานี้เป็นเพียงแอปตัวอย่างข้อความซึ่งทำงานเมื่อฉันกดในเบราว์เซอร์ด้วย URL example.com/api/tea มันใช้งานได้ [[1]: https://i.stack.imgur .com/3fP3k.png][1]s ต่อสแน็ปด้านล่าง:
นี่คือบันทึกของฉัน
[1]: https://i.stack.imgur.com/jssnb.png][1]
ฉันติดอยู่ที่ข้อผิดพลาดนี้ตั้งแต่ 3 วันจึงขอให้ทุกคนช่วยฉันในเรื่องนี้โดยเร็วที่สุด