Nginx的位置变量失败

时间:2019-02-06 22:11:54

标签: nginx nginx-location nginx-reverse-proxy minio

所以我试图设置一个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替换为tester作为静态值,则一切正常。

如何在此处正确使用$subdomain变量?

该问题是该问题的后续案例:k8s-ingress-minio-and-a-static-site。在该问题中,我尝试使用Ingress将代理反向还原到微型存储桶,但无济于事。现在我只是想直接通过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" "-"

1 个答案:

答案 0 :(得分:1)

根据manual page

  

在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;
}

使用rewrite...break和不使用URI的proxy_pass可能更好。

例如:

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