如何为Node.js REST API正确配置Nginx?

迈克尔·安道夫

我有一个在Apache和Nginx作为反向代理的服务上运行的节点应用程序。

在同一服务器上,还运行一个节点REST API。

JavaScript代码如下所示:

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;

Nginx配置如下所示:

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

问题是,如果我在开发服务器(例如localhost:3000 / api / users)上进行API调用,它将按预期工作。

但是,如果我在生产服务器上进行API调用,例如https://example.com/api/users,则会分别收到Cannot GET / users404 NOT FOUND

我想我的Nginx配置有问题,但是,尽管我已经在Stackoverflow上阅读过很多其他有关类似问题的文章,但我无法解决问题。

罗伯特克莱普

请注意,您正在请求以下内容:

https://example.com/api/users

但是错误说明了这一点:

无法获取/用户

因此,在将/api前缀传递给您的节点服务器之前,先将其从请求路径中删除。

这是通过以下行完成的:

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

解决方案:删除该行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

REST API node.js

如何为Heroku Node.js Web应用程序配置Nginx

Node.js REST API版本控制正确吗?

如何为Node.js设置Google Translate API?

如何使用node.js实现安全的REST API

使用Node.js Express的Rest API

简单的Node.JS REST API调用

如何为Rest API构建路由

如何为出口端点设计REST API?

带有Node.js Rest API的React.js

如何为node.js JDBC模块配置Java堆大小?

如何为 Azure 上的 Node.js Api 应用程序启用 BLOB 日志记录?

在 Node js 中 Rest Api 请求(curl 到 Node.js,python 到 Node.js)

如何正确迭代通过React JS中通过Wp Rest Api检索的发布对象数组

节点 js REST api

如何处理Node.js的REST API的非传统查询

如何保护开放的 REST API 免受 Node.js 中的滥用?

如何从 REST API 获取数据到 Lex ChatBot (Node.js)

如何通过ID,node.js在rest API中发送多个帖子请求?

如何解析Rest Api json响应并将数据插入Jade模板(Node.js + Express)?

如何使用 Node.js 在 Azure 上为 Documentdb 数据库构建 Rest API

如何将Node.js REST API部署到生产模式

如何在使用Node.JS开发的Rest API中实现安全性?

如何在node.js中异步执行多个REST API请求?

如何让用户只能看到自己的数据,node js rest api with mysql

如何使用 Node.js、Express 和 SQL DB 编写 POST REST API?

Node JS REST API 图片上传,我如何只上传 jpg 文件而不上传 png?

如何为 node.js 设置 WebStorm?

node.js 中的 Rest api 调用问题