2017-05-03 3 views
2

Ich habe eine Knoten-Anwendung auf einem Dienst mit Apache und Nginx als Reverse-Proxy ausgeführt.Wie wird Nginx für die Node.js-REST-API richtig konfiguriert?

Auf demselben Server wird auch eine Knoten-REST-API ausgeführt.

Der JavaScript-Code sieht wie folgt aus:

api.js

// Express 
const express = require('express'); 
const bodyParser = require('body-parser'); 
const cors = require('cors'); 

// Express App 
const app = express(); 

// Env 
const PORT  = process.env.PORT || 3000; 
const NODE_ENV = process.env.NODE_ENV || 'development'; 

// Config 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cors()); 

// Routes 
const users = require('./routes/users'); 

// Angular Http content type for POST etc defaults to text/plain at 
app.use(bodyParser.text(), function ngHttpFix(req, res, next) { 
    try { 
    req.body = JSON.parse(req.body); 
    next(); 
    } catch(e) { 
    next(); 
    } 
}); 

app.use('/api', users); 

app.listen(PORT, function() { 
    console.log('Listen on http://localhost:' + PORT + ' in ' + NODE_ENV); 
}); 

/routes/users.js

var models = require('../models'); 
var express = require('express'); 
var router = express.Router(); 

// get all users 
router.get('/users', function(req, res) { 
    models.Beekeeper.findAll({}).then(function(users) { 
    res.json(users); 
    }); 
}); 

module.exports = router; 

Die Nginx Konfiguration sieht wie folgt aus:

index index.html index.htm; 

upstream api { 
    server 127.0.0.1:3000; 
} 

server { 
    listen 80; 
    server_name example.com; 
    return 301 https://$server_name$request_uri; 
} 

server { 
    listen 443; 
    root /var/www; 

    ssl on; 
    ssl_prefer_server_ciphers On; 
    ssl_protocols TLSv1.2; 
    ssl_session_cache shared:SSL:10m; 
    ssl_session_timeout 10m; 
    ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; 

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 
    add_header X-Frame-Options DENY; 
    add_header X-Content-Type-Options nosniff; 

    ssl_dhparam /etc/nginx/ssl/dhparam.pem; 
    ssl_certificate /etc/letsencrypt/live/example.com/cert.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 

    server_name example.com; 

    location/{ 
      proxy_pass http://127.0.0.1:8000; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-Ip $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-Forwarded-Proto $scheme; 

    } 

    location /api { 
      proxy_pass http://api; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-Ip $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-Forwarded-Proto $scheme; 
      rewrite ^/api/?(.*) /$1 break; 
      proxy_redirect off; 
    } 
} 

Das Problem m ist, dass wenn ich einen API-Aufruf auf meinem Entwicklungsserver mache, zum Beispiel localhost: 3000/api/users, funktioniert es wie erwartet.

Allerdings, wenn ich einen API-Aufruf auf meinem Produktions-Server zu machen, zum Beispiel https://example.com/api/users, erhalte ich Können nicht GET/Benutzer und 404 NOT FOUND ist.

Ich vermute, dass etwas mit meiner Nginx-Konfiguration nicht stimmt, obwohl ich bereits zahlreiche andere Beiträge zu ähnlichen Problemen hier auf Stackoverflow gelesen habe, konnte ich das Problem nicht lösen.

+0

Was zeigt sich in Ihrem Browser, wenn Sie direkt auf "http: // api" klicken? –

+0

@FazalRasel meinst du https://example.com/api? – mian

+0

Nein, proxy_pass wird nur 'http: // api' als Ihre Konfiguration aufrufen. Ich denke, es gibt 404 –

Antwort

2

Beachten Sie, dass diese anfordernden sind:

https://example.com/api/users 

Aber der Fehler sagt dies:

kann nicht /users

Also das /api Präfix abgezogen wird aus dem Anfrage-Pfad, bevor es an Ihren Node-Server übergeben wird.

, die von dieser Linie erfolgt:

rewrite ^/api/?(.*) /$1 break; 

Lösung: diese Zeile entfernen.

+0

zurück, wenn ich diese Zeile entfernen und https://example.com/api/users anfordern, ist das Ergebnis 404 nicht gefunden nginx/1.10.2, was bedeutet, dass die API nicht mehr erreicht werden kann – mian

+0

Ich testete mit einem sehr ähnliches Setup und es funktioniert gut für mich. Protokolliert Ihr Express-Server die Anfrage oder übergibt NGINX die Anfrage nicht einmal? – robertklep

+1

Ihre Antwort ist in Ordnung, ich habe ein Debugging durchgeführt und festgestellt, dass mein ORM aufgrund einer fehlenden Umgebungsvariablen einen Fehler ausgegeben hat. Entschuldigung für die Verwirrung. – mian

Verwandte Themen