• 博客访问: 447127
  • 博文数量: 110
  • 博客积分: 660
  • 博客等级: 上士
  • 技术积分: 1786
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 11:39
文章分类

全部博文(110)

文章存档

2017年(49)

2016年(7)

2015年(3)

2014年(3)

2013年(31)

2012年(2)

2011年(1)

2006年(1)

2005年(13)

微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题

分类: 系统运维

nginx一例http请求被强制转到https的故障及解决

故障现象

某个域名下的http请求都被nginx转发到https端口,并在日志里面报400错误

初步检查

  • 出错之前的操作

    中午吃饭时收到某云的安全通知:nginx的1.12.0版本有个安全漏洞,于是下午升级到1.12.1,升级过程中保持nginx的配置文无改动

  • 检查错误日志,发现日志有些访问是返回200的,看来不是所有请求都被400了

  • 检查后端tomcat,发现无日志被处理,说明nginx没有转发请求过来,那么由此判断此问题基本出在nginx上

尝试修复

  • 仔细审查配置文件,因升级之前nginx的配置文件都做了备份,再次恢复备份,重启nginx,故障依旧。
  • 降级nginx到1.12.0故障依旧。。。。。。

求助google

  • ssl on 指令

    该指令会开启所在sever{}段落内的ssl,也就是https,即使server{}段落内的listen指令监听的80端口也会启用ssl,于是检查配置文件发现http和https用了一个server{}段落,看来有点眉目,如下所示server { listen 80; server_name some.some.cn ; listen 443; ssl on; }

  • listen 指令

    该指令nginx内部的级别高于server{}段落的,因为listen的无论tcp或者udp端口,都是4层协议,nginx解析的时候优先于7层的协议http的。

  • include conf.d/*.conf的加载顺序

    如果listen指令未配置default_server,那么加载的顺序决定着第一个出现的server{}段落成为默认的server{}段落,那么该段落如果有ssl on指令,就会在具有相同listen ip:port指令的 server{}段落内生效

解决及验证过程

  • 分开配置http和https的server{}段落
  • 指定具体的server{}段落 为 default_server 
  • 具体配置示例如下
## http 
server {
  listen    80 default_server;
  server_name   some.some.cn ;
  ......
  }
## https
server {
  listen    443;
  server_name   some.some.cn ;
  ssl on
  ......
  }
  • 重启nginx后,故障消失

致谢及参考

http请求被转成https请求并报400错误 #854

Dealing with nginx 400 “The plain HTTP request was sent to HTTPS port” error

阅读(228) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册