0.准备打coredumpnginx
ulimit -c ,我后面打的nginx的coredump有1.4M,是没有请求队列,无ssl等其余配置的状况后端
磁盘环境和内存空间够的状况下,浏览器
ulimit -c unlimited 一下吧,不限,打完了要用的coredump,记得设置回去,省得其余进程生成了coredump要耗死空间服务器
1. 打gcorecurl
gcore -o /var/log/corefile/ng5167 5167
2. 看coreurl
gdb ./nginx /var/log/corefile/ng5167.5167代理
3. gdbxml
打出当前堆栈信息 bt队列
进入当前层f1进程
set print pretty on 显示的好看点
..
要想看到生产上的真实变量,须要复制生产的全部配置文件到本地,打出那个coredump文件,而后,在本地gdb coredump的时候,执行run命令,请求能够模拟着发
本来的问题描述:
链路=C-N1-J-N2-S,C,S分别为客户端和服务端,N1,N2是两个ngnix集群,J是咱们本身的代理服务器
当C发出https请求时,N1会强行标记connection=close,这个标记,致使最终返回给N1的response里面的body内容错误(错误表现= chunk数据丢失chunk标志,N1报错说chunk解析错误)
C发出http请求,则无此现象,其余配置一致
结论:
1. 关于添加了close,原http和https中配置不一样,https中配置可能存在:http使用了1.0版本,或者chunk_encoding=off的设置。。可是,一样的配置reload以后,问题再也不现。 消费方咬定以前作过reload
怀疑极少数的master进程没有响应到HUP信号,致使reload其实没有生效
2. chunk数据格式丢失
J,N2,S都有可能干这种事情~~只要标记为connection=close,就会发生这个状况。且,消费方c发出的http仍是https的请求,只在链路C-N1时有区别,后端均是一致处理。
怀疑J,S中,某个httpclient在connection=close的状况下,没有组装chunk结构~nginx=N2,使用的版本是1.12.2较新,且适用范围广,且N2不会作加解密,body即使是chunk,也是透传的(还带考证)
重点怀疑J,S中的httpclient存在缺陷
/****************************************************************/
下面是不改URI,经过添加请求头,路由到不一样服务器的配置方法。
转发重写的配置
location /{
proxy_http_version 1.1;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto http;
if ($http_milina = "zj") {
proxy_pass http://zj;}
if ($http_milina = "lf") {
proxy_pass http://lf;}
}
如此便可,无需rewrite。。。实测有效
实测中还有另一个诡异问题,后来抓住了,
就是有的页面有代理~好比URL是A,实际展现的是A/index.xml这种状况,在NGINX作双层代理的状况下,
这个index.xml没法自动带出。。。curl或者浏览器直接调用就不会。。