我已经在网上搜索了一段时间,但无法找到从最佳实践角度对此问题的明确答案,而且提取优点和缺点也很困难。
我有多个应用程序/位置希望通过 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/app1
,example.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.js
app2 进行类似的重写。
你可以对此进行调整 但设置和维护起来很麻烦。
答案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 配置。