2

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!

Prashant Gupta
  • 788
  • 8
  • 26
Matt Falkner
  • 55
  • 1
  • 5

3 Answers3

5

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;
    }
kamasteve
  • 201
  • 3
  • 4
2

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.

Mattonit
  • 601
  • 7
  • 22
Antonyjim
  • 98
  • 1
  • 7
  • I think there's a small typo in the `app.js` block: it should be `var port = 3000` instead of `var port = 8085`. – cdoublev Nov 16 '18 at 19:39
1

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.

Josh Desmond
  • 640
  • 2
  • 10
  • 19