NGINX=>;使用子URI在单个主机名上为多个应用程序提供服务

NGINX=>;使用子URI在单个主机名上为多个应用程序提供服务,nginx,Nginx,我想从同一台服务器上服务多个应用程序,通过nginx反向代理。我希望这些应用程序可以通过一个带有子URI的域名使用 e、 g www.mydomain.com/nodejs =>被nginx监听端口80捕获,并通过端口3001上运行的node.js应用程序提供服务 www.mydomain.com/rails =>被nginx监听端口80捕获,并通过端口3002上运行的rails应用程序提供服务 我的第一个尝试是从两个上游开始: # /etc/nginx/sites-available/mydo

我想从同一台服务器上服务多个应用程序,通过nginx反向代理。我希望这些应用程序可以通过一个带有子URI的域名使用

e、 g

www.mydomain.com/nodejs
=>被nginx监听端口80捕获,并通过端口3001上运行的node.js应用程序提供服务

www.mydomain.com/rails
=>被nginx监听端口80捕获,并通过端口3002上运行的rails应用程序提供服务

我的第一个尝试是从两个上游开始:

# /etc/nginx/sites-available/mydomain.com

upstream nodejs {
  server 127.0.0.1:3001;
}

upstream rails {
  server 127.0.0.1:3002;
}

server {
  listen 80 default deferred;

  # What do I put here so that
  # mydomain.com/nodejs is proxied to the nodejs upstream and
  # mydomain.com/rails  is proxied to the rails  upstream ???
}
有人知道这一点或给我指出正确的方向吗?

怎么样:

upstream nodejs {
    server 127.0.0.1:3001;
}

upstream rails {
    server 127.0.0.1:3002;
}

server {
    listen 80;  

    location /nodejs {
        proxy_pass         http://nodejs;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

    location /rails {
        proxy_pass         http://rails;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

}
或者很快:

server {   
    listen 80;     

    location /nodejs {
        proxy_pass         http://127.0.0.1:3001;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

    location /rails {
        proxy_pass         http://127.0.0.1:3002;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

}
?


大多数代理指令都是可选的(您可能只需要
proxy\u pass
proxy\u redirect
)但很有用

关于这个问题,css、js、图像文件丢失了,你可以这样做

如果您使用express framework 您需要添加此代码行

app.enable('trust proxy');  

此值“信任代理”默认值为禁用。

感谢您的回答!尽管有了这种配置,它似乎只服务于两个位置中的第一个,无论我是在mydomain.com/nodejs还是mydomain.com/rails上,并且无法在该应用程序中服务文件,因为它们没有子uri(例如,它们尝试服务mydomain.com/myjavascriptasset.js而不是mydomain.com/nodejs/myjavascriptasset.js)。理想情况下,我希望应用程序在不知道子uri的情况下工作(如果可能的话…),因为我有一个输入错误。它使用此配置将mydomain.com/nodejs代理到node.js应用程序,并将mydomain.com/rails代理到rails应用程序。唯一的问题是,如果这些应用程序提供的html页面带有引用名为myjavascriptasset.js的资产的脚本标记,则这些文件是404,因为它们不包含子uri(例如,它们尝试提供mydomain.com/myjavascriptasset.js而不是mydomain.com/nodejs/myjavascriptasset.js)。理想情况下,我希望应用程序在不知道子uri的情况下工作,知道吗?这些资产可能是从HTML或CSS引用的,因此浏览器(不是rails应用程序或nodejs)直接向执行代理的Web服务器发出请求。此Web服务器必须为资产提供服务,而使用当前配置,它根本不知道任何资产。你需要分别为它们提供服务,也许你可以在你的应用程序中添加URL前缀?例如/rails/myjavascript.js,然后使用Nginx中的
try_files
指令首先尝试资源,然后再重定向到上游?事实上,它们是从HTML和CSS引用的,源url为“/myassets.js”,提示浏览器请求“”。我想除了修改应用程序,使它们将资产引用为“/nodejs/myassets.js”或使用子域之外,没有其他解决方案。在来自给定ip的第一个连接被设置为“mydomain.com/nodejs”后,nginx无法重写所有后续请求的uri并添加“/nodejs”部分?@olivoil你所说的子域和映射是什么意思?你能在这里粘贴一些代码片段吗?