Score:0

nginx reverse proxy ไม่ทำงานเมื่อกำหนดหลายพอร์ตสำหรับ REST api

ธง bd

ฉันมีแอป js ถัดไปซึ่งฉันปรับใช้บนพอร์ต 3000 และตั้งค่าพร็อกซี 3000 บน nginx

ตอนนี้ฉันมีเซิร์ฟเวอร์แบ็กเอนด์ Node js ที่กำหนดเองซึ่งฉันต้องการทำงานบนเซิร์ฟเวอร์เดียวกันบนพอร์ต 5000 ที่แตกต่างกัน

ฉันตั้งค่า nginx แบบนี้

ที่ตั้ง / {
        proxy_http_version 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header อัพเกรด $http_upgrade;
        proxy_set_header การเชื่อมต่อ 'อัปเกรด';
        proxy_set_header โฮสต์ $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:3000;
    }
ที่ตั้ง ^~ /api {
        proxy_http_version 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header อัพเกรด $http_upgrade;
        proxy_set_header การเชื่อมต่อ 'อัปเกรด';
        proxy_set_header โฮสต์ $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:5000;
            
        }

ฉันไม่มีปัญหาในการเข้าถึงแอปบน example.com ฉันตั้งค่าตำแหน่ง /api สำหรับเชื่อมต่อการดึงข้อมูล server.js / api

เมื่อฉันเรียกแบบนี้

axios.get(example.com/api)

ข้อผิดพลาดที่ส่งคืน - ไม่สามารถรับ /api/

แต่เมื่อฉันตั้งค่าพร็อกซีตำแหน่ง nginx เช่นนี้

proxy_pass http://localhost:5000/;

ด้วยเครื่องหมายทับ การทำงานและ axios ดึงข้อมูลได้สำเร็จ

แต่เมื่อใดก็ตามที่ฉันพยายามดึงเส้นทางอื่นจากไฟล์ server.js เช่น

axios.get(example.com/api/credential)

มันแสดงข้อผิดพลาดอีกครั้งเช่นนี้

ไม่สามารถรับ // ข้อมูลรับรอง

ส่งคืนด้วยเครื่องหมายทับคู่ // ข้อมูลรับรอง

เส้นทาง '/' เดียวที่ทำงานจาก server.js โดยการดึงข้อมูล example.com/api

โดยไม่มีเครื่องหมายทับบนพร็อกซี ข้อผิดพลาดที่ส่งคืน ไม่สามารถ GET /api หรือไม่สามารถ GET api/ข้อมูลประจำตัว

กรุณาช่วย. ขอบคุณล่วงหน้า.

อัปเดต

ฉันแก้ไขด้วย อีวาน คำตอบ. ตอนนี้ฉันมีปัญหาใหม่กับการกำหนดค่านั้น ฉันใช้ socket.io ข้าง axios ดังนั้นเมื่อใดก็ตามที่ฉันพยายามเชื่อมต่อผ่าน socket.io รหัสซ็อกเก็ตลูกค้าของฉันคือ ..

นำเข้า io จาก "socket.io-client";
ซ็อกเก็ต const = io ("https://example.com/api");

และการกำหนดค่าเซิร์ฟเวอร์ซ็อกเก็ตคือ ..

const io = ต้องการ ("socket.io") (เซิร์ฟเวอร์, {
  คอร์: {
    ต้นทาง: "*",
  },
});

ตอนนี้เมื่อโหลดหน้าคอนโซลกำลังบันทึก ..

รับ https://example.com/socket.io?EIO=4&transport=polling&t=O4UTf4l 404 (ไม่พบ)

กรุณาช่วย.

Score:0
ธง gr

โดยทั่วไปคุณควรเลือกมากกว่า

ตำแหน่ง /คำนำหน้า/ {
    ...
}

มากกว่า

ตำแหน่ง / คำนำหน้า {
    ...
}

เว้นแต่ว่าคุณกำลังพร็อกซีจุดสิ้นสุด API เดียวแทนที่จะเป็น API ทั้งหมด (หรือเว็บแอปอื่น) เมื่อคุณใช้คำนำหน้า URI กับ proxy_pass คำสั่ง (นั่นคือ proxy_pass http://localhost:5000/; ค่อนข้างมากกว่า proxy_pass http://localhost:5000;เครื่องหมายทับต่อท้ายนับเป็นคำนำหน้า URI ที่นี่) nginx จะตัดคำนำหน้าที่ระบุใน ที่ตั้ง คำสั่งจาก URI คำขอของคุณและต่อท้ายด้วยคำนำหน้าที่ระบุใน proxy_pass. ใช้

ที่ตั้ง ^~ /api/ {
    ...
    proxy_pass http://localhost:5000/;
}

และคุณ /api/ข้อมูลประจำตัว URI คำขอจะถูกส่งผ่านไปยังอัปสตรีมของคุณอย่างถูกต้องเป็น /ข้อมูลประจำตัว.

Irfan Habib avatar
bd flag
สวัสดีอีวาน ขอบคุณสำหรับคำตอบ. ฉันช่วยฉันและคุณช่วยชีวิตฉัน ตอนนี้ฉันมีปัญหาใหม่กับ socket.io โปรดดูคำถามที่อัปเดตแล้ว
Ivan Shatsky avatar
gr flag
ฉันคิดว่าคุณควรใช้คำนำหน้าที่แตกต่างกันสำหรับการสื่อสารของ websocket เช่น `/ws` แทนที่จะผสมกับการเรียก `/api` นอกจากนี้ คุณควรเชื่อมต่อพร็อกซี WebSocket ใน [วิธีพิเศษ](http://nginx.org/en/docs/http/websocket.html) อย่างไรก็ตาม คุณได้ดำเนินการไปแล้วในการกำหนดค่า น่าเสียดายที่ `socket.io` ไม่ใช่ความสามารถของฉัน ลองพิจารณาถามคำถามนี้แยกต่างหาก บางที StackOverflow จะเป็นไซต์ที่เหมาะสมกว่าที่จะทำ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา