node.js - 无法使用 Nginx 反向代理 React + Node + PM2 获取等

标签 node.js reactjs express ubuntu nginx

在为 React 应用程序和 Node Web 服务器设置 Nginx 反向代理时,它似乎在后端破坏了 Express,尽管我可以告诉我正在浏览器中访问它,在添加第二个位置 block 后收到“无法获取 XX”消息(之前在访问 API 端点时浏览器只是白色的,因为 React Router 试图抓取它们)。

配置如下,其中端口 3000 是我的 React 应用程序,端口 4000 是我的 Express 服务器,两者均由 pm2 管理:

server {
        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;
         server_name www.mywebsite.com; # managed by Certbot


        location / {
                proxy_pass http://127.0.0.1:3000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }

        location /api/ {
                proxy_pass http://127.0.0.1:4000/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }

}

简单的 Express 路线不起作用(“无法获取/”):

app.get('/', (req, res) => {
        res.send('Hello, world!');
});

还有一些额外的 certbot 内容是为 SSL 生成的,但我不确定它是否相关。 React 应用程序工作完美,但无论是“location/api/”还是“location/api”,也无论我如何在 Express 中命名我的路线,尽管之前工作得很好,但它们都无法解析。预先感谢您的任何指导!

编辑:我更改了服务器配置,至少将/api/映射到服务器的根目录,并带有尾随反斜杠,这样我就不必将/api 添加到每个路由处理程序中,但问题仍然存在(“无法获取/”)。

最佳答案

为什么使用以下 header ?

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';

如果您使用 TLS/https,则可能不需要,并且如果升级 header 存在,可能会导致 Express 出现问题。尝试删除它。

这些 header 通常用于 WebSocket。请参阅the nginx docs了解更多详情。

关于node.js - 无法使用 Nginx 反向代理 React + Node + PM2 获取等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775711/

相关文章:

javascript - 如何在 node.js 上用\r\n 替换字符串?

javascript - 如何解构嵌套的 Prop ?

node.js - 基于 Promise 的 Node http 框架?

node.js - Express 中间件 protected 和不 protected 路由

javascript - 在 React 中继承常见的 props 和方法的最佳实践是什么?

javascript - Express js 中 View 之间传递数据

javascript - 如何在快速路由的控制台中记录 500 个状态错误?

node.js - Angular 和 Node.JS Express 如何在同一个端口运行?

ruby-on-rails - RSpec + Jasmine Node

javascript - 如何测试中止的函数?