简体   繁体   中英

404 on POST and GET requests for Node.js app behind NGINX reverse proxy

I have an Ubuntu web server running with this structure:

Nginx reverse proxy localhost:80, which redirects to either '/' (apache server with WordPress site at localhost:8080), which currenly works.

More recently a I've tried to add a Node.js Application at www.site.com/app or, internally, localhost:3000 . I am able so serve the HTML and CSS of the node.js webapp, however all internal route calls at 404ing, likely because of the URL addressing of /app/.

IE. Tries to hit /someendpoint and 404s because Node.js is technically running on localhost:3000 ( www.site.com/app ). Should I be routing arguments like ( www.site.com/app/someendpoint )?

The Problem: All POST/GET calls from NODE.JS are 404ing because of my bad understanding of NGINX config. How do I route this GET calls to the actual location of the Node.js server which is (site.com/app/, localhost:3000).

Here is my ' default ' config from /etc/nginx/available_sites/.

 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/;
      }
 }

How might I update this NGINX config file to account for node endpoints actively trying to hit the route of my apache site and not the /app real location of the node server?

Any help or ideas would be great, I've been stuck on this issue for a while as part of a personal project.

Thanks!

Here is a sample app.js file that may offer you some insight into the matter.

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);
});

As for the nginx configuration, I would recommend something along the lines of the following:

# 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";
        }
}

The key part of this is using an external router in your app.js, then using this line: app.use('/app', router); You may want to also set up nginx to serve static files instead of relying on express.static() . This would also be easy to do by setting up more location blocks like so:

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

This should work for your purposes. Don't forget to check your configuration with nginx -t .

please remove the try_files statement in the location / block your location should look like this .....

  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;
    }

For more troubleshooting advice, check out this very similar thread: nginx proxy_pass 404 error, don't understand why

The solution that worked with my 404 issue was to add an extra / after my proxy_pass url.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM