我正在编写一个插件,将访问日志放入一个文件中,就像普通的Web服务器一样。作为客户端IP地址的数据源,conn
具有remote_ip
和peer
。我应该使用哪种,它们之间的区别是什么?
是否有任何文件描述conn
中的每个实体?
另外,我的插件就像下面的片段一样,从Elixir / Phoenix的角度来看是否自然?
Logger.info(
Enum.join([
"type:" <> "request",
"remoteip:" <> Enum.join(Tuple.to_list(conn.remote_ip), ","),
"method:" <> conn.method,
"path:" <> conn.request_path,
"status:" <> to_string(conn.status),
"size_res:" <> to_string(byte_size(to_string(conn.resp_body))),
], ",")
)
答案 0 :(得分:7)
来自Plug.Conn文档:
peer - 连接的实际TCP对等体,例如:{{127,0,0,1},12345}。通常这不是客户端的实际IP和端口,而是负载均衡器或请求路由器。
remote_ip - 客户端的IP,例如:{151,236,219,228}。该字段旨在被例如理解的插头覆盖。 X-Forwarded-For标头或HAProxy的PROXY协议。它默认为对等的IP。
如果您使用的是负载均衡器(例如http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/x-forwarded-headers.html),则peer
IP地址将引用负载均衡器而不是客户端。负载均衡器在标头(AWS的X-Forwarded-For
)中提供客户端的实际IP地址,该标头将作为remote_ip
存储在Plug.Conn结构中。