Nginx反向代理HTTPS CDN 配置检查清单(避坑版)
适配场景:主站通过Nginx反向代理CDN加载图片/静态资源(如你的 picdn.yuming.com 场景),兼顾「可用性、安全性、性能」,对照检查即可避免90%以上问题。
一、核心必配项(缺一不可,解决502/SSL握手失败)
| 配置项 | 必配/可选 | 正确示例 | 作用 | 错误后果 |
|---|
| proxy_pass | 必配 | proxy_pass https://picdn.yuming.com; | 指定CDN后端地址(HTTPS协议) | 协议写错(如http)会导致SSL报错;正则location拼接$request_uri可能导致路径重复 |
| proxy_ssl_server_name | 必配 | proxy_ssl_server_name on; | 开启SNI,向CDN传递目标域名 | 未开启则CDN返回默认证书,SSL握手失败(502) |
| proxy_set_header Host | 必配 | proxy_set_header Host picdn.yuming.com; | 告诉CDN“当前请求的域名是picdn” | 传递主站域名(如www.yuming.com)会导致CDN防盗链拦截/证书不匹配 |
| 代理协议一致性 | 必配 | 主站→CDN全程HTTPS | 避免HTTP→HTTPS跳转导致的资源失效 | 主站HTTPS、代理用HTTP会触发混合内容错误,或CDN防盗链拒绝 |
二、SSL安全与兼容优化项(推荐配置,避免兼容/安全风险)
| 配置项 | 必配/可选 | 正确示例 | 作用 | 注意事项 |
|---|
| proxy_ssl_protocols | 推荐 | proxy_ssl_protocols TLSv1.2 TLSv1.3; | 限制SSL协议版本,避免旧协议漏洞 | 不建议包含TLSv1.1及以下(安全风险),需与CDN支持的协议匹配 |
| proxy_ssl_verify | 可选 | 测试:off;生产:on | 验证CDN的SSL证书有效性 | 测试阶段关闭可快速排除证书链问题;生产开启需确保CDN证书完整(含中间证书) |
| proxy_ssl_connect_timeout | 推荐 | proxy_ssl_connect_timeout 10s; | 限制SSL握手超时时间 | 超时过短(如3s)可能误触发失败,过长(如30s)会导致用户等待久 |
| proxy_ssl_ciphers | 推荐 | proxy_ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; | 指定安全的加密套件 | 与CDN支持的加密套件对齐,避免弱加密算法 |
三、代理性能优化项(可选,提升响应速度)
| 配置项 | 必配/可选 | 正确示例 | 作用 |
|---|
| proxy_http_version | 推荐 | proxy_http_version 1.1; | 启用HTTP/1.1,支持长连接、Chunked编码 |
| proxy_connect_timeout | 推荐 | proxy_connect_timeout 15s; | 限制Nginx与CDN的连接超时 |
| proxy_read_timeout | 推荐 | proxy_read_timeout 30s; | 限制Nginx读取CDN响应的超时 |
| proxy_buffer_size | 推荐 | proxy_buffer_size 16k; proxy_buffers 4 64k; | 优化响应缓冲区,减少延迟 |
| proxy_cache / proxy_buffering | 可选 | 静态资源:proxy_cache off; proxy_buffering off; | 禁止Nginx缓存,确保请求透传CDN(如需缓存可自定义规则) |
四、浏览器缓存与跨域配置(按需配置)
| 配置项 | 必配/可选 | 正确示例 | 作用 | 适用场景 |
|---|
| expires | 推荐 | expires 7d; | 设置浏览器缓存时间 | 图片、静态资源(更新频率低) |
| Cache-Control | 推荐 | add_header Cache-Control "public, max-age=604800, immutable"; | 强化缓存策略,避免重复验证 | 配合expires使用,immutable防止浏览器强制刷新 |
| Access-Control-Allow-Origin | 可选 | add_header Access-Control-Allow-Origin "*"; 或指定域名 | 允许跨域访问 | 图片需被其他域名引用时开启(如主站多个子域名共用CDN) |
| Vary | 可选 | add_header Vary "Origin"; | 优化跨域缓存,避免缓存污染 | 开启CORS后建议配置 |
五、CDN侧配合配置(必须同步检查,否则代理无效)
| 检查项 | 正确配置 | 错误后果 |
|---|
| SNI域名绑定 | CDN已添加picdn.yuming.com作为SNI域名,且绑定对应SSL证书 | 未绑定则CDN无法识别域名,返回默认证书(502) |
| 证书完整性 | CDN证书包含完整链(服务器证书+中间证书),且未过期 | 证书链不完整会导致Nginx验证失败(proxy_ssl_verify=on时502) |
| 防盗链设置 | 允许主站IP(服务器公网IP)或主站域名(www.yuming.com)访问 | 未放行则CDN拒绝代理请求(403→Nginx返回502) |
| 路径有效性 | CDN已同步主站图片路径(如/uploads/attach/…),直接访问CDN路径正常 | CDN路径不存在会导致404,代理后显示主站404页面 |
六、安全防护项(避免漏洞,推荐配置)
| 配置项 | 正确示例 | 作用 |
|---|
| 禁止敏感文件代理 | `location ~* .(php | jsp |
| 限制请求方法 | `if ($request_method !~ ^(GET | HEAD)$) { return 405; }` |
| 隐藏Nginx版本 | server_tokens off; | 减少服务器信息泄露,降低攻击风险 |
七、快速排查工具与命令(遇到问题先执行)
- 测试服务器到CDN的连通性(检查网络/防火墙):
curl -v --resolve picdn.yuming.com:443:CDN节点IP https://picdn.yuming.com/你的图片路径
curl -v https://picdn.yuming.com/你的图片路径
- 查看Nginx错误日志(定位502/SSL错误原因):
tail -f /www/wwwlogs/new.yuming.com.error.log
- 验证Nginx配置语法(修改后必查):
/www/server/nginx/sbin/nginx -t
- 重启Nginx(配置生效):
/www/server/nginx/sbin/nginx -s reload
八、常见错误-配置对应表(快速定位)
| 现象 | 大概率缺失的配置 | 修复动作 |
|---|
| 主站图片502,CDN直接访问正常 | proxy_ssl_server_name on | 添加该配置,开启SNI |
| 代理后图片403 | CDN防盗链未放行主站IP/域名 | 在CDN侧添加主站IP到白名单 |
| SSL handshake failed错误 | proxy_ssl_protocols不兼容/证书链不完整 | 调整协议版本,或关闭proxy_ssl_verify测试 |
| 图片路径重复(如//uploads/…) | proxy_pass拼接了$request_uri | 正则location下删除$request_uri,仅保留CDN域名 |
| 跨域访问图片报错(CORS) | 未配置Access-Control-Allow-Origin | 按需添加跨域头 |