我目前正在尝试设置nginx虚拟服务器块,我绝对想把它弄乱。
从本质上讲,我在DigitalOcean的Droplet上运行了一个NodeJS实例。此应用程序的重点是同时托管网站和api。我希望它们都在相同的液滴上运行。
我已经用express设置了我的NodeJS应用程序以创建路由等,然后使用express应用程序创建了一个http服务器。由于我的解释可能会引起混乱,因此我将以下代码的要点包括在内:
const API_PORT = 8080;
const WEB_PORT = 8081;
const api = express();
const web = express();
web.use(express.static(path.join(__dirname, '../build')));
web.get('//', (req, res) => {
res.sendFile(path.join(__dirname, '../build', 'index.html'));
})
api.use((req, res, next) => {
const ip = (req. headers['x-forwarded-for'] || '').split(',').pop()
|| req.connection.remoteAddress
|| req.socket.remoteAddress
|| req.connection.socket.remoteAddress
if (req.headers.auth !== AUTHCODE) {
httpError(400, 'Validation failed');
console.warn('Bad Auth Code');
console.warn(req.headers.auth);
console.warn(ip);
return (res.json('Validation failed'));
}
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', '*');
res.setHeader('Access-Control-Allow-Headers', '*');
next();
});
Graph.route(api);
const apiServer = http.createServer(api);
const webServer = http.createServer(web);
apiServer.listen(WEB_PORT, '127.0.0.1', () => {
console.log(`API Server is running on port ${API_PORT}`);
});
webServer.listen(API_PORT, '127.0.0.1', () => {
console.log(`WEB Server is running on port ${WEB_PORT}`);
});
上面的代码显示了我想要实现的目标,但是本质上,我试图让我的api服务器监听端口8080,而我的网站服务器监听端口8081。
有人告诉我可以使用nginx为此创建一个proxy_pass
,尽管我没有设法使其按预期工作。在下面,您可以看到两个我尝试做的例子!
任何能够帮助我的人将永远成为我的英雄!
server {
listen lace.guide:443 ssl;
server_name lace.guide www.lace.guide;
ssl_certificate /var/my-server/ssl/myapp.crt;
ssl_certificate_key /var/my-server/ssl/myapp.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_pass http://127.0.0.1:8080/$request_uri;
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;
}
}
server {
listen api.lace.guide:443 ssl default_server;
server_name api.lace.guide www.api.lace.guide;
ssl_certificate /var/my-server/ssl/myapp.crt;
ssl_certificate_key /var/my-server/ssl/myapp.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_pass http://127.0.0.1:8081/$request_uri;
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;
}
}
我还遇到另一个非常特殊的错误,这意味着如果我访问api.lace.url/something/somethingElse
,它实际上会在服务器上命中//something/somethingElse
(来自req.url
的console.log)
答案 0 :(得分:0)
这里是一个示例,说明服务器和客户端如何在一个服务器上运行并通过nginx进行管理(为简单起见,省略了SSL设置)。所有前缀为/api
的请求都会路由到服务器,其余的路由到客户端。
upstream client {
server client:3000;
}
upstream api {
server api:5000;
}
server {
listen 80;
location / {
proxy_pass http://client;
}
location /api {
proxy_set_header X-Forwarded-For $remote_addr;
rewrite /api/(.*) /$1 break;
proxy_pass http://api;
}
}