Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip

场景

线上环境使用Nginx(安装在宿主机)+Docker进行部署,应用获取客户端ip地址不正确,获取客户端IP的代码为Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()

过程还原

搭建一个webapi示例环境

创建一个新项目

dotnet new webapi -o getRealClientIp

修改模板中的ValuesControllerGet方法

// GET api/values
[HttpGet]
public ActionResult<string> Get()
{
return this.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
}

容器相关配置

docker-compose.yml

version: '2'
services:
web:
image: microsoft/dotnet:2.1-aspnetcore-runtime
volumes:
- ./publish:/app #站点文件
command: dotnet /app/getRealClientIp.dll
ports:
- "5000:80"
networks:
test:
ipv4_address: 172.200.0.101
nginx:
image: nginx
networks:
test:
ipv4_address: 172.200.0.102
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro # nginx配置文件
ports:
- "5001:80"
networks:
test:
ipam:
config:
- subnet: 172.200.0.0/16
gateway: 172.200.0.1

nginx.conf

http {
server {
listen 80;
access_log off;
location / {
proxy_pass http://172.200.0.101:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
}
}
events {
worker_connections 1024;
}

运行查看效果

运行
dotnet publish -c Release -o ./publish #编译
docker-compose up #运行容器
直接访问站点
curl http://localhost:5000/api/values
172.200.0.1

返回的ip地址172.200.0.1是配置的容器的网关地址,能获取到正确的ip

访问通过nginx代理的地址
curl http://localhost:5001/api/values
172.200.0.102

返回的ip地址172.200.0.102是nginx容器的地址,没有获取到正确的ip

上面的nginx配置已经相关的转发参数,并且该参数配置之前能正常运行在php的环境;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

推断必须修改 asp.net core 相关代码,才能获取到真实的客户端ip地址,一番google之后,

修改代码如下
// GET api/values
[HttpGet]
public ActionResult<string> Get()
{
var ip = this.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (string.IsNullOrEmpty(ip))
{
ip = this.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
}
return ip;
}

重新编译运行

dotnet publish -c Release -o ./publish #编译
docker-compose up #运行容器 curl http://localhost:5001/api/values
172.200.0.1 curl http://localhost:5000/api/values
172.200.0.1

直接访问和通过nginx代理访问返回的ip地址均为172.200.0.1,获取正确。

结论

asp.net core 使用 Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()获取客户端ip,不会自动取Header中X-Forwarded-For的值,需求单独处理。

参考资料

Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip的更多相关文章

  1. Docker容器环境下ASP.NET Core Web API

    Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...

  2. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  3. docker部署angular和asp.net core组成的前后端分离项目

    最近使用docker对项目进行了改进,把步骤记录一下,顺便说明一下项目的结构. 项目是前后端分离的项目,后端使用asp.net core 2.2,采用ddd+cqrs架构的分层思想,前端使用的是ang ...

  4. 使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序

    本文于2019年04月10日将标题「CentOS7 部署 ASP.NET Core应用程序」修改为「使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序」. 环境准备 VMwa ...

  5. Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  6. 在Linux和Windows的Docker容器中运行ASP.NET Core

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott H ...

  7. Docker容器中运行ASP.NET Core

    在Linux和Windows的Docker容器中运行ASP.NET Core 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了. ...

  8. 001/Nginx高可用模式下的负载均衡与动静分离(笔记)

    Nginx高可用模式下的负载均衡与动静分离 Nginx(engine x)是一个高性能的HTTP和反向代理服务器,具有内存少,并发能力强特点. 1.处理静态文件.索引文件以及自动索引:打开文件描述符缓 ...

  9. Apache Spark技术实战之8:Standalone部署模式下的临时文件清理

    未经本人同意严禁转载,徽沪一郎. 概要 在Standalone部署模式下,Spark运行过程中会创建哪些临时性目录及文件,这些临时目录和文件又是在什么时候被清理,本文将就这些问题做深入细致的解答. 从 ...

随机推荐

  1. 迎国庆 itest(爱测试) 4.1.0 发布,开源BUG 跟踪管理 & 敏捷测试管理软件

    v4.1.0 下载地址 :itest下载 itest 简介:查看简介 在线体验 https://itest.work/demo/ V4.1.0 根据用户反馈,共增加了23个更新:其中有11个功能增强和 ...

  2. day73_10_18视图家族与序列化的传参。

    一.序列化传参 在视图类中实例化序列对象时,还有一个参数为context,这个参数是存放字典,将所有从前端传来的数据传输到序列化中,比如需要在序列化中校验当前用户. 传入的request参数也是一个对 ...

  3. Linux上发布E卡通项目

    Linux上发布E卡通项目 使用的命令 ps -ef | grep java kill -9 22314 nohup java -jar smartcard-ms-0.0.1-SNAPSHOT.jar ...

  4. ES2019 的新特性

    JavaScript 不断演变,每次迭代都会得到一些新的内部更新.让我们来看看 ES2019 有哪些新的特性,并加入到我们日常开发中 Array.prototype.flat() Array.prot ...

  5. 在线web软件

    编程 Compiler Explorer SharpLab 着色器 shadertoy 腾讯文档 word  excel  ppt ... 思维导图 MindMaster ProcessOn 流程图. ...

  6. 【Java语言特性学习之五】版本差异新特性

  7. 物联网架构成长之路(45)-容器管理平台Rancher

    0.前言 按照上一篇博客,我已经把需要下载的rancher docker 依赖镜像下载上传到Harbor了. 1. 安装 执行如下,实现一键安装 docker run -d --restart=unl ...

  8. kettle文件输入 通配符匹配多个文件

    写法:采用正则表达式写法,例如:.*\.txt,记得要先点“确定”在打开点“显示文件名”  有时候未保存所以显示不出来

  9. nginx rewrite重写规则简明笔记

    nginx rewrite重写规则简明笔记 比方说http://newmiracle.cn/?p=888我要改成能这个访问http://newmiracle.cn/p888/ 首先用正则获取888 ^ ...

  10. 明解C语言 中级篇 第二章答案

    练习2-1 /* 倒计时后显示程序运行时间 */ #include <time.h> #include <stdio.h> /*--- 等待x毫秒 ---*/ int slee ...