我希望有人可以在这里帮助我,因为我被困住了。
我正在从传统的nginx / node服务器配置转移到我们的nginx配置,其中nginx和node服务器都在同一台机器上。
在Kubernetes中,入口控制器(nginx)显然位于另一个容器中。
我遇到的困难是重新实施我们的规则,该规则禁止使用位置块对图像和资产进行访问日志记录。
我们的配置类似于
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|mp4|ogg|ogv|webm|htc)$ {
access_log off;
expires 2M;
add_header Cache-Control "public, max-age=5184000"; # 5184000 is 60 days
}
当我在server-snippet
中实现相同的块时,它会匹配,但是所有资产都会抛出404。
我做了一次谷歌搜索,发现了一个答案,可以在这里https://stackoverflow.com/a/52711388/573616
进行解释。,但是建议的答案提示使用if
块而不是location
块,因为该位置会干扰上游的代理,但是,无法从{{1}内部禁用访问日志}块,仅来自if
上下文。
其余的入口看起来像(其他所有设置都是默认的)
location
图像位于上游服务器路径上的/ images/。
所以我要重新尝试如何使这些位置块起作用,以便实际上可以从real_ip_header X-Forwarded-For;
real_ip_recursive on;
underscores_in_headers on;
gzip_types text/css application/x-javascript application/javascript application/json image/svg+xml;
client_max_body_size 5M;
proxy_buffers 8 16k;
proxy_set_header X-Request-Start "t=${msec}";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_redirect off;
禁用这些图像的访问日志
那么有人能告诉我如何获取上面的位置块,以免在入口控制器中为资产抛出404吗?
答案 0 :(得分:2)
我假设您的后端正在服务您的资产,所以我认为问题在于您的location {}
块没有像nginx入口中定义的常规路径那样具有上游。
nginx-ingress-controller的nginx.conf
中有很多lua代码,因此可能需要一些时间来理解,但是您可以在本地复制nginx.conf
:
$ kubectl cp nginx-ingress-controller-xxxxxxxxx-xxxxx:nginx.conf .
检查为当前服务定义的location {}
块,然后将其复制到server-snippet
location {}
块的底部,如下所示:
我相信这样的server-snippet
可以做到:
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|mp4|ogg|ogv|webm|htc)$ {
access_log off;
expires 2M;
add_header Cache-Control "public, max-age=5184000"; # 5184000 is 60 days
<== add what you copied here
set $namespace "k8s-namespace";
set $ingress_name "ingress-name";
set $service_name "service-name";
set $service_port "80";
set $location_path "/images";
...
...
...
proxy_http_version 1.1;
proxy_cookie_domain off;
proxy_cookie_path off;
# In case of errors try the next upstream server before returning an error
proxy_next_upstream error timeout;
proxy_next_upstream_tries 3;
proxy_pass http://upstream_balancer;
proxy_redirect off;
}