例子

例子

我已经在网上搜索了一段时间,但无法找到从最佳实践角度对此问题的明确答案,而且提取优点和缺点也很困难。

我有多个应用程序/位置希望通过 nginx 反向代理提供服务

app1 是纯静态文件,即 js/html/css 等 app2 和 app3 是 wsgi 应用程序

我当前的解决方案使用子域名来区分路由

example.com -> app1
app2.example.com -> app2
app3.example.com -> app3 

然后,我根据服务器名称在 nginx 配置中为每个应用程序设置不同的服务器块。

这很有效,但我知道通过路线实现分割的替代方法,即

example.com/ -> app1
example.com/app2/ -> app2
example.com/app3/ -> app3

哪种做法更好?没有子域名使得 CORS/Session cookie 管理更加容易,并且不需要为子域名设置多个 DNS 记录。路由方法有什么缺点吗?这两种方法似乎都是在网络上实现的,那么决定性因素是什么呢?

答案1

就我个人而言,我更喜欢example.com/app1example.com/app2 或者甚至在更深层次上,example.com/portal/app[1-N]更喜欢app1.example.com和,app[2-N].example.com 因为对我来说,这看起来是完全无缝的。

许多应用程序开发人员在编写代码时都假设:

  • 他们是唯一将被部署的应用程序
  • 他们的应用程序将始终部署在 URL 的根目录中

当您必须在根级别以下的 URL 路径上使用反向代理规则时,就会出现问题/

您可能有几个不同的应用程序,它们都使用相同的基本 URL(如/js/ /images/ /css/等),并在其 HTML 中使用指向这些基本目录的资源的绝对链接。

更简单的方法是将完整的子域映射到单个应用程序。

例子

app1 在 appserver1 上运行
app2 在 appserver2 上运行

在 nginx 配置中,您有两个反向代理块,用于将这些应用程序映射到 example.com 的 URL 空间中,例如 example.com/app1 example.com/app2

server {
    listen 80;
    server_name example.com;
    root /var/www/html ; 
    location /app1/ {
         proxy_pass http://appserver1/; 
    }
    location /app2/ {
         proxy_pass http://appserver2/; 
    }
}

例如,你可以使用相同的绝对引用

<script src="/js/jquery.js"></script>

在 appserver1/index.html 和 appserver2/index.html 的 HTML 代码中。

当您请求时,http://example.com/app1/index.html您的浏览器将尝试加载脚本并请求http://example.com/js/jquery.js,然后会发生什么?

URL /js/jquery.js 可能会映射到本地文件系统 /var/www/html/js/jquery.js 中的文件,或者会触发 404 未找到错误,但肯定不会被反向代理到 appserver1/js/jquery.js

反向代理不会自动将绝对 URL“/js/jquery.js”重写http://example.com/app1/js/jquery.js为 app1,也不会对http://example.com/app2/js/jquery.jsapp2 进行类似的重写。

你可以对此进行调整 但设置和维护起来很麻烦。

答案2

server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;
    #because logs are love
    location ~ ^/app3 {
        #--->app3
    }
    location ~ ^/app2 {
        #---> app2
    }
    location / {
        #----> app1
    }
}

这应该是一般的 1 serverblock-multiple location 配置。

相关内容