Nginx如何封装通用Header配置实现复用减少代码冗余
Nginx原生配置不支持你写的set_s3_headers()这类自定义函数的定义、调用语法,但可以通过两种官方原生方案实现等价的配置复用,完全消除重复代码:
方案1:利用配置继承规则,将公共配置放在上层块
Nginx配置遵循层级继承逻辑,如果你所有S3代理的location都归属同一个server块,可以把公共的代理、Header配置直接写到server层级,下属location会自动继承这些配置,仅需要单独编写每个路径差异化的proxy_pass等配置即可。
示例写法:
server { listen 443 ssl; server_name your-domain.com; # 所有S3代理共用的公共配置,写在server层自动向下继承 resolver 8.8.8.8; proxy_http_version 1.1; proxy_redirect off; proxy_set_header Connection ""; proxy_set_header Authorization ''; proxy_set_header Host $bucket; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-request-id; proxy_hide_header x-amz-meta-server-side-encryption; proxy_hide_header x-amz-server-side-encryption; proxy_hide_header Set-Cookie; proxy_ignore_headers Set-Cookie; add_header Cache-Control max-age=31536000; proxy_intercept_errors on; location = /1 { proxy_pass https://$bucket/1; } location = /0 { proxy_pass https://$bucket/0; } }
注意:
proxy_set_header、add_header这类数组型指令存在继承覆盖特性:如果在location块中单独定义了任意一条同类型指令,上层块中定义的所有同类型指令都会失效,需要在location中重新补全所有需要保留的配置。
方案2:使用include指令抽离公共配置片段(和你预期的函数调用效果完全一致)
如果你的S3代理路径分散在不同server块,或者需要跨多个配置文件复用这套规则,用Nginx原生的include指令就能实现和自定义函数几乎无差的使用体验:
- 新建独立的配置片段文件,比如存为
/etc/nginx/snippets/s3_common.conf,把所有公共配置写入该文件:resolver 8.8.8.8; proxy_http_version 1.1; proxy_redirect off; proxy_set_header Connection ""; proxy_set_header Authorization ''; proxy_set_header Host $bucket; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-request-id; proxy_hide_header x-amz-meta-server-side-encryption; proxy_hide_header x-amz-server-side-encryption; proxy_hide_header Set-Cookie; proxy_ignore_headers Set-Cookie; add_header Cache-Control max-age=31536000; proxy_intercept_errors on; - 在需要使用这套配置的
location块中,直接通过include引入该片段即可:location = /1 { include snippets/s3_common.conf; proxy_pass https://$bucket/1; } location = /0 { include snippets/s3_common.conf; proxy_pass https://$bucket/0; }
include是Nginx原生支持的标准指令,本质是加载配置时把引用文件的内容原封不动插入到对应位置,没有额外性能损耗,是生产环境减少配置冗余的通用做法。
内容的提问来源于stack exchange,提问作者madu
相关产品推荐
相关产品推荐

