我有一台 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 之类的东西?