Puncte:0

Proxy-ul invers nginx nu funcționează când sunt definite mai multe porturi pentru API-ul REST

drapel bd

Am o următoare aplicație js pe care am implementat-o ​​pe portul 3000 și am setat proxy-ul 3000 pe nginx.

Acum am serverul meu personalizat Node js Backend pe care vreau să îl rulez pe același server pe un port diferit 5000.

Am configurat nginx-ul așa

Locație / {
        proxy_http_versiunea 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Actualizare $http_upgrade;
        proxy_set_header Conexiune „upgrade”;
        proxy_set_header Gazdă $gazdă;
        proxy_set_header X-Real-IP $adresă_la distanță;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $schema;
        proxy_pass http://localhost:3000;
    }
locație ^~ /api {
        proxy_http_versiunea 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Actualizare $http_upgrade;
        proxy_set_header Conexiune „upgrade”;
        proxy_set_header Gazdă $gazdă;
        proxy_set_header X-Real-IP $adresă_la distanță;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $schema;
        proxy_pass http://localhost:5000;
            
        }

Nu am nicio problemă cu accesarea aplicației pe example.com. Am configurat locația /api pentru conectarea server.js / api fetching.

când aduc așa

axios.get(example.com/api)

eroarea sa de returnare -- Nu se poate GET /api/

dar când am setat proxy-ul de locație nginx așa

proxy_pass http://localhost:5000/;

cu o bară oblică înainte, funcționarea și axios-ul preia datele cu succes.

Dar ori de câte ori încerc să preiau o altă rută din fișierul server.js, cum ar fi

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

Afișează din nou eroare așa

Nu se poate GET //credential

Revenirea cu dublă oblică // acreditări

singura rută „/” care funcționează de pe server.js prin preluarea example.com/api

fără bara oblică pe proxy, eroarea sa de returnare. nu poate GET /api sau nu poate GET api/acreditare

te rog ajuta-ma. Mulțumesc anticipat.

Actualizați

Am reparat cu a lui Ivan Răspuns. Acum am o nouă problemă cu acea configurație. Folosesc socket.io lângă axios. Deci, ori de câte ori încerc să mă conectez prin socket.io codul meu socket client este ..

import io de la "socket.io-client";
const socket = io ("https://example.com/api");

iar configurația soclului serverului este ..

const io = require("socket.io")(server, {
  cors: {
    origine: "*",
  },
});

Acum, când pagina se încarcă, consola se înregistrează..

GET https://example.com/socket.io?EIO=4&transport=polling&t=O4UTf4l 404 (Negăsit)

te rog ajuta-ma.

Puncte:0
drapel gr

În general, ar trebui să preferați întotdeauna

locație /prefix/ {
    ...
}

peste

locație /prefix {
    ...
}

cu excepția cazului în care proxy un singur punct final API și nu un întreg API (sau o altă aplicație web). Când utilizați un prefix URI cu proxy_pass directivă (adică proxy_pass http://localhost:5000/; Decat proxy_pass http://localhost:5000;, bara oblică finală contează ca un prefix URI aici), nginx va elimina prefixul specificat în Locație directivă din URI-ul solicitării dvs. și adăugați-o prefixul specificat în proxy_pass. Utilizare

locație ^~ /api/ {
    ...
    proxy_pass http://localhost:5000/;
}

si al tau /api/credential URI de solicitare va fi transmis corect către dvs. în amonte ca /credential.

Irfan Habib avatar
drapel bd
Salut Ivan. Multumesc pentru raspunsul tau. M-am ajutat și mi-ai salvat ziua. Acum am o nouă problemă cu socket.io. Vă rugăm să vedeți întrebarea actualizată.
Ivan Shatsky avatar
drapel gr
Cred că ar trebui să utilizați un prefix diferit pentru comunicațiile websocket, de ex. `/ws` mai degrabă decât să-l amestecați cu apelurile `/api`. De asemenea, ar trebui să proxy conexiunile WebSocket într-un [mod special](http://nginx.org/en/docs/http/websocket.html), dar ați făcut-o deja în configurația dvs. Din păcate, `socket.io` nu este domeniul meu de competență, luați în considerare să puneți aceasta ca o întrebare separată, poate StackOverflow va fi un site mai potrivit pentru a o face.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.