在生产环境中设置 Express.js API

在生产环境中设置 Express.js API

我有一台 Ubuntu 服务器,我正在尝试部署基于 express.js/node 的 Rest API。我读过的所有文档都说使用 Nginx 作为反向代理来使其工作,所以我尝试了十几种不同的方法,但总是收到 502 错误。就好像域根目录之外的任何东西都不想加载并抛出 502。

你可以想象,任何 Restful API 都有 GET、PUT、POST、DELETE 等,带有动态 URL。例如,我可能有一个用于验证用户是否存在的 URL 。http://example.com/api/verify-user/[email protected]

无论我如何尝试定义代理、标头等,通过代理和大量类似的 API 端点运行它似乎都不起作用。无论我输入了多少位置或其变体。所以我真的很迷茫,如何在生产环境中使用 node/express 设置 RESTFul API?因此,它可以从应用程序访问作为示例。

我最近一次在 nginx 配置中运行的域是

server {
        listen 80;
        server_name api.example.net;

        location /api/v1/ {
            proxy_pass http://localhost:3030;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_buffering off;
        }
}

现在我的 express 中的 server.js 看起来像这样

const express       = require('express');
const bodyParser    = require('body-parser');
const cors          = require('cors');
const dotenv        = require('dotenv');
const route         = require('./routes');
const path          = require('path');
const livereload    = require("livereload");
const compression   = require("compression");

const liveReloadServer = livereload.createServer();
liveReloadServer.watch(path.join(__dirname, 'public'));


dotenv.config();
const PORT = process.env.PORT;
const app = express();

// parse requests of content-type: application/json
app.use(bodyParser.json());

// parse requests of content-type: application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

const whitelist = ['http://localhost:3030',
                      'http://api.example.net'];

// enable CORS
const corsOptionsDelegate = (req, callback) => {
  let corsOptions;

  let isDomainAllowed = whitelist.indexOf(req.header('Origin')) !== -1;
  //let isExtensionAllowed = req.path.endsWith('.jpg');

  if (isDomainAllowed) {
      // Enable CORS for this request
      corsOptions = { origin: true }
  } else {
      // Disable CORS for this request
      corsOptions = { origin: false }
  }
  callback(null, corsOptions)
}

app.use(cors(corsOptionsDelegate));

//Compress all routes
app.use(compression());
// enable some server side assets to render when/if needed
app.use(express.static('static'));

// routes
app.use(route);


// set port, listen for requests
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}.`);
});

请注意,为了举例,我特意更改了此处的域名。但到目前为止,我可以告诉您,如果我使用 curl 并测试它,我可以验证代理在远程计算机上是否有效。看看至少一个静态 html 页面是否有效。在我的本地环境中,这一切都运行良好。直到我在远程机器上引入 Nginx,这才开始失败。

我的主要问题是,是否需要像 Nginx 这样的东西来将 Node 放在生产环境中,如果需要,我如何让它处理动态用户生成的数据/url 之类的东西?

相关内容