【问题标题】:404 on POST and GET requests for Node.js app behind NGINX reverse proxyNGINX 反向代理后面的 Node.js 应用程序的 POST 和 GET 请求出现 404
【发布时间】:2018-09-14 17:11:57
【问题描述】:

我有一个使用这种结构运行的 Ubuntu Web 服务器:

Nginx 反向代理 localhost:80,它重定向到 '/'(在 localhost:8080 具有 WordPress 站点的 apache 服务器),目前可以工作。

最近我尝试在www.site.com/app 或内部localhost:3000 添加一个Node.js 应用程序。我能够提供 node.js webapp 的 HTML 和 CSS,但是所有内部路由调用都在 404ing,可能是因为 /app/ 的 URL 寻址。

IE。尝试访问 /someendpoint 和 404,因为 Node.js 在技术上运行在 localhost:3000 (www.site.com/app) 上。我应该像 (www.site.com/app/someendpoint) 这样路由参数吗?

问题:由于我对 NGINX 配置的理解不好,来自 NODE.JS 的所有 POST/GET 调用都是 404ing。如何将此 GET 调用路由到 Node.js 服务器的实际位置,即 (site.com/app/, localhost:3000)。

这是我来自 /etc/nginx/available_sites/. 的“default”配置

 server {
     listen 80 default_server;
     listen [::]:80 default_server;

     root /var/www/html;

     index index.php index.html index.htm index.nginx-debian.html;

     server_name www.*site*.name;

     location / {
         proxy_pass http://127.0.0.1:8080$request_uri;
         proxy_buffering on;
         proxy_buffers 12 12k;
         proxy_redirect off;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $remote_addr;
         proxy_set_header Host $host;
         try_files $uri $uri/ /index.php?q=$uri&$args;
     }

     #Currenly serving HTML, CSS of site, however node routes 404 
     location /app/ {
          proxy_pass http://localhost:3000/;
      }
 }

我如何更新这个 NGINX 配置文件来说明节点端点主动尝试访问我的 apache 站点的路由,而不是节点服务器的 /app 实际位置?

任何帮助或想法都会很棒,作为个人项目的一部分,我已经在这个问题上停留了一段时间。

谢谢!

【问题讨论】:

    标签: node.js nginx


    【解决方案1】:

    请删除 location / 块中的 try_files 语句 您的位置应如下所示 .....

      location / {
                proxy_pass    http://localhost:8080;
                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;
        }
    

    【讨论】:

    • 我挣扎了好几天,你的回答很有效。非常感谢
    【解决方案2】:

    这是一个示例 app.js 文件,可以让您深入了解这个问题。

    var express = require("express");
    var router = require("./lib/routes/index");
    var app = express();
    var port = 3000;
    
    app.use('/app', router);
    
    app.listen(port, function () {
        console.log("Listening on port " + port);
    });
    

    至于 nginx 的配置,我推荐如下:

    # Sample nginx config with 2 upstream blocks
    upstream nodeApp {
            server 127.0.0.1:3000;
    }
    
    upstream apacheApp {
            server 127.0.0.1:8080
    }
    
    server {
            listen 80;
            listen [::]:80;
    
            server_name www.domain.com domain.com;
    
            root /var/www/domain;
    
            location / {
                    proxy_pass http://apacheApp;
            }
    
            location /app {
                    proxy_pass http://nodeApp;
                    # OR
                    # try_files $uri $uri/ @backend;
            }
    
            location @backend {
                    proxy_pass http://nodeApp;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
            }
    }
    

    其中的关键部分是在您的 app.js 中使用外部路由器,然后使用以下行:app.use('/app', router); 您可能还想设置 nginx 来提供静态文件,而不是依赖 express.static()。通过像这样设置更多位置块也很容易做到这一点:

    location /app/public {
            try_files $uri $uri/ =404;
    }
    

    这应该适用于您的目的。不要忘记使用nginx -t 检查您的配置。

    【讨论】:

    • 我认为app.js 块中有一个小错字:应该是var port = 3000 而不是var port = 8085
    【解决方案3】:

    有关更多故障排除建议,请查看此非常相似的主题:nginx proxy_pass 404 error, don't understand why

    解决我的 404 问题的解决方案是在我的 proxy_pass 网址之后添加一个额外的 /

    【讨论】:

      猜你喜欢
      • 2017-02-27
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2015-03-27
      • 2011-01-17
      相关资源
      最近更新 更多