該問題已解決
問題描述:
內部調試和驗收環境用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處理機制是否不同??
集合 和 元組的區別
·集合是包含若干元素的列表,元素無序且無重復元素
·元組是有序列表,元素不能修改
可變 | 有序 | |
---|---|---|
列表 | ☑️ | ☑️ |
元組 | × | ☑️ |
集合 | ☑️ | × |