ASP.NET应用使用Nginx做负载均衡遇到的一个问题
客户在使用我们的某个应用遇到了性能瓶颈,于是决定增加多个节点减轻单节点的压力。部署方案:
1台Nginx服务器
2台应用服务器,每台两个站点(一个应用创建两个IIS站点、不同端口号)
Nginx的配置如下:
http {
upstream clusterservice {
server 10.x.x.181:9001;
server 10.x.x.181:9002;
server 10.x.x.187:9001;
server 10.x.x.187:9002;
ip_hash;
}
server {
server_name xxx;
listen 10087;
location / {
proxy_pass http://clusterservice;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
很常见的Nginx配置,但问题发生了。由于我们有一个负责单点登录的网站,当用户首次访问我们的应用时候它会跳转到单点登录站点,重定向到单点登录的时候在请求中会新增一个名称为ActionUrl的参数,这个参数使用了HttpRequest.Url的值。我们期望的重定向地址:http://sso.xxx.com/SignOn.aspx?actionUrl=http://xxx:10087/。实际情况是获取到的请求地址它的端口使用了本地端口,并不是我们期望的10087。实际的重定向地址:http://sso.xxx.com/SignOn.aspx?actionUrl=http://xxx:9001/。
反编译System.Web.dll查看HttpRequest的Url属性内部实现到底是如何产生这个地址,发现了解决方案。下面是其内部实现代码:
internal Uri BuildUrl(Func<string> pathAccessor)
{
Uri uri = null;
string text = QueryStringText;
if (!string.IsNullOrEmpty(text))
{
text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text, QueryStringEncoding);
}
if (AppSettings.UseHostHeaderForRequestUrl)
{
string knownRequestHeader = _wr.GetKnownRequestHeader(28);
try
{
if (!string.IsNullOrEmpty(knownRequestHeader))
{
uri = UriUtil.BuildUri(_wr.GetProtocol(), Uri.UnescapeDataString(knownRequestHeader), null, pathAccessor(), text);
}
}
catch (UriFormatException)
{
}
}
if (uri == (Uri)null)
{
string text2 = _wr.GetServerName();
if (text2.IndexOf(':') >= 0 && text2[0] != '[')
{
text2 = "[" + text2 + "]";
}
uri = UriUtil.BuildUri(_wr.GetProtocol(), Uri.UnescapeDataString(text2), _wr.GetLocalPortAsString(), pathAccessor(), text);
}
return uri;
}
我们发现可以通过在Web.config的appSettings节点新增一个键值让它使用“Host”标头提供的主机和端口作为动态请求地址,而不是默认的Web服务器。如下:
<appSettings>
<add key="aspnet:UseHostHeaderForRequestUrl" value="true" />
</appSettings>
ASP.NET应用使用Nginx做负载均衡遇到的一个问题的更多相关文章
- 使用nginx做负载均衡的session共享问题
查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不 ...
- nginx做负载均衡配置文件
nginx做负载均衡是在反向代理的基础上做的,代码如下: ## Basic reverse proxy server ## ## Apache backend for www.baidu.com ## ...
- nginx做负载均衡和tomcat简单集群
Nginx做负载均衡和TOMCAT简单集群 1.下载安装nginx及其依赖包 ...
- 死磕nginx系列--使用nginx做负载均衡
使用nginx做负载均衡的两大模块: upstream 定义负载节点池. location 模块 进行URL匹配. proxy模块 发送请求给upstream定义的节点池. upstream模块解读 ...
- K2使用Nginx做负载均衡
K2使用Nginx做负载均衡 K2目前是支持Load Balancing这种方式,来做负载均衡,也可以使用F5来做负载均衡,但这次我使用nginx来实现K2的负载均衡 下载nginx 请下载nginx ...
- 解决docker中使用nginx做负载均衡时并发过高时的一些问题
# 解决docker中使用nginx做负载均衡时并发过高时的一些问题 1.问题产生原因: 由于通过nginx作为负载均衡服务,在访问并发数量达到一定量级时jmeter报错. nginx日志关键信息:a ...
- 消费者用nginx做负载均衡,提供者用zookeeper自带功能实现负载均衡
公司的项目基于阿里的Dubbo微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现Dubbo的分布式服务 ...
- .net大型平台通过Nginx做负载均衡(Web层、中间服务层、DB层)
.net平台下,我目前部署过的均衡负载有两种方式(iis7和Nginx),以下以Nginx为例讲解web层的均衡负载. 简介:Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx ...
- nginx做负载均衡 tomcat获得客户端真实ip
因项目需要做tomcat2台机器的负载均衡,配置好负载环境后,发现tomcat的日志一律是我前置nginx代理服务器的ip 通过百度教材发现需要修改nginx的配置文件,修改代理头信息,传递给后方,后 ...
随机推荐
- SpringBoot自定义线程池处理异步任务
@Async异步调用 就不解释什么是异步调用了,Spring Boot中进行异步调用很简单 1.通过使用@Async注解就能简单的将原来的同步函数变为异步函数 package com.winner.s ...
- Windows下Phalcon的安装以及phpstorm识别phalcon语法及提示
1.由于Phalcon是C语言写的一个扩展,所以需要安装这个扩展php_phalcon.dll,下载地址https://github.com/phalcon/cphalcon/releases, 然后 ...
- DNS的域名的解析解决办法(openDNS)
http://www.williamlong.info/archives/1101.html
- TF_Server gRPC failed, call return code:8:Received message larger than max (45129801 vs. 4194304)
tensorflow_serving 遇到错误:gRPC failed, call return code:8:Received message larger than max (45129801 v ...
- 新课程网上选课系统V1.0—适用于中小学校本课程选课、选修课选课
学校要开设选修课,人工选课实施了两年,耗时耗力,于是打算用网上选课,在网上搜索了一番,没多少实用的,有一个网上用的比较多的,功能太简单了,于是打算自己开发一个,功能参考了部分学校的功能,也有基于Aja ...
- Mysql INSERT、REPLACE、UPDATE的区别
用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSE ...
- System Monitor for Mac(系统监控工具)破解版安装
1.软件简介 System Monitor 是 macOS 系统上的一款非常实用的 Mac 系统工具,System Monitor for mac 是一款六合一应用,您可以同时获得 CPU.RA ...
- MDK-ARM输出HEX文件重命名设置
输出的可执行文件和库的名称就是在这里定义.比如我们常见输出Hex文件,其名称就是这里定义的.
- python gb2312 转换为 utf-8
url = "" headers = { "Host":"www.chinanews.com", "User-Agent" ...
- C#-MVC开发微信应用(5)--自动应答系统-自动回复机器人
前几篇已经介绍菜单和有回复信息操作,下面我们就结合snf微信端管理页面,看一下什么才是自动应答系统. 定制的服务 对于微信服务号来说,最主要的功能是提供更好的服务.用户更方便的操作,以及更快的反馈响应 ...