我正在尝试在一个VPS上设置多个API,并通过Nginx为它们提供服务。我想让他们都在单独的子位置,如下面的例子:
快速远程路径:
[myhost].com/apps/app1/api
[myhost].com/apps/app2/api
Express本地路径:
localhost:[app1 port]
localhost:[app2 port]
Socket.IO远程路径:
[myhost].com/apps/app1/api/socket.io
[myhost].com/apps/app2/api/socket.io
Socket.IO本地路径:
localhost:[app1 port]/socket.io
localhost:[app2 port]/socket.io
Express可以按需工作,我可以像这样在本地访问它:curl -ivL http://localhost:[app1 port]
但是,由于Socekt.IO的“path”属性,Socket.IO仅在以下情况下响应:curl -ivL http://localhost:[app1 port]/apps/app1/api/socket.io/?EIO=4
如果没有Socket.IO 'path',我就无法远程访问它。
const ioServer = new socketIo.Server(httpServer, {
.....
path: "/apps/app1/api/socket.io", <---- this 'path' property
});
Nginx配置:
......
location /apps {
index _;
autoindex on;
location /apps/app1/api/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://localhost:[app1 port];
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /apps/app1 {
index index.html;
}
....
如何去掉本地主机Socket.IO上的**/apps/app 1/API**部分而不丢失远程访问?谢谢
1条答案
按热度按时间vnjpjtjt1#
好吧,答案很简单。只需要在proxy_pass中使用完整的URI(带一个尾随的斜杠),否则该值将被忽略。
如果proxy_pass没有指定URI,则在处理原始请求时,请求URI以与客户端发送的相同的形式传递给服务器,或者在处理更改的URI时传递完整的规范化请求URI:
来自Nginx文档http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass