假设我有几个用于监控后端服务的 Web UI 站点。
我希望它们可以通过 Web 访问(由 Auth 保护),但最好捆绑在一个子域下,并可通过各种 URL 访问,例如:
https://monitor.mydomain.com/my-service-monitor/
使用 nginx,如果我使用重写规则,例如
server {
listen 443 ssl;
server_name monitor.mydomain.com;
# auth stuff here...
location /my-service-monitor/ {
rewrite ^/my-service-monitor(/.*)$ $1 break;
proxy_pass http://my-service-monitor;
}
}
发生的情况是重定向有效,但由于所有静态内容都引用根 URL,因此它没有按预期显示(因为后端站点正在输出查看根 / url 的 HTML,而不是相对 URL monitor.mydomain.com/my-service-monitor/...
我该如何解决这个问题,或者有没有更简单的解决办法?(我可以使用多个子域名,但在我看来这会让外部曝光率太高)
我正在考虑重定向(返回 301 ...)到子域根 URL 但使用不同的端口,然后添加一个在该端口上监听代理到服务器的服务器块,但我觉得这会给身份验证带来麻烦。
任何见解都将不胜感激。
答案1
您需要教您的后端应用程序为页面生成正确的 URL。显然,有些人正在编写自定义 lua 代码来修改 nginx 中返回的 HTML,但老实说,我建议避免这样做,因为这太疯狂了。
答案2
我最终在同一个子域上为每个站点分配了不同的端口
问题是服务器块应该在 server_name 中包含端口。起初,我只有 listen 值列出端口,但它不适用于同一 server_name 上的多个站点,因此需要
server {
listen 8000 ssl;
server_name sub-domain.domain.com:8000;
#auth stuff
location / {
proxy_pass http://my-service-monitor1;
}
}
server {
listen 8001 ssl;
server_name sub-domain.domain.com:8001;
#auth stuff
location / {
proxy_pass http://my-service-monitor2;
}
}