== 项目部署使用nginx配置转发后,会导致获取服务器本身ip、客户端ip都会有异常 ==
在FastAPI中,你可以通过请求的Remote IP地址来获取客户端的实际IP地址。但是,如果你的应用程序部署在负载均衡器后面,你可能会得到负载均衡器的IP地址。在这种情况下,你需要配置你的负载均衡器以转发原始的IP地址。
以下是一些常见的解决方案:
解决方案1:如果你使用的是Nginx作为负载均衡器,你可以在Nginx配置中添加以下设置:
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}
然后在FastAPI中,你可以使用以下代码获取真实IP:
from fastapi import FastAPI, Request
app = FastAPI()
@app.get("/")
async def main(request: Request):
return {"Client IP": request.headers.getlist("X-Forwarded-For")[0]}
解决方案2:如果你使用的是AWS的ALB(Application Load Balancer),你可以在ALB的配置中设置以下属性:
在"Listeners"标签页中,选择你的监听器,然后在"Advanced settings"中,勾选"Propagate client IP"。
然后在FastAPI中,你可以使用以下代码获取真实IP:
from fastapi import FastAPI, Request
app = FastAPI()
@app.get("/")
async def main(request: Request):
return {"Client IP": request.client.host}
解决方案3:如果你使用的是HAProxy作为负载均衡器,你可以在HAProxy的配置中添加以下设置:
frontend main *:5000
option forwardfor
然后在FastAPI中,你可以使用以下代码获取真实IP:
from fastapi import FastAPI, Request
app = FastAPI()
@app.get("/")
async def main(request: Request):
return {"Client IP": request.headers.get("X-Forwarded-For").split(",")[0]}
注意:在所有这些情况下,你都需要确保你的负载均衡器正确地转发了原始的客户端IP地址。如果你的应用程序部署在多层负载均衡器后面,你可能需要检查所有层级的负载均衡器是否都正确配置了客户端IP地址的转发。