无法为多个APIS设置自定义路径,(Socket.IO + ExpressJS + Nginx)

elcex8rz  于 2023-05-06  发布在  Nginx
关注(0)|答案(1)|浏览(221)

我正在尝试在一个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**部分而不丢失远程访问?谢谢

vnjpjtjt

vnjpjtjt1#

好吧,答案很简单。只需要在proxy_pass中使用完整的URI(带一个尾随的斜杠),否则该值将被忽略。
如果proxy_pass没有指定URI,则在处理原始请求时,请求URI以与客户端发送的相同的形式传递给服务器,或者在处理更改的URI时传递完整的规范化请求URI:

location /some/path/ {
  proxy_pass http://127.0.0.1;
}

来自Nginx文档http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

相关问题