You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

蓝绿部署场景下超大型Nginx.conf配置文件的精简方案及导入新Ingress控制器的方法

蓝绿部署场景下超大型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:38:01