nginx充当正向代理缓存网关需同时支持http/https代理与proxy_cache机制:默认不支持https正向代理,必须源码编译集成ngx_http_proxy_connect_module模块,并配置proxy_cache_path、proxy_cache等指令启用缓存,同时设置resolver、proxy_pass、proxy_connect_allow等实现完整代理功能。

要让 Nginx 充当正向代理缓存网关,核心是两件事:一是让它能代理客户端(内网服务器)发起的 HTTP/HTTPS 请求,二是对响应内容做有效缓存。默认 Nginx 不支持 HTTPS 正向代理,必须通过 ngx_http_proxy_connect_module 模块补全能力;缓存则依赖内置的 proxy_cache 机制,需合理配置路径、键值和过期策略。
编译安装带缓存与 HTTPS 支持的 Nginx
仅靠 yum/apt 安装的预编译包无法启用正向代理 HTTPS,必须源码编译:
- 安装基础依赖:
yum install -y gcc pcre-devel zlib-devel openssl-devel make - 下载 Nginx 源码(如 1.26.3)及
ngx_http_proxy_connect_module模块 - 打补丁并配置编译参数,关键项包括:
--with-http_ssl_module(必需)、--add-module=./ngx_http_proxy_connect_module(启用 CONNECT)、--with-http_proxy_module和--with-http_cache_module(缓存基础) - 执行
./configure && make && make install,安装到/usr/local/nginx
配置正向代理 + 缓存策略
在 nginx.conf 的 http 块中定义缓存区,并在 server 块中启用代理与缓存逻辑:
- 添加缓存区声明:
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=forward_cache:10m max_size=1g inactive=7d use_temp_path=off; - 配置监听端口(如 8080),启用 DNS 解析:
resolver 114.114.114.114 valid=30s; - 在
location /中设置:proxy_pass $scheme://$host$request_uri;proxy_cache forward_cache;proxy_cache_valid 200 302 10m;proxy_cache_valid 301 1h;proxy_cache_valid any 1m;proxy_set_header Host $http_host; - 对 HTTPS 流量,还需显式允许 CONNECT 方法并设超时:
proxy_connect_allow 443;proxy_connect_timeout 60s;
适配内网服务器使用习惯
内网服务器通常通过环境变量或工具配置代理,需确保其发出的请求能被正确识别和缓存:
- 设置
http_proxy=http://nginx-ip:8080和https_proxy=http://nginx-ip:8080(注意:部分工具要求 https_proxy 也用 http 协议) - 若下载的是二进制文件(如 rpm、deb、tar.gz),建议在
proxy_cache_key中加入$request_uri和$scheme,避免因 User-Agent 或 Accept 头不同导致重复缓存 - 对 Maven、npm、pip 等包管理器,可额外加
proxy_buffering on;和增大proxy_buffers,防止大文件传输中断 - 缓存目录权限设为
nginx:nginx,并确保磁盘有足够空间
验证与日常维护
配置生效后,重点确认缓存是否真正起作用:
- 首次请求某 URL(如
curl -x http://nginx-ip:8080 https://repo.example.com/pkg.tar.gz),观察/var/log/nginx/access.log中状态码和响应头 - 第二次请求相同地址,检查响应头是否含
X-Cache: HIT(需在配置中添加add_header X-Cache $upstream_cache_status;) - 定期清理过期缓存:
find /var/cache/nginx/proxy_cache -type f -mtime +7 -delete,或依赖inactive参数自动淘汰 - 监控缓存命中率:
nginx -s reload后用curl http://localhost:8080/nginx_status(需开启 stub_status)











