1

所以我正在尝试设置一个 nginx default.conf 并且我在使用变量时遇到了麻烦。我想将子域捕获为$subdomain变量并在default.conf.

这是我的配置:

server {
     listen 80;
     server_name  ~^(?<subdomain>.+)\.example\.com$;
     # To allow special characters in headers
     ignore_invalid_headers off;
     # Allow any size file to be uploaded.  
     # Set to a value such as 1000m; to restrict file size to a specific value
     client_max_body_size 0;
     # To disable buffering
     proxy_buffering off;
     location / {
       rewrite ^/$ /$subdomain/index.html break;
       proxy_set_header Host $http_host;
       proxy_pass http://minio-server:9000/$subdomain/;
       #health_check uri=/minio/health/ready;
     }
}

不幸的是$subdomain,位置块中变量的存在每次都完全使 nginx 失败。如果我要$subdomain在 location 块中替换tester为静态值,那么一切正常。

这里如何正确使用$subdomain变量???

这个问题在某种程度上是对这个问题的跟进:k8s-ingress-minio-and-a-static-site。在那个问题中,我试图使用 Ingress 将代理反向代理到 minio 存储桶,但无济于事。现在我只是想直接通过 Nginx,但我的 var 不起作用。

更新

因此,如果 URL 中有变量,proxy_pass 似乎无法正确解析主机。

尝试了两件事:

  1. 像这样设置解析器:resolver default.cluster.local. 我为 kube-dns 的 fqdn 尝试了一堆组合,但无济于事,一直minio-server找不到。

  2. 不要使用下面提到的 Richard Smith 变量。而是重写所有内容然后代理通过。但是我不明白这将如何工作,并且我得到了非常无用的错误,如下所示:10.244.1.1 - - [07/Feb/2019:18:13:53 +0000] "GET / HTTP/1.1" 405 291 "-" "kube-probe/1.10" "-"

4

1 回答 1

1

根据手册页

当在 proxy_pass 中使用变量时: ... 在这种情况下,如果在指令中指定了 URI,则将其按原样传递给服务器,替换原始请求 URI。

所以你需要为上游服务器构建完整的 URI。

例如:

location = / {
    rewrite ^ /index.html last;
}
location / {
    proxy_set_header Host $http_host;
    proxy_pass http://minio-server:9000/$subdomain$request_uri;
}

在没有 URI 的情况下使用rewrite...break和使用可能会更好。proxy_pass

例如:

location / {
    rewrite ^/$ /$subdomain/index.html break;
    rewrite ^ /$subdomain$uri break;
    proxy_set_header Host $http_host;
    proxy_pass http://minio-server:9000;
}
于 2019-02-07T16:36:49.800 回答