Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip
Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip
场景
线上环境使用Nginx(安装在宿主机)+Docker进行部署,应用获取客户端ip地址不正确,获取客户端IP的代码为Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()
过程还原
搭建一个webapi示例环境
创建一个新项目
dotnet new webapi -o getRealClientIp
修改模板中的ValuesController
的Get
方法
// 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的更多相关文章
- Docker容器环境下ASP.NET Core Web API
Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...
- Docker容器环境下ASP.NET Core Web API应用程序的调试
本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...
- docker部署angular和asp.net core组成的前后端分离项目
最近使用docker对项目进行了改进,把步骤记录一下,顺便说明一下项目的结构. 项目是前后端分离的项目,后端使用asp.net core 2.2,采用ddd+cqrs架构的分层思想,前端使用的是ang ...
- 使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序
本文于2019年04月10日将标题「CentOS7 部署 ASP.NET Core应用程序」修改为「使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序」. 环境准备 VMwa ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- 在Linux和Windows的Docker容器中运行ASP.NET Core
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott H ...
- Docker容器中运行ASP.NET Core
在Linux和Windows的Docker容器中运行ASP.NET Core 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了. ...
- 001/Nginx高可用模式下的负载均衡与动静分离(笔记)
Nginx高可用模式下的负载均衡与动静分离 Nginx(engine x)是一个高性能的HTTP和反向代理服务器,具有内存少,并发能力强特点. 1.处理静态文件.索引文件以及自动索引:打开文件描述符缓 ...
- Apache Spark技术实战之8:Standalone部署模式下的临时文件清理
未经本人同意严禁转载,徽沪一郎. 概要 在Standalone部署模式下,Spark运行过程中会创建哪些临时性目录及文件,这些临时目录和文件又是在什么时候被清理,本文将就这些问题做深入细致的解答. 从 ...
随机推荐
- Onenote添加代码
使用Onenote做笔记的时候,是没有直接插入代码的,但是如果可以插入的话很方便. 这个是我找的一个参考,照这个来就行. 参考链接: https://www.cnblogs.com/two-peanu ...
- jmeter判断请求响应时间,请求下加‘断言持续时间’,添加监听器断言结果;统计超时
- 【转】gdb的调试与使用
转载自:https://www.jianshu.com/p/7a06b0bda2d8 gdb的调试与使用 这篇应该是我见过的总结最详细的gdb调试指南了,这位博主是个很强的人,他的博客对萌新比较友好, ...
- Linux学习(五)远程登录
Linux一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的Linux服务器. 这时我们就需要远程登录到Linux服务器来管理维护系统. Linux系统中是通过ssh服务实现的远程登录功 ...
- TestNG.xml 配置
<packages>表示以测试类所在的包的方式定义测试用例,包中的所有测试类都被涉及,粒度较大. <?xml version="1.0" encoding=&qu ...
- 基于Nginx和openssl实现https
[root@localhost ssl]# yum -y install openssl [root@localhost ssl]# mkdir /usr/local/nginx/conf/ssl/ ...
- SDOI2019退役记
\(update:2019-8-15\) 这个坑占了四个月,不填上终归不太好,也不甘心.日子久了,记不太清了,您就当瞧个乐吧. \(Day \ 0\) 下午来到山师大领准考证,晚上一点前就睡了觉. \ ...
- mysql 8.0 group by 不对的问题
select version(),@@sql_mode;SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
- OpenGL入门1.1:窗口
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 测试GLFW 在我们的test.cpp中加入下面两个头文件 #include <glad/glad.h> #inclu ...
- 单独KafkaConsumer实例and多worker线程。
1.单独KafkaConsumer实例and多worker线程.将获取的消息和消息的处理解耦,将消息的处理放入单独的工作者线程中,即工作线程中,同时维护一个或者若各干consumer实例执行消息获取任 ...