【问题标题】:NGINX => serve several applications on a single host name with sub-urisNGINX => 使用 sub-uris 在单个主机名上服务多个应用程序
【发布时间】:2012-04-29 04:17:35
【问题描述】:

我想通过 nginx 反向代理来自同一服务器的多个应用程序。我希望这些应用程序可以通过带有 sub-uris 的单个域名提供。

例如

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 ???
}

有人知道这一点或指出我正确的方向吗?

【问题讨论】:

    标签: nginx


    【解决方案1】:

    怎么样:

    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_passproxy_redirect)但很有用。

    【讨论】:

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

    关于css、js、images文件丢失的问题,可以这样操作,

    如果你使用 express 框架。 您需要添加此代码行

    app.enable('trust proxy');  
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 2018-09-04
      • 2014-11-06
      • 2021-10-06
      • 2017-04-27
      • 2019-10-29
      • 1970-01-01
      • 2017-09-18
      相关资源
      最近更新 更多