Nginx 反向代理时传递客户端信息至后端服务
当 Nginx 作为反向代理服务器时,传递客户端信息给后端服务是至关重要的。这些信息包括客户端的 IP 地址、HTTP 方法、请求路径等,对于后端的日志记录、统计分析、安全控制等方面都有重要作用。以下是在 Nginx 中配置这一过程的具体方法:
1. 传递原始客户端 IP
默认情况下,Nginx 使用 remote_addr 变量保存客户端的真实 IP。但当你使用反向代理时,这个信息会被代理服务器的 IP 替代。要将真实 IP 传递给后端,可以使用 X-Real-IP 或 True-Client-IP 头部:
location / {
proxy_pass http://backend_service;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header True-Client-IP $remote_addr;
}
2. 传递完整请求 URI
有时候,后端服务可能需要知道完整的请求 URI,包括查询字符串。这可以通过 X-Original-URI 或 X-Request-URI 头部完成:
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Request-URI $uri;
注意区别:$request_uri 包括查询字符串,而 $uri 不包括。
3. 传递 HTTP 方法
后端服务可能依赖于原始的 HTTP 方法来处理请求,可以使用如下指令:
proxy_set_header X-Method $request_method;
4. 用户代理和其他 HTTP 头
除了 IP 和方法之外,还可以传递诸如 User-Agent 这样的重要信息:
proxy_set_header User-Agent $http_user_agent;
5. 传递 HTTPS 信息
如果前端使用的是 HTTPS,后端可能也需要了解这一点:
proxy_set_header X-Forwarded-Proto $scheme;
6. 其他 HTTP 头部
任何客户端发送的头部都可以被传递给后端,只需用 proxy_set_header:
proxy_set_header Host $http_host;
proxy_set_header Accept-Language $http_accept_language;
7. 使用变量传递信息
有时你可能需要根据条件设定头部,或者创建自己的自定义头部:
set $client_type "mobile";
if ($http_user_agent ~* (Android|iPhone)) {
set $client_type "smartphone";
}
proxy_set_header X-Client-Type $client_type;
注意事项
- 当转发请求到多个后端时,务必确认头部不会导致歧义或安全风险。
- 在传递敏感信息时,确认后端有足够的安全措施。
- 适时清理不必要的头部,减少带宽消耗和处理开销。
通过上述配置,Nginx 可以有效地将客户端的信息透明地传递给后端服务,使后端能够像直接接收来自客户端的请求一样工作,从而实现实时、准确的日志记录、权限控制等功能。