【问题标题】:NGINX not routing calls from react app to backend appNGINX 不会将呼叫从反应应用程序路由到后端应用程序
【发布时间】:2019-04-03 21:23:32
【问题描述】:

我有一个 AWS Ubuntu 服务器,它托管一个运行在 127.0.0.1:4100 的反应前端,并使用端口 127.0.0.1:1323 对 Go 应用程序进行 api 调用。我在/etc/nginx/sites-available/default 配置文件中为这两个端口安装了 Nginx 并设置了代理通行证,但我只让 Nginx 调用了前端。使用 chrome inspect 来检查为什么 Go 应用程序没有提供 react 应用程序的某些功能,我看到了这个错误

client.js:772 GET http://127.0.0.1:1323/api/ net::ERR_CONNECTION_REFUSED ERROR 错误:请求已终止 可能原因:网络离线、Access-Control-Allow-Origin 不允许 Origin、正在卸载页面等。

我做错了什么?下面是我的默认配置文件

server { 

listen 80 default_server; 
listen [::]:80 default_server; 

server_name _; 

location / { 

proxy_pass http://127.0.0.1:4100; 

} 

location /api { 

proxy_pass http://127.0.0.1:1323/; 

 } 
}

【问题讨论】:

  • 你的 React 应用是否指向 127.0.0.1:1323/api
  • @ShawnC。正确我有指向那个的反应应用程序。
  • React 应用程序正在您机器上的浏览器中运行,尝试使用 IP 127.0.0.1 连接到远程服务器,该 IP 是您本地机器的别名。您需要更改您的 React 应用程序以指向您的 AWS IP。 http://AWS_IP/
  • @ShawnC。你摇滚......非常感谢。
  • @ShawnC。我遇到了同样的错误,并按照您的建议解决了。谢谢!但这是一个问题。所以假设服务器名称是 mydomain.com。当用户通过域访问站点时,nginx 会显示用户127.0.0.1:4100,该用户位于 EC2 实例中。在这种情况下,我假设用户(客户端)通过 mydomain.com/api 发送请求,nginx 向127.0.0.1:1323 发送请求,这也在 EC2 实例中,但显然用户需要向AWS_IP 发送请求?为什么nginx不能向127.0.0.1:1323发送请求??

标签: nginx nginx-location nginx-reverse-proxy nginx-config


【解决方案1】:

你的服务器正在监听 80 端口:

listen 80 default_server; 
listen [::]:80 default_server; 

因此,您应该向该端口提出请求:

GET http://127.0.0.1/api/     => http://127.0.0.1:1323/
GET http://127.0.0.1:80/api/  => http://127.0.0.1:1323/
GET http://127.0.0.1/         => http://127.0.0.1:4100/
GET http://127.0.0.1:80/      => http://127.0.0.1:4100/

那么 nginx 应该正确地代理你的请求。

更新

为了更清楚地了解 nginx 配置。

server { 

listen 80 default_server;  // The port nginx is listening to ipv4
listen [::]:80 default_server; // The port nginx is listening to ipv6

server_name _; 

location / { // When you call this location...

proxy_pass http://127.0.0.1:4100; // You'll be redirected to this location

} 

location /api { // When you call this location...

proxy_pass http://127.0.0.1:1323/; // You'll be redirected to this location

 } 
}

你的配置没问题according to nginx docs

您说您的客户正在尝试访问http://127.0.0.1:1323/api/,但它应该请求将http://127.0.0.1/api/(没有端口)重定向到http://127.0.0.1:1323/

这是另一个例子:

server { 

    listen 80; 

    server_name localhost anywebsite.com; 

    location ~* ^/MyApp {
        proxy_pass http://localhost:5130;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_send_timeout 2m;
        proxy_read_timeout 2m;
    }
}

在这种情况下,每次我的网址以/MyApp 结尾时,例如:http://anywebsite.com/api/MyApp 我被代理到http://localhost:5130。但是如果我尝试访问http://localhost:5130http://anywebsite.com:5130/api/MyApp 我将无法访问,因为 nginx 只监听端口 80。如果你想访问另一个端口,你需要这样指定:

server {
    listen 80; 
    listen 5130; 

[...]

【讨论】:

  • 不确定我是否关注。如果您不介意,请编辑配置文件,我必须反映您的意思吗?提前致谢。
  • 根据nginx docs,您发送的配置似乎没有问题。我的意思是您应该在端口 80 上调用,而不是在要重定向的端口上调用。您需要做的是更改您的客户端以调用端口 80。
  • 我通过 aws dns 的入口点将我带到 React 应用程序 127.0.0.1:4100,这是 nginx 正在侦听的端口 80。 react 应用程序是进行后端调用的应用程序,它被编码为在127.0.0.1:1323/api 上进行后端 api 调用。您看到的客户端错误是因为它显示了 react 应用程序试图在服务器中调用的内容,但 nginx 并未将该调用重定向到在该端口上运行的应用程序。这有意义吗?
  • 是的,确实如此。但是您的 nginx 入口点应该始终是 127.0.0.1:80。 Proxy_pass 将使 nginx 从端口 80 获取到 1323,而不是相反。 React 应该调用 127.0.0.1:80/api/ 来查找后端应用程序
  • Sweeeet 做了一个小的编辑,因为它在 AWS 上运行,所以我必须根据 @Shawn C. 的建议指向 AWS IP。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多