该问题已解决

问题描述:

内部调试和验收环境用http协议,stg,生产环境用https协议;
stg和生产环境上Flask项目在没有修改代码的情况下重启后偶尔会出现访问异常的情况(内部调试和验收环境不存在)。
异常时访问接口,Flask日志正常,Nginx日志也正常。
IE,火狐均可正常访问到,唯独谷歌浏览器访问报错:

(falied) net::ERR_HTTP2_PROTOCOL_ERROR

部署环境:

centos
通过docker部署python flask项目;
容器 : Nginx,Flask项目,Redis,Mysql;
stg,生产环境用https协议;
内部调试和验收环境用http协议。

网上搜索了解到可能存在的问题

1.nginx反向代理;
2.谷歌浏览器本身问题;
3.http版本定义问题;

1.nginx反向代理问题

网上查询可能问题如下:

proxy_max_temp_file_size:这是每个请求能用磁盘上临时文件最大大小。这些当上游响应太大不能装配到缓冲区时被创建。

但是我的nginx配置本身是有这项的,故排除这个原因:

2.谷歌浏览器本身问题

没能认证

3.修改后端Nginx的http版本

注:nginx默认版本是1.1。指定为2.0版本

响应变成502

502 Bad Gateway是指错误网关,无效网关;在互联网中表示一种网络错误。表现在WEB浏览器中给出的页面反馈。
含义:这通常并不意味着上游服务器已关闭(无响应网关/代理) ,而是上游服务器和网关/代理使用不一致的协议交换数据。
鉴于互联网协议是相当清楚的,它往往意味着一个或两个机器已不正确或不完全编程。

以上处理方式都未能解决问题

问题解决思路如下:

1.查看正常和异常情况下火狐浏览器的response返回数据是否存在差异。

谷歌异常情况下,火狐的访问返回:

谷歌正常访问情况下,火狐的访问返回:

观察到:返回头中content-type:的值不同。

2.抓包

response header出现非法字符:illegal characters found in header name

application/json:Content-Type 被对调导致

3.查看代码

代码重构后的response返回是:[{\’Content-Type\’, \’application/json\’}]

而继承类中的数据类型是:[(“Content-Type”, “text/html; charset=utf-8”)]

找到原因:重构的类型定义成了集合类型,集合的特点是无序无重复,因为无序,所以再每次重启服务时,取值都会随机取,导致前后顺序颠倒。谷歌访问报错。

从中发现火狐,IE和谷歌对https response返回的处理机制不同,导致响应头部错误时,火狐和IE将错误放弃,设为初始值。而谷歌直接抛出错误。

http和https处理机制是否不同??

集合 和 元组的区别

·集合是包含若干元素的列表,元素无序且无重复元素
·元组是有序列表,元素不能修改

可变 有序
列表 ☑️ ☑️
元组 × ☑️
集合 ☑️ ×

版权声明:本文为ami-miao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ami-miao/p/15175129.html