Nginx 因我的位置变量而失败
Nginx Fails with my variables in location
所以我正在尝试设置 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 来反向代理到一个 minio bucket,但无济于事。现在我只是想直接通过 Nginx,但我的变量不起作用。
更新
因此,如果 URL 中存在变量,proxy_pass 似乎无法正确解析主机。
尝试了两件事:
像这样设置解析器:resolver default.cluster.local
。我为 kube-dns 的 fqdn 尝试了一堆组合,但无济于事,并且一直无法找到 minio-server
。
不要像下面提到的 Richard Smith 那样使用变量。而是重写所有内容然后代理通过。但是我不明白这是如何工作的,我得到了非常无用的错误,如下所示:10.244.1.1 - - [07/Feb/2019:18:13:53 +0000] "GET / HTTP/1.1" 405 291 "-" "kube-probe/1.10" "-"
根据 manual page:
When variables are used in proxy_pass: ... In this case, if URI is specified in the directive, it is passed to the server as is, replacing the original request 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;
}
所以我正在尝试设置 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 来反向代理到一个 minio bucket,但无济于事。现在我只是想直接通过 Nginx,但我的变量不起作用。
更新
因此,如果 URL 中存在变量,proxy_pass 似乎无法正确解析主机。
尝试了两件事:
像这样设置解析器:
resolver default.cluster.local
。我为 kube-dns 的 fqdn 尝试了一堆组合,但无济于事,并且一直无法找到minio-server
。不要像下面提到的 Richard Smith 那样使用变量。而是重写所有内容然后代理通过。但是我不明白这是如何工作的,我得到了非常无用的错误,如下所示:
10.244.1.1 - - [07/Feb/2019:18:13:53 +0000] "GET / HTTP/1.1" 405 291 "-" "kube-probe/1.10" "-"
根据 manual page:
When variables are used in proxy_pass: ... In this case, if URI is specified in the directive, it is passed to the server as is, replacing the original request 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;
}