最有效测试方式是直接在不同server块中配置互斥黑白名单并用真实IP请求验证:白名单站点仅允192.168.50.100(其余403),黑名单站点拒192.168.50.200(其余200),需带Host头、分设日志、HTTPS需单独配置ssl块。

直接在不同 server 块中配置互斥规则,用真实客户端 IP 发起请求并观察响应状态码,是最有效、最贴近生产环境的测试方式。
准备两个隔离的虚拟主机
确保它们使用不同的 server_name(如 admin.example.com 和 api.example.com),且各自 server 块内独立配置黑白名单:
- 白名单站点:只允许 192.168.50.100,其余全拒
- 黑名单站点:明确拒绝 192.168.50.200,其余放行
- 两个配置不能共用 location 或写在 http 全局层,否则会互相干扰
用 curl 模拟不同来源请求
在可控制源 IP 的机器上执行(或通过代理/不同终端):
-
curl -H "Host: admin.example.com" http://your-nginx-ip/health→ 应返回 200(若来自 192.168.50.100)或 403(其他 IP) -
curl -H "Host: api.example.com" http://your-nginx-ip/health→ 来自 192.168.50.200 时返回 403,其他 IP 返回 200 - 关键点:必须显式带
-H "Host:",否则 Nginx 无法路由到对应server块
验证日志是否分离记录
为每个 server 块配置独立 access_log:
access_log /var/log/nginx/admin.access.log main;access_log /var/log/nginx/api.access.log main;- 发起测试请求后,检查两个日志文件是否各自只记录本域名的访问,且被拦截的请求也分别出现在对应日志中(可通过
$status字段确认 403 条目)
检查 HTTPS 场景下是否同样隔离
如果启用了 SSL,需确认:
- HTTP 和 HTTPS 的
server块是分开定义的 - 黑白名单配置已分别复制到
listen 443 ssl的块中(Nginx 不会自动继承) - 用
curl -k -H "Host: admin.example.com" https://your-nginx-ip/health再测一次,结果应与 HTTP 一致











