蓝绿部署场景下超大型Nginx.conf配置文件的精简方案及导入新Ingress控制器的方法
哇,10k行的nginx.conf还要维护100个几乎一模一样的server块,想想都头大!不过别担心,咱们有两种核心思路来解决这个问题:要么把现有臃肿的配置彻底精简,要么直接利用Ingress控制器的原生特性彻底告别手动写配置的麻烦,下面给你详细拆解:
一、精简现有Nginx配置:用复用+拆分干掉重复代码
你的每个server块只有server_name、service_name、proxy_upstream_name这几个变量不同,剩下全是重复内容,这刚好可以用Nginx的include指令把通用配置抽离成独立的代码片段,大幅压缩配置体积:
1. 拆分通用配置为独立snippets文件
把所有server块都重复的内容拆成几个单独的配置文件,比如:
- server-base.conf:存放每个server都有的监听、SSL基础配置
listen 80; listen 443 ssl http2; ssl_certificate_by_lua_block { certificate.call() } port_in_redirect off;
- proxy-common.conf:存放所有重复的proxy头部、超时、缓冲等配置
client_max_body_size 50m; proxy_set_header Host $best_http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Request-ID $req_id; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $best_http_host; proxy_set_header X-Forwarded-Port $pass_port; proxy_set_header X-Forwarded-Proto $pass_access_scheme; proxy_set_header X-Scheme $pass_access_scheme; proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for; proxy_set_header Proxy ""; proxy_connect_timeout 600s; proxy_send_timeout 600s; proxy_read_timeout 600s; proxy_buffering off; proxy_buffer_size 4k; proxy_buffers 4 4k; proxy_max_temp_file_size 1024m; proxy_request_buffering on; proxy_http_version 1.1; proxy_cookie_domain off; proxy_cookie_path off; proxy_next_upstream error timeout; proxy_next_upstream_timeout 0; proxy_next_upstream_tries 3; proxy_pass http://upstream_balancer; proxy_redirect off;
- location-main.conf:存放第一个location块里的通用Lua逻辑
rewrite_by_lua_block { lua_ingress.rewrite({ force_ssl_redirect = true, ssl_redirect = true, force_no_ssl_redirect = false, use_port_in_redirects = false, }) balancer.rewrite() plugins.run() } header_filter_by_lua_block { lua_ingress.header() plugins.run() } log_by_lua_block { balancer.log() monitor.call() plugins.run() }
- location-default.conf:存放第二个location块的通用Lua逻辑
rewrite_by_lua_block { lua_ingress.rewrite({ force_ssl_redirect = true, ssl_redirect = true, force_no_ssl_redirect = false, use_port_in_redirects = false, }) balancer.rewrite() plugins.run() } header_filter_by_lua_block { lua_ingress.header() plugins.run() } log_by_lua_block { balancer.log() monitor.call() plugins.run() }
2. 简化每个Server块
现在每个server块只需要保留差异化的变量,然后通过include引入通用片段即可,比如:
server { server_name wwi-dev-devops-blue.domain.com ; include /etc/nginx/snippets/server-base.conf; location ~* "^/*" { set $namespace "default"; set $ingress_name "haproxy"; set $service_name "haproxy-blue"; set $service_port "80"; set $location_path "/*"; set $proxy_upstream_name "default-haproxy-blue-80"; include /etc/nginx/snippets/location-main.conf; include /etc/nginx/snippets/proxy-common.conf; } location ~* "^/" { set $namespace ""; set $ingress_name ""; set $service_name ""; set $service_port ""; set $location_path "/"; set $proxy_upstream_name "upstream-default-backend"; include /etc/nginx/snippets/location-default.conf; include /etc/nginx/snippets/proxy-common.conf; } }
这样原本几百行的server块瞬间缩到十几行,100个server块的总配置体积会直接砍掉70%以上,而且以后修改通用规则只需要改对应的snippets文件,不用逐个修改server块。
二、更优解:直接用Ingress Controller的原生特性替代手动配置
其实你现在用的是Kubernetes的ingress-nginx控制器(从配置里的lua_ingress等逻辑能看出来),完全没必要手动写这么多server块!Ingress控制器的核心作用就是通过Kubernetes的Ingress资源自动生成Nginx配置,完美适配你的蓝绿部署场景:
1. 为每个蓝绿服务创建Ingress资源
比如蓝环境的haproxy-blue服务对应的Ingress.yaml:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: haproxy-blue-ingress namespace: default annotations: # 配置通用的SSL重定向规则 nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-redirect: "true" # 配置通用的Proxy超时 nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" # 配置请求体大小限制 nginx.ingress.kubernetes.io/client-max-body-size: "50m" spec: # 配置SSL证书(可以引用cert-manager生成的Certificate或者手动创建的Secret) tls: - hosts: - wwi-dev-devops-blue.domain.com secretName: your-ssl-secret rules: - host: wwi-dev-devops-blue.domain.com http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: haproxy-blue port: number: 80
绿环境的服务只需要复制这个Ingress,修改host、secretName和service.name即可。
2. 让Ingress Controller自动生成配置
Ingress控制器会自动监听所有Ingress资源,合并通用规则,生成对应的Nginx配置文件,完全不需要你手动维护nginx.conf。这种方式不仅彻底解决了配置臃肿的问题,还能利用Kubernetes的编排能力快速切换蓝绿环境,比手动改配置高效太多。
三、如果暂时要保留手动配置:拆分ConfigMap导入新控制器
如果因为某些原因必须保留现有手动配置,那可以把拆分后的配置文件分别存入多个小ConfigMap,避免单个ConfigMap体积超限:
- 创建一个主ConfigMap存放简化后的nginx.conf
- 为每个snippets文件创建单独的ConfigMap(比如
nginx-snippets-server-base、nginx-snippets-proxy-common等) - 在Ingress Controller的Deployment中,把这些ConfigMap挂载到容器内对应的路径(比如
/etc/nginx/和/etc/nginx/snippets/)
这样每个ConfigMap的体积都远低于Kubernetes的默认限制(1MB),就能顺利导入新的Ingress控制器了。
备注:内容来源于stack exchange,提问作者zerobit

